[Unity][Timeline] 独自実装のトラックに設定するTimelineClipの表示名を変更する

## 初めに
独自実装のトラックを用意すると、下記の画像のようにそのトラックに設定できるクリップの表示名が`TrackClipTypeAttribute`で設定した`PlayableAsset`を継承したクラス名になります
![独自トラックに設定するクリップの表示名](https://qiita-image-store.s3.amazonaws.com/0/146374/4df4b184-c53d-6a2f-efe2-a45f42519c90.png)
しかし、このように何を設定してもデフォルトの名前が表示されるという状態だと、クリップごとに設定する内容によっては何を設定したのか分からないといったことが起こってしまいます

クリップを選択してInspectorビューを見れば詳細が分かるといえば分かるのですが、そのひと手間を省いてTimelineウィンドウを見るだけで何が設定されているのか分かるようにしたいです
![独自拡張のPlayableAssetをInspectorで見た場合](https://qiita-image-store.s3.amazonaws.com/0/146374/9e69542e-32bb-73b9-752e-455396c86541.png)
一応、Inspectorビューから名前を手動で設定することも可能ですが、パラメータを設定して更にそれに合わせてクリップの表示名を手動で書き換えるのはあまり現実的ではありません

プログラムで自動的に名前を書き換える手段を探しましょう

## `TimelineClip.displayName` を設定する
実は`TimelineClip`クラスにこのクリップの表示名を変更するためのプロパティが用意されています
`TimelineClip.displayName`です
ここに文字列を設定することで表示名を任意のものに変更できるようになります
~~（なぜかこのプロパティは[ScriptReference](https://docs.unity3d.com/ScriptReference/Timeline.TimelineClip.html)に載っていないという~~

Unity2018.2からは`TimelineClip`が生成されたタイミングを`TrackAsset`を継承したクラスで取れるようになっています
今回はそのタイミングで`TimelineClip.displayName`を設定するサンプルコードを紹介します

## サンプルコード
```csharp:SampleTrack.cs
[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();
    }
}
```
```csharp:SamplePlayableAsset.cs
public enum SampleType
{
    Hoge,
    Fuga,
    Piyo,
}

public class SamplePlayableAsset : PlayableAsset
{
    [SerializeField] SampleType type;

    public SampleType Type
    {
        get { return type; }
    }
}
```
こちらのサンプルコードのように実装することでクリップが新しく生成されたタイミングで自動的に任意の名前にリネームすることができます
![クリップ名を変更したあとの状態](https://qiita-image-store.s3.amazonaws.com/0/146374/c286cf32-da3b-69f3-6354-0a1b794ac4a6.png)

## 各クリップのパラメータを弄ったあとも勝手にリネームされるようにしたい

実を言うと上記のサンプルコードではクリップが生成されたタイミングでしかリネームすることができず、生成したあとにクリップのパラメータを弄ったあとにそのパラメータに合わせた名前に変わってほしいという要件は満たすことができません

この要件を満たすためには各`PlayableAsset`のパラメータ変更を検知しなければならないのですが、これのためにEditor拡張で`CustomDrawer`を作って`SerialzeProperty`で値の変更を検知して…とやると大掛かりになってしまうため、ここでは代替案を紹介します

```csharp:SampleTrack.cs
[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制作をもっと便利にしていきましょう！

~~**色とかもクリップ単位で変更できるようにしてほしいな**~~