ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

UE4小ネタ : 制限時間の実装方法を色々と

はじめに

f:id:pafuhana1213:20151121003233j:plain

ゲームを作る上で、制限時間の実装は稀によくありますよね。
ということで、今回はUE4での制限時間の実装について。


60秒後にTimeUpEventを呼ぶ処理、を例に説明します。

Delta Sceondsを使う方法

f:id:pafuhana1213:20151121005504j:plain
Delta Sceondsは、前フレームからの時間を示しています。
なので、Delta Secondsを足していくことで時間を計測できます。

ですが、秒単位なので取り扱いが面倒な場合があります。
(例えば、「時:分:秒」の形式で表示したい時)

Set Timerを使う方法

f:id:pafuhana1213:20151121005541j:plain

Set Timerは指定したEventを一定時間後、または一定間隔で呼び出すノードです。
なので、Timeピンに制限時間を入れれば、↑のようにシンプルな形で実装できます。
また、loopingにチェックを入れると、60秒間隔でEventを呼ぶようになります。

ですが、計測開始からの経過時間の情報がないので
残り時間表示的なことができません。

Delayを使う方法

f:id:pafuhana1213:20151121005916j:plain

Delayは、指定した時間後に続きの処理を行うノードです。
使い方としては、先ほど紹介したSet Timerノードに近い感じです。
(ですが、ある状況下では結果が異なったり…詳細は後述)

なので、経過時間の情報がないという欠点も同じです。
数秒後などの短時間の場合は、これでサクッと実装してもいいかもしれません。

TimespanとDatetimeを使う方法

制限時間を実装するなら、オススメはこの方法です。
f:id:pafuhana1213:20151121010920j:plain

Nowノードは、現在時刻(Datetime型)を渡してくれます。
↑では【現在時刻(Datetime) - 計測開始時刻(Datetime) = 経過時間(Timespan)】
を行うことで、時間の計測を行っています。

このTimespanとDatetimeを使う利点は、
各時間単位における値を返すノードが使うことができることです。
f:id:pafuhana1213:20151121011830j:plain

残り時間を表示したい場合は、これらのノードが役に立つと思います。

おまけ ~ Time Dilationとの関係 ~

f:id:pafuhana1213:20151121013031j:plain
スローモーションや早送りを実装する際、
「Set Global Time Dilation」ノード、「Set Custom Time Dilation」ノード、
または、「slomo」コマンドによる処理速度の変化を使用すると思います。

実は、これらを使用すると、
先ほどまで紹介してきた計測手法の一部では
処理速度の変化の影響を受けてしまい、正確な時間を測れなくなります

具体的には、こんな感じ

  • 影響を受ける
    • Delta Sceonds
    • Delay
  • 影響を受けない
    • Set Timer
    • TimespanとDatetime

じゃあ【Set Timer】と【Timespan、Datetime】だけ使えばいいのか、
というと、そうではない時もあります

例えば、「スローモーション中は残り時間の減り方もスローに」
という演出をしたい場合は、影響を受けない手法だと色々と面倒です。

つまり、用途に応じて使い分ける必要があるということです。

追記(2019/3/19):
久々に確認したらいつの間にかSet Timerも影響を受けるようになっていました…


…何回かこの仕様で頭が混乱したので、まとめてみました。
もっといい方法があるよ!という方は、教えて頂けるとありがたいです!