一、插件開發的起因
1.日常開發過程中會碰到許多重復且復雜的操作過程,比如數據的存儲,資源文件的管理等等,我們在做這些事情的時候會浪貴很多的時間以及精力。
2.人為操作一些事情的時候,或多或少會出現一些問題。
二、插件的作用
1.提高項目開發的效率
2.增加項目開發的質里
3.增加團隊合作的方便
三、菜單項相關操作
1.菜單項(MenuItem)
一般會在 Project-->Assets底下創建一個Editor文件夾,此文件夾里面主要存放編輯的關於插件相關的內容(腳本),此文件夾里面的腳本,打包項目的時候不會存放到包里面,所以一般插件都會存放到這里面。
第一步:在Editor文件夾里面創建C#腳本:如:MenuTest
第二步:編寫MenuTest插件腳本
引入命名空間:using UnityEditor;
定義的方法前面,必須使用static修飾,且方法上面需要添加:[MenuItem("Menu/Test")]
注明:[MenuItem("Menu/Test")] 里面的不同參數,分別代表着使用什么方式打開
1 //[MenuItem("Menu/Test")]:這種寫法意味着沒有快捷鍵,需要鼠標點擊 2 [MenuItem("Menu/Test")] 3 public static void Test() 4 { 5 Debug.Log("Test"); 6 } 7 8 //_w:表示沒有組合鍵,直接按住鍵盤"w"使用 9 [MenuItem("Menu/Test1 _w")] 10 public static void Test1() 11 { 12 Debug.Log("Test1"); 13 } 14 15 //#w:表示按住 Shift + w 使用 16 [MenuItem("Menu/Test2 #w")] 17 public static void Test2() 18 { 19 Debug.Log("Test2"); 20 } 21 22 //%w:表示按住 Ctrl + w 使用 23 [MenuItem("Menu/Test3 %w")] 24 public static void Test3() 25 { 26 Debug.Log("Test3"); 27 } 28 29 //&w:表示按住 Alt + w 使用 30 [MenuItem("Menu/Test4 &w")] 31 public static void Test4() 32 { 33 Debug.Log("Test4"); 34 }
在Unity3D中效果展示:多出了一個"Menu"菜單,和"MenuTest"腳本中定義的5個方法
2.組件菜單(AddComponentMenu)
目的:方便添加組件相關的操作
第一步:組件菜單的文件存放目錄不存放在Editor下面,在新建一個"Scripts"目錄,並創建"ComponentDemo"腳本
第二步:在創建的腳本類名上面添加:[AddComponentMenu("Demo/Demo1")],其中"Demo/Demo1"為開發者自定義的路徑
效果如下:
除此之外,自定義的組建,在菜單“Component”里面也有
3.上下文菜單(ContextMenu)
上下文菜單是定義在組件類里面的方法。
第一步:我們在上文創建的“ComponentDemo”類里面定義一個"ContextMenuDemo()"方法,注意:不能使用static修飾,並用:[ContextMenu("ContextDemo")]標注上下文菜單的名字為:“ContextDemo”
第二步:回到Unity面板中,創建一個游戲物體,並添加“Demo1”組件,然后鼠標在此組件上右擊,就可以看到多了一個“ContextDemo”選項
4.必要組件菜單(RequireComponent)
比如:我們要求給游戲物體添加“Demo1”組件的時候,必須帶上“Rigidbody”組件。
效果:當你給游戲物體添加“Demo1”組件的時候,會自動添加“Rigidbody”組件。
如果想要移除組件,必須先移除“Demo1”,再移除“Rigidbody”。
四、自定義Inspector界面
1.屬性相關標識
a.隱藏屬性顯示(HideInInspector):單純的隱藏變量
b.不顯示屬性(NonSerialized):不但隱藏變量,並且還會防止該變量的序列化保存,(無論在Inspector面板中設置Int3的值是多少,只要在C#中設置Int3的屬性為“NonSerialized”並且假如設置的值為 3,那么Unity編譯后,Inspector面板中的Int3的值就是3)
c.系列化域(SerializeField):將私有變量強制顯示在Inspector面板里面
d.關鍵字系列化(Serializable):可以讓自定義的類(不繼承自:MonoBehaviour的類)顯示在Inspector面板里面
2.自定義界面屬性
Editor:自定義屬性面板的基類
CustomEditor:類上面的標識
第一步:創建兩個類,EditorDemo,Test1。EditorDemo需要放在Assets-->Editor里面,Test1類放入Scripts里面即可。
第二步:編寫Test1代碼,設置一些屬性,並在里面引入新創建的類TypeDemo
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using UnityEngine; 5 6 public class Test1 : MonoBehaviour 7 { 8 public int mIntVal; 9 10 public float mFloatVal; 11 12 public string mStrVal; 13 14 public TypeDemo mTypeDemo; 15 } 16 17 [Serializable]//不添加序列化設置,屬性值不會顯示在Inspector面板里 18 public class TypeDemo 19 { 20 public int tIntVal; 21 public string tStrVal; 22 public float tFloatVal; 23 }
第三步:EditorDemo需要繼承自Editor,並聲明:[CustomEditor(typeof(Test1))]
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 //是一個窗口腳本,所以要放在Assets-->Editor下面 7 [CustomEditor(typeof(Test1))] 8 public class EditorDemo : Editor 9 { 10 public SerializedObject mObj;//定義序列化目標對象 11 //序列化出來幾個屬性,屬性對應的是[CustomEditor(typeof(Test1))]中,Test1類里面的屬性 12 public SerializedProperty mIntVal; 13 public SerializedProperty mFloatVal; 14 public SerializedProperty mStrVal; 15 public SerializedProperty mTypeDemo; 16 17 //選擇當前游戲對象 18 private void OnEnable() 19 { 20 //初始化 21 this.mObj = new SerializedObject(target); 22 //通過字符串名字,查找Test1類里面的屬性,並進行初始化 23 this.mIntVal = this.mObj.FindProperty("mIntVal"); 24 this.mFloatVal = this.mObj.FindProperty("mFloatVal"); 25 this.mStrVal = this.mObj.FindProperty("mStrVal"); 26 27 this.mTypeDemo = this.mObj.FindProperty("mTypeDemo"); 28 } 29 30 //繪制 31 public override void OnInspectorGUI() 32 { 33 this.mObj.Update(); 34 35 EditorGUILayout.PropertyField(this.mIntVal); 36 EditorGUILayout.PropertyField(this.mFloatVal); 37 EditorGUILayout.PropertyField(this.mStrVal); 38 39 EditorGUILayout.PropertyField(this.mTypeDemo, true);//true屬性意思是設置顯示子節點,也就是顯示TypeDemo里面的屬性 40 41 this.mObj.ApplyModifiedProperties(); 42 } 43 }
效果展示:
3.自定義序列化屬性字段
創建一個類Test2
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using UnityEngine; 5 6 public class Test2 : MonoBehaviour 7 { 8 public EnumDemo mEnumDemo; 9 public bool mBool; 10 public int mInt; 11 public float mFloat; 12 public string mStr; 13 public Color mColor; 14 } 15 16 [Serializable] 17 public enum EnumDemo 18 { 19 None, 20 BoolVal, 21 IntVal, 22 FloatVal, 23 StrVal, 24 Color 25 }
創建一個類EditorInspectorDemo,放在Assets-->Editor下面
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 [CustomEditor(typeof(Test2))] 7 public class EditorInspectorDemo : Editor 8 { 9 public SerializedObject mObj; 10 public SerializedProperty mEnumDemo; 11 public SerializedProperty mBool; 12 public SerializedProperty mInt; 13 public SerializedProperty mFloat; 14 public SerializedProperty mStr; 15 public SerializedProperty mColor; 16 private void OnEnable() 17 { 18 this.mObj = new SerializedObject(target); 19 this.mEnumDemo = this.mObj.FindProperty("mEnumDemo"); 20 this.mBool = this.mObj.FindProperty("mBool"); 21 this.mInt = this.mObj.FindProperty("mInt"); 22 this.mFloat = this.mObj.FindProperty("mFloat"); 23 this.mStr = this.mObj.FindProperty("mStr"); 24 this.mColor = this.mObj.FindProperty("mColor"); 25 } 26 27 public override void OnInspectorGUI() 28 { 29 this.mObj.Update(); 30 EditorGUILayout.PropertyField(this.mEnumDemo); 31 //使用switch做條件篩選,this.mEnumDemo.enumValueIndex作為篩選條件,index從0開始,由於我設置枚舉類型的第一個屬性為None,所以case的值從1開始。 32 switch (this.mEnumDemo.enumValueIndex) 33 { 34 case 1: 35 EditorGUILayout.PropertyField(this.mBool); 36 break; 37 case 2: 38 EditorGUILayout.PropertyField(this.mInt); 39 break; 40 case 3: 41 EditorGUILayout.PropertyField(this.mFloat); 42 break; 43 case 4: 44 EditorGUILayout.PropertyField(this.mStr); 45 break; 46 case 5: 47 EditorGUILayout.PropertyField(this.mColor); 48 break; 49 50 } 51 52 this.mObj.ApplyModifiedProperties(); 53 } 54 }
可以實現:選擇不同的下拉框屬性,下面會出現相對應的設置,步驟和上面“自定義界面屬性”一樣,代碼類似,實現效果如下:
五、自定義操作界面
1.界面的啟動關閉
創建一個ShowWindow類,存放在Assets-->Editor里面,並繼承自EditorWindow
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class WindowDemo : EditorWindow 7 { 8 [MenuItem("Menu/ShowWindow")] 9 public static void ShowWindow() 10 { 11 //使用官方提供的實例化窗口方法調用 12 WindowDemo.CreateInstance<WindowDemo>().Show(); 13 14 //浮動型的窗口,跟點擊Building Setting出現的窗口效果一樣 15 WindowDemo.CreateInstance<WindowDemo>().ShowUtility(); 16 17 //彈出窗口時的效果 18 WindowDemo.CreateInstance<WindowDemo>().ShowPopup();//此方Y法和下面的OnGUI配合着使用,否則會出現頁面關不掉的情況 19 } 20 public void OnGUI() 21 { 22 if (GUILayout.Button("關閉")) 23 { 24 this.Close(); 25 } 26 } 27 }
效果展示:
2.頁面的相關事件機制
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class EditorDemo2 : EditorWindow 7 { 8 [MenuItem("Menu/NewWindow")] 9 public static void ShowWindow() 10 { 11 //使用系統提供的單例模式,在unity面板中打開窗口時,只會出現一個 12 EditorWindow.GetWindow<EditorDemo2>().Show(); 13 } 14 15 //繪制操作面板 16 public void OnGUI() 17 { 18 if (GUILayout.Button("關閉")) 19 { 20 this.Close(); 21 } 22 } 23 24 public int index_1 = 0; 25 //刷新方法,每秒鍾100次 26 public void Update() 27 { 28 index_1++; 29 Debug.Log("index_1:" + index_1); 30 } 31 32 public int index_2 = 0; 33 //刷新方法,刷新周期比Update小 34 public void OnInspectorUpdate() 35 { 36 index_2++; 37 Debug.Log("index_2:" + index_2); 38 } 39 //視圖被刪除的時候觸發 40 public void OnDestroy() 41 { 42 Debug.Log("OnDestroy:觸發"); 43 } 44 //選擇一個對象的時候觸發 45 public void OnSelectionChange() 46 { 47 //獲取選擇Hierarchy里面游戲物體的時候的名字 48 for (int i = 0; i < Selection.gameObjects.Length; i++) 49 { 50 Debug.Log("OnSelectionChange:觸發" + Selection.gameObjects[i].name); 51 } 52 53 //獲取選擇Project里面的文件的名字 54 for (int i = 0; i < Selection.objects.Length; i++) 55 { 56 Debug.Log("OnSelectionChange:觸發" + Selection.objects[i].name); 57 } 58 } 59 //獲得焦點的時候觸發 60 public void OnFocus() 61 { 62 Debug.Log("OnFocus:觸發"); 63 } 64 //失去焦點的時候觸發 65 public void OnLostFocus() 66 { 67 Debug.Log("OnLostFocus:觸發"); 68 } 69 //Hierarchy更改的時候觸發 70 public void OnHierarchyChange() 71 { 72 Debug.Log("OnHierarchyChange:觸發"); 73 } 74 //Project更改的時候觸發 75 public void OnProjectChange() 76 { 77 Debug.Log("OnProjectChange:觸發"); 78 } 79 80 }
效果展示:
3.文本/顏色字段
在Assets-->Editor文件夾里面創建TextEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class TextEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/TextEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<TextEditorWindow>().Show(); 12 } 13 //為了更方便練習演示,就定義了一個字符串 14 public string mText = "默認文字"; 15 public Color mColor = Color.white; 16 public void OnGUI() 17 { 18 //一行文本,單行輸入框 19 this.mText = EditorGUILayout.TextField(this.mText); 20 //多行輸入框 21 this.mText = EditorGUILayout.TextArea(this.mText); 22 //密碼輸入框 23 this.mText = EditorGUILayout.PasswordField(this.mText); 24 //顏色選擇框 25 this.mColor = EditorGUILayout.ColorField(this.mColor); 26 } 27 }
效果展示:
4.標簽字段
在Assets-->Editor文件夾里面創建TagEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class TagEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/TagEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<TagEditorWindow>().Show(); 12 } 13 14 //為了更方便練習演示,就定義了一個字符串 15 public string mText = "默認文字"; 16 public void OnGUI() 17 { 18 //標簽 19 EditorGUILayout.PrefixLabel(this.mText);//只寫這么一行代碼,窗口里面不出現任何內容 20 EditorGUILayout.Space();//換行 21 22 //標簽(下拉框) 23 this.mText = EditorGUILayout.TagField(this.mText); 24 EditorGUILayout.Space(); 25 26 //標簽(非可選擇標簽提示) 27 EditorGUILayout.LabelField(this.mText); 28 EditorGUILayout.Space(); 29 30 //標簽(可選擇標簽提示) 31 EditorGUILayout.SelectableLabel(this.mText); 32 EditorGUILayout.Space(); 33 } 34 }
效果展示:
5.數字輸入字段
在Assets-->Editor文件夾里面創建NumberEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class NumberEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/NumberEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<NumberEditorWindow>().Show(); 12 } 13 14 public int mInt; 15 public float mFloat; 16 public void OnGUI() 17 { 18 EditorGUILayout.LabelField("輸入整形數字"); 19 this.mInt = EditorGUILayout.IntField(this.mInt); 20 EditorGUILayout.LabelField("輸入浮點型數字"); 21 this.mFloat = EditorGUILayout.FloatField(this.mFloat); 22 } 23 }
效果展示:
6.滑動條
在Assets-->Editor文件夾里面創建NumberEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class SliderEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/SliderEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<SliderEditorWindow>().Show(); 12 } 13 14 public float mFloat; 15 16 public int mInt; 17 18 public float mMinVal; 19 public float mMaxVal; 20 public void OnGUI() 21 { 22 //滑動條 參數1:默認值,參數2:最小值,參數3:最大值 23 this.mFloat = EditorGUILayout.Slider(this.mFloat, 0, 100);//取值區間有小數 24 25 this.mInt = EditorGUILayout.IntSlider(this.mInt, 0, 100);//取值區間為整數 26 27 //最小值到最大值的取值范圍,為0-100 28 EditorGUILayout.MinMaxSlider(ref mMinVal, ref mMaxVal, 0, 100); 29 } 30 }
效果展示:
7.位置/大小輸入字段
在Assets-->Editor文件夾里面創建VectorEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class VectorEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/VectorEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<VectorEditorWindow>().Show(); 12 } 13 14 public Vector2 mPos2; 15 public Vector3 mPos3; 16 public Vector4 mPos4; 17 public Rect mRect; 18 public Bounds mBounds; 19 public void OnGUI() 20 { 21 this.mPos2 = EditorGUILayout.Vector2Field("二維坐標", this.mPos2); 22 this.mPos3 = EditorGUILayout.Vector3Field("三維坐標", this.mPos3); 23 this.mPos4 = EditorGUILayout.Vector4Field("四維坐標", this.mPos4); 24 25 EditorGUILayout.Space(); 26 EditorGUILayout.LabelField("矩陣"); 27 this.mRect = EditorGUILayout.RectField(this.mRect); 28 EditorGUILayout.Space(); 29 EditorGUILayout.LabelField("間距"); 30 this.mBounds = EditorGUILayout.BoundsField(this.mBounds); 31 } 32 }
效果展示:
8.選擇字段
在Assets-->Editor文件夾里面創建ChooseEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class ChooseEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/ChooseEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<ChooseEditorWindow>().Show(); 12 } 13 public int mIndex; 14 public int mIndex2; 15 public EnumDemo mEnumDemo; 16 public void OnGUI() 17 { 18 string[] strs = new string[] { "aaa", "bbb", "ccc", "ddd", "eee" }; 19 int[] ints = new int[] { 111, 222, 333, 444, 555 }; 20 21 //選擇 22 this.mIndex = EditorGUILayout.Popup(this.mIndex, strs); 23 //和上面的方法類似 24 this.mIndex2 = EditorGUILayout.IntPopup(this.mIndex2, strs, ints); 25 //枚舉 26 this.mEnumDemo = (EnumDemo)EditorGUILayout.EnumPopup(this.mEnumDemo); 27 } 28 29 public enum EnumDemo 30 { 31 mString, mInt, mFloat, mDouble, mColor 32 } 33 }
效果展示:
9.標簽層對象選擇字段
在Assets-->Editor文件夾里面創建ObjectChooseEditor類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class ObjectChooseEditor : EditorWindow 7 { 8 [MenuItem("Menu/ObjectChooseEditor")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<ObjectChooseEditor>().Show(); 12 } 13 14 public string mTag; 15 public int mLayer; 16 public Object mObject; 17 public void OnGUI() 18 { 19 //標簽,下面兩種寫法,哪個都可以 20 //this.mTag = EditorGUILayout.TagField(this.mTag); 21 this.mTag = EditorGUILayout.TagField("Tag"); 22 EditorGUILayout.Space(); 23 //層 24 this.mLayer = EditorGUILayout.LayerField(this.mLayer); 25 EditorGUILayout.Space(); 26 //對象選擇,如果想要存放所有的元素,那么參數就寫為Object: typeof(Object) 27 this.mObject = EditorGUILayout.ObjectField("對象選擇器", this.mObject, typeof(Camera), true); 28 } 29 }
效果展示:
10.單選字段
在Assets-->Editor文件夾里面創建SingleChoiceEditor類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class SingleChoiceEditor : EditorWindow 7 { 8 [MenuItem("Menu/SingleChoiceEditor")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<SingleChoiceEditor>().Show(); 12 } 13 14 public bool mBool; 15 public bool mFoldout; 16 public void OnGUI() 17 { 18 //單選字段 19 this.mBool = EditorGUILayout.Toggle(this.mBool); 20 //單選字段,也可以在bool參數前面加個標簽 21 this.mBool = EditorGUILayout.Toggle("是", this.mBool); 22 //折疊 23 this.mFoldout = EditorGUILayout.Foldout(this.mFoldout, "折疊"); 24 Debug.Log(this.mFoldout); 25 if (this.mFoldout) 26 { 27 EditorGUILayout.LabelField("A"); 28 EditorGUILayout.LabelField("B"); 29 EditorGUILayout.LabelField("C"); 30 } 31 } 32 }
效果如下:
11.字段分組
在Assets-->Editor文件夾里面創建GroupEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class GroupEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/GroupEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<GroupEditorWindow>().Show(); 12 } 13 14 public bool mBool; 15 16 public Vector2 mVector2; 17 18 public void OnGUI() 19 { 20 //如果窗口內容過多,可以使用滾動區域,出現滑條 21 EditorGUILayout.BeginScrollView(this.mVector2); 22 23 //分組:有開始和結束 24 this.mBool = EditorGUILayout.BeginToggleGroup("選擇分組", mBool); 25 EditorGUILayout.LabelField("練習分組:ToggleGroup"); 26 EditorGUILayout.TextField("練習分組:ToggleGroup"); 27 EditorGUILayout.EndToggleGroup(); 28 EditorGUILayout.Space(); 29 30 //矩陣,水平分組 31 Rect mHorizontal = EditorGUILayout.BeginHorizontal(); 32 EditorGUILayout.LabelField("練習分組:Horizontal"); 33 EditorGUILayout.TextField("練習分組:Horizontal"); 34 EditorGUILayout.EndHorizontal(); 35 EditorGUILayout.Space(); 36 37 //矩陣,垂直分組 38 Rect mVertical = EditorGUILayout.BeginVertical(); 39 EditorGUILayout.LabelField("練習分組3"); 40 EditorGUILayout.TextField("練習分組3"); 41 EditorGUILayout.EndVertical(); 42 EditorGUILayout.Space(); 43 44 EditorGUILayout.LabelField("聯系分組"); 45 EditorGUILayout.TextField("聯系分組"); 46 47 //結束滾動 48 EditorGUILayout.EndScrollView(); 49 } 50 }
效果展示:
12.其他字段
在Assets-->Editor文件夾里面創建OtherEditorWindow類,並繼承自EditorWindow,代碼如下:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class OtherEditorWindow : EditorWindow 7 { 8 [MenuItem("Menu/OtherEditorWindow")] 9 public static void ShowWindow() 10 { 11 EditorWindow.GetWindow<OtherEditorWindow>().Show(); 12 } 13 public AnimationCurve mAC = new AnimationCurve(); 14 public Object mObj; 15 public bool mSelect; 16 public void OnGUI() 17 { 18 //動畫標簽 19 this.mAC = EditorGUILayout.CurveField("動畫片段", this.mAC); 20 EditorGUILayout.Space(); 21 22 this.mObj = EditorGUILayout.ObjectField("標題", this.mObj, typeof(Transform), true); 23 if (this.mObj != null) 24 { 25 this.mSelect = EditorGUILayout.InspectorTitlebar(this.mSelect, this.mObj); 26 } 27 } 28 }
效果展示: