Unity3D插件開發教程


一、插件開發的起因

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 }

效果展示:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM