iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Software Development

Unity黑科技揭秘:30個專業遊戲開發者必知的開發技巧系列 第 4

Unity 語法糖 - 請注意你的 [Attribute]!

  • 分享至 

  • xImage
  •  

什麼是Attribute?

Attribute(屬性)是C#獨有的語法特性。
可以在一個Function上面戴帽子[ 🎩 ]
提供額外的訊息和觸發特定的行為。

常見的Unity屬性:

Inspector 相關:

  1. [SerializeField]

    • 使Private變量在Inspector中可見並可編輯。
    [SerializeField]
    private int myPrivateField;
    
  2. [HideInInspector]

    • 隱藏Public的變量,使其在編輯器中不可見。
    [HideInInspector]
    public int myPublicField;
    
  3. [Range(min, max)]

    • 為int設置範圍,並在編輯器中顯示Slider。
    [Range(0, 100)]
    public int myRangeField;
    
  4. [Tooltip("Description")]

    • 為變量增加提示,當鼠標Hover時顯示。
    [Tooltip("This is a tooltip")]
    public int myField;
    
  5. [Header("Header Title")]

    • 在編輯器中增加標題。
    [Header("My Header")]
    public int myField;
    
  6. [Space(height)]

    • 在編輯器中增加換行間距。
    [Space(10)]
    public int myField;
    
  7. [Multiline]

    • 顯示多行輸入框。
    [Multiline]
    public string myString;
    
  8. [TextArea(minLines, maxLines)]

    • 顯示TextArea。
    [TextArea(3, 10)]
    public string myString;
    

Component相關:

  1. [RequireComponent(typeof(Component))]

    • 確保依賴的組件存在,不存在的話會自動添加
    [RequireComponent(typeof(Rigidbody))]
    public class MyComponent : MonoBehaviour
    {
        // ...
    }
    
  2. [AddComponentMenu("Menu Name")]

    • 將組件添加到指定的組件菜單中。
    [AddComponentMenu("Custom/MyComponent")]
    public class MyComponent : MonoBehaviour
    {
        // ...
    }
    
  3. [ExecuteInEditMode]

    • 允許代碼在編輯模式下執行。
    [ExecuteInEditMode]
    public class MyComponent : MonoBehaviour
    {
        // ...
    }
    
  4. [DisallowMultipleComponent]

    • 防止在同一個遊戲對象上添加多個相同的組件。
    [DisallowMultipleComponent]
    public class MyComponent : MonoBehaviour
    {
        // ...
    }
    
  5. [SelectionBase]

    • 使組件成為選擇基礎,當選擇其子物體時會自動選擇此組件。
    [SelectionBase]
    public class MyComponent : MonoBehaviour
    {
        // ...
    }
    

Runtime相關:

  1. [RuntimeInitializeOnLoadMethod]

    • 標記一個static方法,在遊戲啟動時執行。
    • 也可以指定執行時機,如 RuntimeInitializeLoadType.AfterSceneLoadRuntimeInitializeLoadType.BeforeSceneLoad
    using UnityEngine;
    
    public class MyClass
    {
        [RuntimeInitializeOnLoadMethod]
        static void OnRuntimeMethodLoad()
        {
            Debug.Log("This runs when the game starts.");
        }
    
        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        static void BeforeSceneLoad()
        {
            Debug.Log("This runs before any scene is loaded.");
        }
    }
    
  2. [InitializeOnLoadMethod]

    • 用於標記一個static方法,使其在編輯器加載或重新編譯腳本時執行:
    using UnityEditor;
    using UnityEngine;
    
    public class MyEditorClass
    {
        [InitializeOnLoadMethod]
        static void OnEditorLoad()
        {
            Debug.Log("This runs when the editor loads.");
        }
    }
    

Editor 相關:

  1. [MenuItem]

    • 用於將Function添加到 Unity 的Menu中。
    using UnityEditor;
    using UnityEngine;
    
    public class MyMenuItems
    {
        [MenuItem("MyMenu/Do Something")]
        static void DoSomething()
        {
            Debug.Log("Doing something...");
        }
    
        [MenuItem("MyMenu/Do Something with Shortcut %g")]
        static void DoSomethingWithShortcut()
        {
            Debug.Log("Doing something with shortcut...");
        }
    }
    
  2. [CustomEditor]
    創建自定義編輯器,讓你自定義Inspector的顯示效果

    using UnityEditor;
    using UnityEngine;
    
    [CustomEditor(typeof(MyComponent))]
    public class MyComponentEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();
    
            MyComponent myComponent = (MyComponent)target;
            if (GUILayout.Button("Do Something"))
            {
                myComponent.DoSomething();
            }
        }
    }
    

Unit Test 相關:

  1. [Test]
    -標記Unit Test方法。

    using NUnit.Framework;
    
    public class MyTests
    {
        [Test]
        public void MyTest()
        {
            Assert.AreEqual(1, 1);
        }
    }
    
  2. [UnityTest]
    標記一個協程測試方法。

    using UnityEngine.TestTools;
    using NUnit.Framework;
    using System.Collections;
    
    public class MyUnityTests
    {
        [UnityTest]
        public IEnumerator MyUnityTest()
        {
            yield return null;
            Assert.AreEqual(1, 1);
        }
    }
    

如果你有使用第三方的插件
如Odin Inspector,
裡面會提供更多的Inspector擴展Attribute可以快速使用。
https://ithelp.ithome.com.tw/upload/images/20240816/201194701haMHYHePO.png


下一章,
我們來研究一下怎麼製作自己的Attribute :)


上一篇
Unity 生命週期 - 一場向死而生的旅程
下一篇
Unity 語法糖 2 - 讓我來製作你的Attribute!
系列文
Unity黑科技揭秘:30個專業遊戲開發者必知的開發技巧25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言