13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity][Timeline] ControlTrackを扱う上で注意すること

Last updated at Posted at 2018-10-24

初めに

ControlTrackはシーン上のObjectを操作したり、Prefabの生成を制御したりすることができる標準のトラックです
今回はこのControlTrackにはどのような機能があるのか、そしてそれらの機能はどのように動いているのかを軽く説明しつつ、それに合わせた注意点を私なりにまとめてみました

簡単に言うと**あまり考えずに沢山使うとパフォーマンスに影響出るかもよ?**というのを長々と書き連ねています

ControlTrackの機能

ControlTrackにクリップを生成したときにInspectorから編集することができるControlPlayableAssetにあるパラメータにControlTrackでできることがまとまっています

Control Activation

Source Game Objectに設定したシーン上のオブジェクト または Prefabに設定したプロジェクト内のPrefabオブジェクトのActive状態を操作します

Prefabを設定した場合はSource Game Objectの項目がParent Objectに変わり、そこに設定したシーン上のオブジェクトを親オブジェクトとしてPrefabInstantiateします

クリップの設定されている時間の間に指定したGameObjectまたはPrefabのアクティブ状態をtrueにします

Post Playbackオプションでクリップの再生終了時にアクティブ状態をどのようにするかを設定できます

PostPlaybackState 説明
Active アクティブ状態にする
Inactive 非アクティブ状態にする
Revert 再生開始時の状態に戻す

Control PlayableDirector

InspectorからControlPlayableAssetを操作する際にAdvancedのFoldoutを開くと出てくるオプション

Source Game Objectに設定したシーン上のオブジェクト または Prefabに設定したプロジェクト内のPrefabオブジェクトからPlayableDirectorのコンポーネントを取得してクリップの再生時間や状態を伝えてくれるようになります

Control ParticleSystem

InspectorからControlPlayableAssetを操作する際にAdvancedのFoldoutを開くと出てくるオプション

Source Game Objectに設定したシーン上のオブジェクト または Prefabに設定したプロジェクト内のPrefabオブジェクトからParticleSystemのコンポーネントを取得してクリップの再生時間や状態を伝えてくれるようになります

Random SeedにはParticleSystemRandom Seed値に対して任意のシード値を設定できるようになっています
※勝手にランダムな値に初期化されるのでただ使うだけであれば意識する必要はない

Control ITimelineControl

InspectorからControlPlayableAssetを操作する際にAdvancedのFoldoutを開くと出てくるオプション

Source Game Objectに設定したシーン上のオブジェクト または Prefabに設定したプロジェクト内のPrefabオブジェクトからITimelineControlを継承したコンポーネントを取得してクリップの再生時間や状態を伝えてくれるようになります

Control Children

InspectorからControlPlayableAssetを操作する際にAdvancedのFoldoutを開くと出てくるオプション

Source Game Objectに設定したシーン上のオブジェクト または Prefabに設定したプロジェクト内のPrefabオブジェクトの子オブジェクトに対しても上記の制御機能を伝播させるかどうかを設定します

注意点

Control Activation

このフラグが立ったときに内部で使われるようになるActivationControlPlayableOnProcessFrame内で問答無用にgameObject.SetActive(true)を呼び続けます

これが何を意味するかというとこのフラグが立っているクリップの数だけgameObject.SetActive(true)が毎フレーム呼ばれ続けることを意味しています

単体で見るとそこまで処理コストがかかる処理でもないのですが、ControlPlayableAssetを持ったクリップが沢山同時間に並んでいればいるほどその処理コストが重なっていくことを考えるとあまりこのオプションを使いたくありません

なのでこの機能はどうしても必要なとき以外は切っておくのが良いと思います
ControlTrack以外からもそのオブジェクトが操作される可能性があり、状況によっては再生中に外側から非アクティブ状態にされてしまうなどと言った場合は使用したほうが良いでしょう

Control PlayableDirector / ParticleSystem / ITimelineControl

前述の機能の項目の通り、このフラグが立つと各種コンポーネントに対してクリップの再生時間と状態を操作してくれるようになりますが、シーン上のオブジェクトを`SourceGameObjectに設定した場合、内部的に使用してくれるコードの中ではオブジェクトのアクティブ状態を切り替えてくれません

もし制御する想定のオブジェクトのアクティブ状態がオフになるような状況が発生してもクリップからの制御は正しく動作してほしいといった場合はControl Activationのフラグを立てておく必要があります
そうしないとオブジェクトが非アクティブ状態のままクリップから操作されようとして動かないといったことが起きる可能性があります

Prefabを設定したときには、PrefabInstantiateする用のPrefabControlPlayableが合わせてPlayableGraphに登録されるのですが、そこではOnBehaviourPlay(再生開始)とOnBehaviourPause(再生停止)のタイミングでアクティブの切り替え処理を明示的に呼んでいるため、上記のような考慮は必要ありません

Control Children

このフラグが立つと、制御対象のGameObjectからオプションに合わせたコンポーネントの参照を取得する際にGetComponentsInChildrenメソッドを使うようになります

PlayableGraphがビルドされるタイミングに一度だけしか呼ばれないのでそこまで気にする必要はないかもしれませんが、階層が深いGameObjectの場合はそれだけ下の階層まで走査していくことになるはずなので処理コストが増える可能性があります

小要素までクリップの再生時間や状態を伝播させる必要がないのであればこのオプションは切っておくほうが無難でしょう

最後に

設定できる項目はシンプルですが、状況によっては使い方に気を配らなければならないケースが出てくるというお話でした
Timline機能をガッツリ使ってカットシーンを作るというような場合などは気をつけておきたいです

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?