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カテゴリの記事
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 を スクリプトから設定する
背景をスクロールさせる