LoginSignup
1
0

[Unity] Attributeいろいろ

Posted at

はじめに

Attributeとは、

[SerializeField,Range(0,1)] float rate=0f

のように、変数やクラスの前にある[]内の定義のことです。

Unityでよく使うor便利なAttributeをまとめてみました。

実際に試すのが一番わかりやすいので、下記のスクリプトを空のGameObjectにアタッチし、子の階層にCreate>3DObject>Cubeしてみてください
image.png

using System;
using UnityEditor;
using UnityEngine;

namespace Elix.Test {
    //Classにヘルプを追加します
    [HelpURL("https://docs.unity3d.com/2022.3/Documentation/ScriptReference/HelpURLAttribute.html")]
    //GameObjectに同じClassを追加できないようにします
    [DisallowMultipleComponent]
    //Sceneで子Objectを選択したときにInspectorに表示されるようにします
    [SelectionBase]
    //[ExecuteInEditMode]は将来廃止される予定
    [ExecuteAlways]
    //Classの下に警告を出します(廃止された時などに使用)
    [Obsolete("このクラスは廃止されます")]
    public class AttributeSamples : MonoBehaviour
    {
        //enum表示時に名前でソートします
        //[InspectorOrder()]
        public enum MyEnum
        {
            Auto = 0,
            [InspectorName("2だけどOne")]
            OneBut2 = 2,
            [InspectorName("4だけどTwo")]
            TwoBut4 = 4,
            [InspectorName("1だけどThree")]
            ThreeBut1 = 1,
        }

        [Tooltip("変数:右クリックメニューにアイテムを追加します")]
        [ContextMenuItem("黄色に変更", "changeColorToYellow")]
        //変数:ColorのAlpha,hdr変更を可能にします
        [ColorUsage(false, true)]
        // private変数をInspectorに表示します
        [SerializeField]
        Color _myCol = Color.red;

        [Tooltip("変数:Gradientをhdrにします")]
        [GradientUsage(true)]
        public Gradient hdrGradient;

        [SerializeField, Tooltip("実行時変数:値を確定後に変更します")]
        [Delayed]
        //Inspectorに変数のタイトルを表示します
        [Header("transform.x")]
        float _myPosX = 0f;

        [SerializeField, Tooltip("変数:最小値と最大値を設定します")]
        [Range(0, 2)] float _myRate = 0f;

        [Tooltip("スクリプト:ScriptのInspectorにメニューを追加します")]
        [ContextMenu("緑に変更しxをゼロに")]
        void changeColAndX()
        {
            changeColor(Color.green);
            _myPosX = 0;
        }

        [Tooltip("enum:enumに名前を付けます")]
        public MyEnum myEnum = MyEnum.Auto;

        [Tooltip("変数:stringの表示行数を変更します")]
        [Multiline(3)]
        public string m_myPoem = "朝焼夕焼食べるものがない\n種田山頭火";

        void changeColorToYellow() { changeColor(Color.yellow); }

        void changeColor(Color _col)
        {
            _myCol = _col;
            GradientColorKey[] colKeys = hdrGradient.colorKeys;
            colKeys[0].color = _col;
            hdrGradient.SetKeys(colKeys, hdrGradient.alphaKeys);
        }


        // Start is called before the first frame update
        void Start()
        {
            Debug.Log(m_myPoem);
            GradientColorKey[] colKeys = new GradientColorKey[2];
            colKeys[0].color = Color.red;
            colKeys[0].time = 0.0f;
            colKeys[1].color = Color.blue;
            colKeys[1].time = 1.0f;
            hdrGradient.SetKeys(colKeys, hdrGradient.alphaKeys);
        }

        // Update is called once per frame
        void Update()
        {
            transform.position = new Vector3(_myPosX, 0, 0);
            if (transform.childCount > 0)
            {
                _myRate= (_myRate+Time.deltaTime) % 2f;
                Color col = hdrGradient.Evaluate(Mathf.PingPong(_myRate,1f));
                transform.GetChild(0).GetComponent<Renderer>().sharedMaterial.SetColor("_Color", col);
                transform.GetChild(0).transform.rotation = Quaternion.AngleAxis(_myRate*360f,Vector3.one);
            }

#if UNITY_EDITOR
            // EditorでPlay中はログを出力しません
            if (!EditorApplication.isPlaying)
            {
                Debug.Log("X:" + _myPosX.ToString());
            }
#endif
        }
    }
}

以下は簡単な説明です。

Classに追加するAttribute

[HelpURL("url")]

Classにヘルプを追加します
スクリプトの後ろの?マークをクリックするとurlが開きます。
image.png

[DisallowMultipleComponent]

GameObjectに同じコンポーネントを追加できないようにします
既にAttributeSamplesがアタッチされているGameObjectに対して再度AttributeSamplesをアタッチしようとすると
image.png
のように警告が表示されます。

[SelectionBase]

Sceneで子Objectを選択した時もInspectorに表示されるようにします
image.png
Sceneで子ObjectのCubeを選択しましたが、InspectorにはAttributeSamplesが表示されています。

[ExecuteAlways]

プロパティやSceneが変更された時のみ、エディター非Play中もUpdate()が実行されます
以前は[ExecuteInEditMode]というAttributeがありましたが、こちらは将来廃止されるようです。

[Obsolete("message")]

Classの下に警告を出します。また、スクリプト名の後ろに(Deprecated)と表示されます
image.png

enumに追加するAttribute

[InspectorName("name")]

Inspectorで表示される名前を変更します

[InspectorName("2だけどOne")]
OneBut2 = 2,
[InspectorOrder()]

Inspectorで表示時に名前でソートします
image.png

変数に追加するAttribute

[Tooltip("message")]

変数をマウスオーバーしたときにツールチップを表示します
image.png

[ContextMenuItem("message", "function")]

変数を右クリックしたときのメニューを追加します
image.png

[ColorUsage(bool, bool)]

ColorのAlpha,hdr変更を可能にします
image.png

[GradientUsage(bool)]

Gradientをhdrにします
image.png

[Delayed]

値を確定後に変更します
通常、Inspectorで変更した変数は即座に反映されますが、[Delayed]を付けた変数はリターンを押す、フォーカスを外すなど値を変更確定した後に更新されます。

[Range(min, max)]

Inspector上にスライダーを表示します
image.png

[Multiline(num)]

String変数の表示行数を変更します
image.png

関数に追加するAttribute

[ContextMenu("message")]

スクリプトを右クリックしたときに表示されるリストに項目を追加し、選択時に実行します
image.png

まとめ

Unity2022あたりから、地味に地味に使いやすくなってきたEditorですが、その恩恵を受けてAttributeもいろいろ追加されているようです。
さらに詳しく知りたい方は
こちらからはじまるAttributesを確認してください。
image.png
Attributes全体へのURLってないんですよね。。。

1
0
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
1
0