初めに
独自実装のトラックを用意すると、下記の画像のようにそのトラックに設定できるクリップの表示名がTrackClipTypeAttribute
で設定したPlayableAsset
を継承したクラス名になります
しかし、このように何を設定してもデフォルトの名前が表示されるという状態だと、クリップごとに設定する内容によっては何を設定したのか分からないといったことが起こってしまいます
クリップを選択してInspectorビューを見れば詳細が分かるといえば分かるのですが、そのひと手間を省いてTimelineウィンドウを見るだけで何が設定されているのか分かるようにしたいです
一応、Inspectorビューから名前を手動で設定することも可能ですが、パラメータを設定して更にそれに合わせてクリップの表示名を手動で書き換えるのはあまり現実的ではありません
プログラムで自動的に名前を書き換える手段を探しましょう
TimelineClip.displayName
を設定する
実はTimelineClip
クラスにこのクリップの表示名を変更するためのプロパティが用意されています
TimelineClip.displayName
です
ここに文字列を設定することで表示名を任意のものに変更できるようになります
(なぜかこのプロパティはScriptReferenceに載っていないという
Unity2018.2からはTimelineClip
が生成されたタイミングをTrackAsset
を継承したクラスで取れるようになっています
今回はそのタイミングでTimelineClip.displayName
を設定するサンプルコードを紹介します
サンプルコード
[TrackClipType(typeof(SamplePlayableAsset))]
public class SampleTrack : TrackAsset
{
// ※このメソッドはUnity2018.2からoverrideできるようになったのでそれ以前のバージョンでは使えません
protected override void OnCreateClip(TimelineClip clip)
{
RenameClipDisplayName(clip);
}
void RenameClipDisplayName(TimelineClip clip)
{
var asset = clip.asset as SamplePlayableAsset;
clip.displayName = asset.Type.ToString();
}
}
public enum SampleType
{
Hoge,
Fuga,
Piyo,
}
public class SamplePlayableAsset : PlayableAsset
{
[SerializeField] SampleType type;
public SampleType Type
{
get { return type; }
}
}
こちらのサンプルコードのように実装することでクリップが新しく生成されたタイミングで自動的に任意の名前にリネームすることができます
各クリップのパラメータを弄ったあとも勝手にリネームされるようにしたい
実を言うと上記のサンプルコードではクリップが生成されたタイミングでしかリネームすることができず、生成したあとにクリップのパラメータを弄ったあとにそのパラメータに合わせた名前に変わってほしいという要件は満たすことができません
この要件を満たすためには各PlayableAsset
のパラメータ変更を検知しなければならないのですが、これのためにEditor拡張でCustomDrawer
を作ってSerialzeProperty
で値の変更を検知して…とやると大掛かりになってしまうため、ここでは代替案を紹介します
[TrackClipType(typeof(SamplePlayableAsset))]
public class SampleTrack : TrackAsset
{
// TrackMixerを生成するタイミングを利用してリネームする
public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
{
foreach (var clip in GetClips())
{
RenameClipDisplayName(clip);
}
return base.CreateTrackMixer(graph, go, inputCount);
}
protected override void OnCreateClip(TimelineClip clip)
{
RenameClipDisplayName(clip);
}
void RenameClipDisplayName(TimelineClip clip)
{
var asset = clip.asset as SamplePlayableAsset;
clip.displayName = asset.Type.ToString();
}
}
先程のサンプルに新しく処理を足しています
CreateTrackMixer
メソッドはTimelineAsset
のためのPlayableGraph
を生成するタイミングで各トラックインスタンスごとに1回ずつ呼び出されます
このタイミングはEditorを再生したり、PlayableDirector.Play
を呼んだり、TimelineEditor.Refresh(RefreshReason.ContentsModified)
を呼んだりするタイミングになります
※TimelineEditor.Refresh()
はUnity2018.3からの機能
パラメータを変更した直後を検知することはできていませんが、パラメータを調整して再生確認をするタイミングで走る処理でもあるので、そこまで大きく困ることはないと思います
このようにしてTimeline制作をもっと便利にしていきましょう!
色とかもクリップ単位で変更できるようにしてほしいな