Chronosを使った感想
Chronosについて
時間を制御するアセットにChronosがあります。
私が購入した頃は有料でしたが、今は無料になり、誰でも使えるアセットです。
ゲーム全体のスローモーションなどはUnityでデフォルトでもTime.scaleの値を変更すれば手軽に可能ですが、プレイヤーだけ時間はそのまま、弾丸や敵は遅くしたいといったケースはこういったアセットを使うことも考えられます。
今回は、このアセットを使用してゲームを作り、リリースもしたことがあるので、その使用感を述べていきたいと思います。
Timelineコンポーネント
ざっくり使用方法を説明すると、TimeKeeperという時間制御のマネージャークラスが一個あり、時間制御したいオブジェクトにはTimelineコンポーネントを付けるという感じです。
TimelineコンポーネントにはEnemyやEffectなど好きなIDを振り、TimekeeperでEnemeyは速度倍率0.5などと設定します。
時間制御を行うすべてのオブジェクトにこのTimelineコンポーネントを付ける必要があります。
Animator、Particle、Rigidbody、Navimeshなどこれらを使うオブジェクトには漏れなくTimelineコンポーネントを追加します。
これがなかなか手間で、漏れがあるとスローモーション時だとそれだけ早かったりしてバグになります。
しかし、これは単純にコンポーネントつければいいだけの話です。
タイミング問題
時間制御の開始、解除のタイミングが合わないことがあります。
特に苦労したのが、時間制御中にオブジェクトを生成したときで、最初の1フレームだけ適用されず、元の時間軸で動いてしまうことでした。
スローモーションで使用すると、1フレームだけ速く動いてしまい、1フレームだけでもやはりおかしく見えてしまいます。
Execution Orderを整えればどうにかなるのかもしれませんが、わからず、元のソースコードを読んで修正して対応しました。
他のアセットへの適用
Chronos対応として、プログラムでTimeクラスを使用している箇所はすべてTimelineクラスに置き換える必要があります。
例えば、Time.deltatime は Timeline.deltatimeに、Time.fixedDeltaTime は Timeline.fixedDeltaTime になどです。
また、Rigidbodyについても、Rigidbody.velocity は Timeline.rigidbody.velocityに置き換えるなど対応が必要です。
自分が作成したプログラムについてはこの対応は容易ですが、他のアセットを使用している場合、この対応が非常に困難です。
他のアセットのソースを読み、置き換えていくのがかなり大変でした。
まとめ
Chronosは非常に便利で、実際に使う場合かなり覚悟が必要ですが、次も時間制御をするならこれを使うと思います。
ただ、今はもうほとんどメンテナンスされていないようなので、別の解決策があるなら、それに乗り換えたい気持ちはあります。
(そもそも複雑な時間制御をしたいと思うケースがあまり発生しないかもしれませんが)
使用バージョン
Unity 2019.4.24