[Unity] 複数のタイマーチャネルを持たせる

Unityのタイマー関連の情報はTimeクラスのstaticメンバより取得できます。
以下のように使用されることが多いでしょう。

前回のフレームからの経過時間はTime.deltaTime、ゲーム起動からの経過時間はTime.timeをReadすることで取得できます。

しかし、これらはstaticメンバのため、以下のように時間の進行速度を変化させるとゲーム全体に影響を及ぼしてしまいます。

ある特定のオブジェクトだけ時間の進行速度を変えたい場合(ポーズも含む)、複数のタイマーがあると有難いです。
しかし、そのような機能はUnityには元々存在しないため、自力で実装する必要があります。

これはちょっとした工夫で簡単に実装できます。
複数のタイマーを管理するスクリプトの例を以下に記します。

MultipleTimer.cs

次の部分で複数のタイマーを管理しています。

time、timeScale、deltaTimeをメンバに持つ構造体の配列を定義しています。

これらのメンバーの値はUpdate()メソッド内で毎フレーム更新しています。

deltaTimeやtimeの値をtimeScaleの値から独自に計算しています。
この計算処理はUnityタイマーのそれを真似ています。

上記で実装したタイマーは以下のように使用できます。

これで以下のようにGameObjectそれぞれに独立したタイマーを持たせて動かせるようになりました。

少々面倒ですが、複数のタイマーを使用する場合、タイマー管理スクリプトから情報を取得するように開発者が気を付けるようにすれば良いでしょう。

■参考サイト
Unity – Scripting API:Time