Unityで時間制御ができるアセット「Chronos - Time Control」を試してみました

スローモーションの表現を付けてみたくて探していたところ、時間制御ができるアセット「Chronos - Time Control」を見つけることができました。

(8/28日現在、ちょうどマッドネスセールの対象になっていますね)


ざっと動きを調べたのですが、いくつか分かりづらい箇所があったので、まずは基本的な確認までを備忘録として残しておきたいと思います。


まず、どんなことができるかは、You Tubeで公開されているプロモーションムービーを見るのが早いと思います。とてもかっこいいです。


(「Chronos - Time Control」は長いので、以後このアセットのことを「Chronos」と呼びます)



=====================

目次

1. Chronosとは?

2. 準備

3. Chronosの構成

4. 動作確認

5. Tips


=====================

1. Chronosとは?

時間制御ができるアセットです。オブジェクトの移動速度を速い/遅い、停止、巻き戻しのように変更できます。

自分で指定した条件のときに変更、ということができるので、冒頭のプロモーションムービーのように、特定オブジェクトだけ、任意のエリアに入ったオブジェクトだけ、のような制御ができます。

ちなみに、エリアに入った、とはこのような状態です。

f:id:Takyu:20160828053901j:plain

この場合、青い円に入っている車だけが、他のオブジェクトとは異なる時間感覚になります。

2. 準備

まずはアセットを購入し、インポートします。アセットストアの紹介ページによると、容量は3.8MBととても軽いです。

インポートすると、Assets/Chronosフォルダに、Readmeがあります。ここにチュートリアルのURLが記載されていますが、アセットストアの紹介ページからも行けますので、リンクを貼っておきます。

Chronos / Ludiq


3. Chronosの構成

大きく分けて6つのコンポーネントがあります。説明は私の解釈です。

f:id:Takyu:20160828055011j:plain

名称 役割
TimeKeeper すべての時間制御の元となるコンポーネント。Chronosによる時間制御を行うには、TimeKeeperコンポーネントを付けたオブジェクトが、一つのシーンに一つだけ存在している必要がある
Clock 時間制御のための基本クラス。Abstractとあり、実際にオブジェクトにアタッチすることはなさそう
Global Clock オブジェクト(複数)のグループを指定するコンポーネント。Unityのtagに類似。TimeKeeperオブジェクトにアタッチする必要がある。他のGlobal ClockをParentとして指定できる
Local Clock 一つのオブジェクトを時間制御できるようになるコンポーネント
Area Clock Colliderの範囲内にあるオブジェクト(複数込み)を時間制御できるようになるコンポーネント
Timeline Chronosアセットで時間制御させたいオブジェクトに必ずつけるコンポーネント


Clock以外の5つの関係を示した例がこちらです。なんとなく各コンポーネントの関係性が見えると思います。

f:id:Takyu:20160828060306j:plain


4. 動作確認

Chronosアセットにはサンプルシーンがあります。

下記はサンプルシーンのスクリーンショットですが、いろいろなオブジェクトが色々な動きをしており、どうすればどう動くのか、がわかりづらい印象を持ちました。

f:id:Takyu:20160828061122j:plain

そこで、サンプルシーンについては、ある程度このアセットの構造を理解してから使うことにして、まずは最も簡単な時間制御を試しました。

試した結果がこちらです。

f:id:Takyu:20160828061240g:plain

このように、一つのgame objectの移動速度を制御できます。以下、このサンプルを作るための手順を解説します。

4-1. Timekeeper オブジェクトを設置する

Unityの"GameObject"から生成できるオブジェクトに、 Timekeeperというオブジェクトが追加されているので、これを選択します。

f:id:Takyu:20160828063619j:plain

4-2. 適当なgame objectを設置する

たとえば、今回の場合Cubeを設置しました。

4-3. game objectにTimelineコンポーネントを追加する

時間制御したいgame objectを選択した状態で、Component/Timelineを選択します。

f:id:Takyu:20160828063932j:plain

選択したTimelineコンポーネントについて、ModeとGlobal Clockを下記のように指定します。

f:id:Takyu:20160828064112p:plain

4-4. 基底クラスのスクリプトを作る

まず、スクリプトの記述を簡略化するため、以下のようなコードを準備します。


giste7150b2307d1f83dec14b5f45225d532

以後、Chronosによる時間制御をしたいときは、BaseBehaviourクラスを継承します。

例えば、ChronosにはTimelineというコンポーネントがありますが、

GetComponent<Timeline>.deltaTime

を、

time.deltaTime

として簡略記述できるようになります。

なお、BaseBehaviour.csは作成して Project Viewにあるだけでよいです。Hierarchy Viewの何かのオブジェクトに追加する必要はありません。

4-5. 時間制御のスクリプトを作る

以下のようなスクリプトを書きます。


gist6277067bce1576bad34f589f063959cf

4-6. 適当なGame objectに、TimeControlTest.csを追加する

たとえば、今回は制御対象のCubeに追加してみました。

これでシーン実行すると、キーボードの1〜5のキーに応じてそれぞれ時間制御をかけることができます。

5. Tips

5-1. サンプルシーンに関する解説はない

チュートリアルページは、Unityの2D Platformer(下記)というサンプルプロジェクトを元にした解説であり、なぜかChronosアセット付属のサンプルシーンに関する解説は見つけることができませんでした。


まだチュートリアルページを全部読めていないので、一通り読めば、サンプルシーンの中身も理解出来る気がしています。

続きを確認できたら、またブログを更新したいと思います。