初めに
独自実装のトラックを用意すると、下記の画像のようにそのトラックに設定できるクリップの表示名が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制作をもっと便利にしていきましょう!
色とかもクリップ単位で変更できるようにしてほしいな