Unreal Engineにおける他ソフトとの同期処理時にもDeltaSecを導出する方法

 本投稿は,Unreal Engine(UE)における,前フレームから現在フレームまでの経過時間を導出する方法に関する投稿です.
  経過時間を求める手軽な方法として,「イベントTick」ノードの「deltaSecons」ピンから出力する方法もありますが,これでは他ソフトと同期通信などを行う際は,正確にフレーム間の経過時間を求められない問題があります(図1).
 そこでUE内でのみのフレーム間の経過時間を求めるのではなく,PC上の時刻から経過時間を求める方法について説明します.
  使用しているUEのバージョンは4.25.4です.また,OSはWindows 10です.

図1 UEの「イベントTick」ノードにおける「deltaSeconds」ピンで求められる経過時間

目次

  1. 実装手法

1. 実装手法

 結論から述べると,「now」ノードによってPC上の時刻を求めます.本投稿では,例としてレベルのブループリントに実装し,具体的な処理は自作する関数「deltaSecByPC」に記述します(図2).
 レベルのブループリント上で宣言する変数と関数は,表1の通りです.

図2 レベルのブループリント
表1 レベルのブループリントにおける変数/関数と内容
変数/関数名

内容

oldTime変数 DateTime型の変数.1フレーム前の時刻を記録するために使用します
currentTime変数 DateTime型の変数.現在のフレームの時刻を記録するために使用します
deltaSecByPC関数 上記2つの変数を利用して,PC上の時刻からフレーム間の差分を導出します

 deltaSecByPC関数内の処理は図3の通りです.図3では単位を秒として扱うために,ミリ秒を表すInt型変数に対しては10^-3を掛けながらFloat型にしています.
 DateTime型の変数は「構造体の分割」によって,年/月/日/分/秒/ミリ秒のそれぞれをInt型で取得できます.あくまで時刻のため,例えば秒なら0~59の値を,ミリ秒なら0~999の値になります.DateTime型変数のまま差を求めてからそれぞれInr型に分割すると,例えば「時刻59秒600ミリ秒」から「時刻0秒100ミリ秒」の場合,Int型の秒は0秒を,Int型のミリ秒は500ミリ秒を結果として返します(図4).

図3 deltaSecByPC関数
図4 DateTime型変数の差分を求めた後にピンを分割

 「イベントTick」ノードの「deltaSeconds」ピンでは,単位を秒としたうえで10^-6の桁(つまりマイクロ秒)まで表されています.しかし本投稿の手法ではあくまでPCの時刻であり,例えばWindowsの場合はミリ秒までしか精度的にも取得できないことには注意が必要です――信用できるのはせいぜい10ミリ秒程度までかなあ( 「イベントTick」 ノードにおいても,UEがそもそもWindows上で動いている以上は,マイクロ秒までの数値が返されたとして,それがどれだけ正確かは怪しいと個人的には思いますが)