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

Unityカテゴリの記事
Color SpaceがLinearのときUIの透明度が正しくならない
History Inspectorの紹介
History Inspectorの紹介
敵AIとビジュアルスクリプティング
コンポーネントの順番をスクリプトから並び替える
Smart Inspectorの紹介
Kris' Favorite Assets が便利
キー操作でUIのナビゲーションをループさせる
TextMeshProのSprite Assetを更新する
UnityPhysicsDebugDraw2D が便利
色管理を考える
細かいTips
ビルドスクリプトを書く
AnimatorのCulling Modeでハマった話
Vectrosityを使ってUGUI上で線や円のアニメーションをする
スプレッドシートからjsonデータを読み込む
ビジュアルノベルアセットFungusにコマンドを追加してカスタマイズする
Skinned Mesh Renderer の Boundsについて
シーンごとにビルド結果の容量を出す
シーンビューにクオリティ設定のスライダーを出すエディタ拡張
ビルド結果のFile headersが大きい理由
フリーのビジュアルノベルアセットFungusを使ってRPGのイベントを作る
Move To View を改良する
フリーのビジュアルノベルアセットのFungusが便利
Visual Studio で保存時にフォーマットする
スプレッドシートからデータを読み込む
Easy Save2 で シリアライズされたクラスを保存する
ShaderでSpriteの色相をシフトする
Sprite、Texture の 色相をシフトする
uGUIのButtonをクリック時にハイライトのままになる
uGUIのCanvas Groupを使って透過処理をしたり、操作を制限する
自作のコンフィグ画面に必要なもの
uGUIでトグルなボタンを作る
uGUI で動的にボタンを作る
Easy Save2 を使ってみる
csv読み込んで ローカライズ
LoadLevelAdditive で共通シーンを加算
画面全体に色をかける
Any State でどこからでも遷移できるようにする
iTween のStop ではまる
sprite の multiple で 境界がおかしくなる
2D画面に線を引く Line Renderer
Renderer の Materials を スクリプトから設定する
背景をスクロールさせる