なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ

書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

2022/11/18

Unity のカスタムトラックで表示名を設定したい

カテゴリー:C#Unity

比較的最近の Unity では、 Timeline 関連の API も公開されていて、ある程度自由にカスタマイズすることが出来ます。
今回はそのうち、 TrackAsset についてのお話です。

TrackAsset を継承したクラスを作ることで、 Timeline に任意のトラックを追加することが出来ます。
ちなみにトラックっていうのは、  Timeline の左側にある部分です。 Animation Track とかいろいろありますね。

例えば、以下のようなコードを書くことで、自作アセットをトラックとして扱えたりします。

// ------------------------------------------------------------------------------------------
//  Copyright (c) Natsuneko. All rights reserved.
//  Licensed under the MIT License. See LICENSE in the project root for license information.
// ------------------------------------------------------------------------------------------

using UnityEngine;
using UnityEngine.Timeline;

namespace NatsunekoLaboratory.NekoAnim.Models.Timeline
{
    [TrackColor(236f / 255, 202f / 255, 224f / 255)]
    [TrackBindingType(typeof(GameObject))]
    [TrackClipType(typeof(NekoAnimPlayableAsset), false)]
    public class NekoAnimTrack : TrackAsset { }
}

TrackColor 属性は、トラックの左側に表示されたり、トラックに含まれるクリップの色について設定が出来ます。
TrackBindingType 属性は、トラックに関連付けられるオブジェクトを設定することが出来ます。この場合は GameObject です。
TrackClipType では、トラックに含むことが出来るクリップを指定することが出来ます。この場合は NekoAnimPlayableAsset です。

ただ、このままだと、トラックを追加するときに、 NatsunekoLaboratory.NekoAnim.Models.Timeline/Neko Anim Track と表示されます。
つまりは、単純に <NAMESPACE>/${ObjectNames.GetInspectorName(obj)} みたいな名前が表示されます。
この状態だと、スクリプトに指定した名前空間がそのまま表示されてしまい、ユーザビリティが低いです。

(というか、基本的に Unity の機能は基本的に名前空間を考慮していない気がするんですが、なぜなんでしょう?)

ということで、表示名を変更しましょう。
といっても、 Unity の不具合で、名前空間を使用した場合は完全に名前を指定することは出来ません。
最低限、何らかの階層が発生することになります。詳しくは参考文献を参照してください。

やり方は簡単で、 System.ComponentModel.DisplayNameAttribute を使用します。
こんなかんじですね:

// ------------------------------------------------------------------------------------------
//  Copyright (c) Natsuneko. All rights reserved.
//  Licensed under the MIT License. See LICENSE in the project root for license information.
// ------------------------------------------------------------------------------------------

using System.ComponentModel;

using UnityEngine;
using UnityEngine.Timeline;

namespace NatsunekoLaboratory.NekoAnim.Models.Timeline
{
    [DisplayName("Natsuneko Laboratory/NekoAnim Track")] // ← ここ追加
    [TrackColor(236f / 255, 202f / 255, 224f / 255)]
    [TrackBindingType(typeof(GameObject))]
    [TrackClipType(typeof(NekoAnimPlayableAsset), false)]
    public class NekoAnimTrack : TrackAsset { }
}

こうすることで、名前空間が含まれない、完全にカスタムした名前が表示されます。
逆に、ネストしない場合、つまりは / を含めない場合は、第一階層は名前空間になるのでご注意ください。

ということで、ではでは~。

参考: