我們今天要在Unity的Inspector中製作一顆測試按鈕:

它的特點是你可以直接在Function上掛載Attribute
方便快速進行測試:
1[YapiBtn]
2public void ShowYapiLog()
3{
4 Debug.Log("Hello Yapi");
5}
這個按鈕我們先命名為 - YapiBtn
1. 新增一個Attributes代碼
1[AttributeUsage(AttributeTargets.Method)]
2public class YapiBtnAttribute : Attribute
3{
4
5}
前面的 YapiBtn 名字可以隨意命名
但後面需要加上 Attributes
然後繼承 Attribute 的 Class
接著在上面定義 [AttributeUsage(AttributeTargets.Method)]
表示這個 Attribute 可以被用在 Function 上
其他常見的值還有:
AttributeTargets.Class:適用於類別。AttributeTargets.Method:適用於方法。AttributeTargets.Property:適用於屬性。AttributeTargets.Field:適用於欄位。AttributeTargets.Constructor:適用於建構子。AttributeTargets.All:適用於所有程式元素。AttributeTargets.Class:適用於類別。AttributeTargets.Method:適用於方法。AttributeTargets.Property:適用於屬性。AttributeTargets.Field:適用於欄位。AttributeTargets.Constructor:適用於建構子。AttributeTargets.All:適用於所有程式元素。
2. 創建一個 Yapi Behavior 的代碼
1 public class YapiBehaviour : MonoBehaviour
2 {
3
4 }
為了不要影響到 MonoBehaviour 的運作
我們可以創建一個自己的 Behaviour 來繼承 MonoBehaviour
3. 新增一個YapiBtnDrawer的Editor代碼
1using System;
2using System.Reflection;
3using UnityEditor;
4using UnityEngine;
5
6namespace YapiBtn
7{
8 [CustomEditor(typeof(YapiBehaviour), true)]
9 public class YapiBtnDrawer : Editor
10 {
11 public override void OnInspectorGUI()
12 {
13 DrawDefaultInspector();
14
15 var targetType = target.GetType();
16 var methods = targetType.GetMethods(
17 BindingFlags.Instance |
18 BindingFlags.Static |
19 BindingFlags.Public |
20 BindingFlags.NonPublic);
21
22 foreach (var method in methods)
23 {
24 if (Attribute.IsDefined(method, typeof(YapiBtnAttribute)))
25 {
26 if (GUILayout.Button(method.Name))
27 {
28 try
29 {
30 if (method.IsStatic)
31 {
32 method.Invoke(null, null);
33 }
34 else
35 {
36 method.Invoke(target, null);
37 }
38 }
39 catch (Exception ex)
40 {
41 Debug.LogError($"YapiBtn: [{method.Name}] Execute Error: {ex}");
42 }
43 }
44 }
45 }
46 }
47 }
48}
以上的代碼主要是複寫 YapiBehavior 的 Inspector GUI 顯示
我們遍歷所有的 Methods
找到所有有掛載的 YapiBtnAttribute 代碼後
在上面使用 GUILayout.Button 繪製一個按鈕
點擊的時候則呼叫該 Method
4. 新增測試代碼
接下來可以新增一個測試代碼來驗證效果
隨便寫一個 Function, 在上面掛載 [YapiBtn]
1public class YapiBtnDemoView : YapiBehavior
2{
3 [YapiBtn]
4 public void ShowYapiLog()
5 {
6 Debug.Log("Hello Yapi");
7 }
8}
然後把它掛載在場景的 GameObject 上
最終效果: