17
5

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] 独自実装のトラックに設定するTimelineClipの表示名を変更する

Posted at

初めに

独自実装のトラックを用意すると、下記の画像のようにそのトラックに設定できるクリップの表示名がTrackClipTypeAttributeで設定したPlayableAssetを継承したクラス名になります
独自トラックに設定するクリップの表示名
しかし、このように何を設定してもデフォルトの名前が表示されるという状態だと、クリップごとに設定する内容によっては何を設定したのか分からないといったことが起こってしまいます

クリップを選択してInspectorビューを見れば詳細が分かるといえば分かるのですが、そのひと手間を省いてTimelineウィンドウを見るだけで何が設定されているのか分かるようにしたいです
独自拡張のPlayableAssetをInspectorで見た場合
一応、Inspectorビューから名前を手動で設定することも可能ですが、パラメータを設定して更にそれに合わせてクリップの表示名を手動で書き換えるのはあまり現実的ではありません

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

TimelineClip.displayName を設定する

実はTimelineClipクラスにこのクリップの表示名を変更するためのプロパティが用意されています
TimelineClip.displayNameです
ここに文字列を設定することで表示名を任意のものに変更できるようになります
(なぜかこのプロパティはScriptReferenceに載っていないという

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

サンプルコード

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();
    }
}
SamplePlayableAsset.cs
public enum SampleType
{
    Hoge,
    Fuga,
    Piyo,
}

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

    public SampleType Type
    {
        get { return type; }
    }
}

こちらのサンプルコードのように実装することでクリップが新しく生成されたタイミングで自動的に任意の名前にリネームすることができます
クリップ名を変更したあとの状態

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

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

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

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制作をもっと便利にしていきましょう!

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

17
5
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
17
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?