Alchemy/docs/articles/ja/create-custom-attribute.md
2024-02-20 10:47:00 +09:00

2.0 KiB

カスタム属性を作成する

AlchemyAttributeDrawerを使用することで、Alchemy上で動作する独自の属性を作成することが可能です。ここでは例としてHelpBoxAttributeとそのDrawerの実装を示します。

まずは、フィールドやプロパティに追加する属性を定義します。

using System;
using UnityEngine.UIElements;

public sealed class HelpBoxAttribute : Attribute
{
    public HelpBoxAttribute(string message, HelpBoxMessageType messageType = HelpBoxMessageType.Info)
    {
        Message = message;
        MessageType = messageType;
    }

    public string Message { get; }
    public HelpBoxMessageType MessageType { get; }
}

次に、定義した属性に対応するDrawerを作成します。Drawerを定義したcsファイルはEditorフォルダ以下に配置する必要があります。

using UnityEngine.UIElements;
using Alchemy.Editor;

[CustomAttributeDrawer(typeof(HelpBoxAttribute))]
public sealed class HelpBoxDrawer : AlchemyAttributeDrawer
{
    HelpBox helpBox;

    public override void OnCreateElement()
    {
        var att = (HelpBoxAttribute)Attribute;
        helpBox = new HelpBox(att.Message, att.MessageType);

        var parent = TargetElement.parent;
        parent.Insert(parent.IndexOf(TargetElement), helpBox);
    }
}

OnCreateElement()メソッドを実装することで、対象のメンバーに対応したVisualElementを作成した際に処理を追加することができます。描画処理を上書きする通常のPropertyDrawerとは異なり、こちらはVisual Elementの作成後に後処理を追加する動作であることに注意してください。この仕組みによってAlchemyは複数のDrawerを組み合わせることを可能にしています。

また、定義したDrawerにはCustomAttributeDrawer属性を追加し、引数に定義した属性の型を追加する必要があります。この属性をもとにAlchemyは要素の描画に必要なDrawerの検索を行います。