ブループリントでプレイ時間を「時間:分:秒」で表示させる方法

結論 ブループリント

上の図はブループリント全体の処理です。下の図では正確ではないブループリントの失敗例です。

解説

計算方法

ポイント1 商と余り

ブループリントの計算では、プレイ時間(秒)例えば「 7256秒 」から時間(Hour)分(Minutes)秒(Seconds)に分解する計算が必要になります。

その計算では60で割った 商と余り を駆使して算出することになります。
(例)65 ÷ 60 = 1 余り 5 の計算で、割った数「1」の正式名称は 商(しょう) です。
● 商(しょう):割り算をした結果の整数部分。つまり、割った数が何回完全に入るかを示します
● 余り(あまり):割り算の結果、割り切れなかった残りの部分です。
65 ÷ 60 の場合、商は「1」で、余りは「5」となります。

ポイント2 モジューロ(%)ノード

モジューロ(%)数値では割った数の余りを出力してくれます。
(例)65%60 = 1+余り5 = 5を出力

ポイント3 Truncate(トランケイト)

Truncateでは小数点以下を切り捨てます
(例)3.7 をTruncateすると = 3 の整数値になります。

ポイント4 ToText(float)では四捨五入される

割り算した時間(Hour)と分(Minutes)を直接 ToText(float) ノードで表示させると四捨五入されてしまいます。例でいうと 3.7 は 4 と表示されてしまい、正確な「時間:分:秒」表示ができません。

ポイント5 割り算・余りの整数値部分を取得する

各計算で得られた商と余りの整数値部分を四捨五入せずに取得するのが正確な時間の取得を可能にします。各ノードで四捨五入されないように注意して整数値部分を取得しましょう。

 



 

具体例で解説

具体的な数値、プレイ時間を7256秒= 2:0:56 2時間0分56秒 を例に計算の流れを見ていきましょう。

時間(Hour)の計算

シンプルにプレイ時間を3600で割った時の商の値の整数部分です。
[ 7256÷60=2+余り56=2.01555 ]

分の計算

表示形式が「 時間:分:秒 」なので、プレイ時間から時間(Hour)を引いた残りの部分を60で割った時の余りになります。

プレイ時間を60で割ります。[ 7256÷60=120+余り56=120.933 ]
商である120の部分は時間なので、残った余り56(0.933)が分になります。
プレイ時間を60で割った値の分(Minutes)(120.933)をモジューロ(%)60すると = 2+0.933で余り0.933の整数値部分が分(Minutes)になります。
余りの整数値部分=0が分(Minutes)になります。
四捨五入されると1になり正確な分を表示することができません。

秒の計算

プレイ時間の余りです。
[ 7256÷60=2+余り56=2.01555 ]

分と違い四捨五入されても正確なプレイ時間の秒の値になります。
実は間違ってるかも?誤差が有っても1秒なので気が付かないだけかも?
より正確にしたい場合はTruncate処理を入れると良いでしょう。
(結論の図ではTruncateしたものに差し替えました。)

 



 

GetRealTimeSecondsを使いたい場合

最初の図に示したブループリントではゲーム内時間の取得になります。つまりポーズで時間を止めたり、スローモーションが入った場合はそれに応じて時間も止まったり遅くカウントされたりします。

その影響を受けないのがGetRealTimeSecondsなのですが、プレイ時間を表記するにはGetRealTimeSecondsをTickで動かすとかなりややこしいことになります。

と思いきや、単純に過去のプレイ時間に現在のプレイ時間を足すだけで、過去のプレイ時間を引き継いだプレイ時間の表示に成功しました。下の図。この方法ではポーズなどゲーム内時間が止まったとしてもリアルの現実の経過時間を計測してくれます。

今回はセーブ・ロードでの過去のプレイ時間の取得処理は割愛しています。また機会があれば解説するかもしないかも知れません。

 

 

コメント

タイトルとURLをコピーしました