Unity編輯器擴展

編輯器簡介:Unity支持擴展編輯器,擴展編輯器的代碼要放入Editor文件夾中,Editor文件夾在項目打包時,是不會被打包的

1:使用MenuItem添加菜單欄按鈕:MenuItem是引用UnityEditor命名空間的

public class AddTools { [MenuItem("Assets/Test1",false,10)] static void test1()//必須爲靜態函數 { Debug.Log("test1"); } }

2:MenuItem的路徑設置和顯示的順序設置,MenuItem有三個參數,第三個參數是設置按鈕顯示的前後順序的。按鈕顯示通常以11爲一個組,參數相差11就不是一個組了。

[MenuItem("Assets/test1",false,1)]

[MenuItem("Assets/test2",false,12)]這兩個參數相差11,text1按鈕在text2前面顯示,text1和text2不是在同一個組。

[MenuItem("Assets/tab1",false,0)] static void tab() { //這個靜態方法是實現上面設置的按鈕的功能的
 } [MenuItem("Assets/tab2", false, 11)] static void tab1() { //這個靜態方法是實現上面設置的按鈕的功能的
    }


3:給組件或腳本的右鍵菜單添加按鈕,去實現一些功能。

[menuitem("CONTEXT/組件或腳本名/按鈕名")]//往腳本的右鍵菜單中添加一個按鈕實現某種功能

[MenuItem("CONTEXT/text1/InitHealthAndSpeed1")] static void InitHealthAndSpeed() { //點擊InitHealthAndSpeed1按鈕就會執行這個靜態方法
        Debug.Log("aa"); }

4:MenuCommand:是獲取咱們正在操做的組件或腳本的對象,拿到組件或腳本對象咱們就能夠對其進行操做。

[MenuItem("CONTEXT/text1/InitHealthAndSpeed1")] static void InitHealthAndSpeed(MenuCommand cmd) { //點擊InitHealthAndSpeed1按鈕就會執行這個靜態方法
        text1 ta1 = cmd.context as text1;//MenuCommand獲取到正在操做的text1腳本組件
        ta1.a = 10;//對組件的內容進行修改
 Debug.Log(ta1.a); }

 

5:Selection:獲取unity中的一些物體對象。

   Selection.activeGameobject//獲取Inspector面板中被選中的遊戲物體,只能返回選中的一個物體對象,選中多個對象,只會獲得第一個對象

    Selection.activeTransform//獲取Inspector面板中被選中游戲物體的Transform組件,只能返回一個一個物體的Transform組件。選中多個對象,只會獲得第一個對象

    selection.Objects//獲取全部選中物體,包括Script scene 的全部資源呢

    selection.activeObject//只能獲取一個被選中的資源,資源是能夠是任何物體

    Selection.gameObjects//獲取全部選中的Gameobject對象

    Selection.transform//獲取全部被選中的遊戲對象的transfoem屬性

   

GameObject go = Selection.activeGameObject;//獲取被選中的一個物體對象,獲取的只能是遊戲對象
        Transform go1 = Selection.activeTransform;//獲取被選中的一個物體的Transform組件,獲取的只能是遊戲對象
        GameObject[] go2 = Selection.gameObjects;//獲取所喲被選中的遊戲對象
 Transform[] go4 = Selection.transforms;//獲取所喲被選中的遊戲對象的transform屬性
        object[] go3 = Selection.objects;//獲取Unity中全部被選中的資源,資源能夠是任何種類的
        object go5 = Selection.activeObject;//只能獲取Unity中全部種被選中資源的一個,資源能夠是任何種類的

 

6:編寫一個刪除物體按鈕,在物體被刪除以後是能夠撤銷這個刪除操做的。

     通常咱們本身刪除物體操做是沒法撤回的,系統的刪除物體的按鍵,刪除的物體是能夠撤銷刪除的操做的。由於系統的刪除操做在刪除以前會把刪除操做的記錄註冊到內存中,物體並無真正被刪除,咱們本身寫的刪除按鈕也能夠把刪除的記錄註冊到內存中,這樣咱們本身寫的刪除操做也是能夠撤銷的

Undo.DestoryObjectImmediate(gameobject)//利用Undo把刪除操做註冊到內存中windows

在編輯器的腳本中刪除物體使用DestoryImmediate(gameobject)這個API編輯器

[MenuItem("Assets/tab1",false,0)] static void tab() { //這個靜態方法是實現上面設置的按鈕的功能的
 GameObject go = Selection.activeGameObject;//獲取被選中的一個物體對象,獲取的只能是遊戲對象
         Undo.DestroyObjectImmediate(go);//把刪除操做註冊要內存中,按ctrl +z能夠取消刪除
 }

 7:給咱們本身寫的按鈕添加快捷鍵

    本身設置快捷鍵時:%表明ctrl  #表明shift  &表明alt

    

[MenuItem("Assets/tab2 %t", false, 11)]//給Tab2按鍵設置Ctrl +t爲tab2按鈕的快捷鍵
    static void tab1() { }

設置的快捷鍵要與前面的按鈕名空一格。若是隻用一個按鍵做爲快捷鍵則要在按鍵前加一個下劃線

[MenuItem("Assets/tab2 _t", false, 11)] static void tab1() { }

 

8:在編輯器上的按鈕可能只能做用一些物體,對另外一些物體是不適用,當選中的是不適用的物體時,這個按鈕是禁用的。這裏須要使用menuitem的第二個參數,來判斷這個按鈕是否啓用

這兩個Maneitem是配合使用的,false以前的true是判斷按鈕能按下的條件的,在返回true時,按鈕就會被起用函數

[menuitem("assets/a",true,1)]ui

static bool delect()spa

{3d

  判斷是否知足條件,知足返回true,則按鈕能夠點擊code

  不知足就返回false 按鈕被禁用orm

}對象

[menuitem("assets/a",false,1)]blog

static void delect1()

{

//執行自定義按鈕的功能

}

[MenuItem("Assets/tab1", true, 0)] static bool tab2() { if (Selection.activeGameObject == null)//判斷是否選中物體 { return false; } else { return true;//選中物體返回true,啓用tab1按鈕組件 } } [MenuItem("Assets/tab1",false,0)] static void tab() { //這個靜態方法是實現上面設置的按鈕的功能的
 GameObject go = Selection.activeGameObject;//獲取被選中的一個物體對象,獲取的只能是遊戲對象 // GameObject.DestroyImmediate(go);//刪除這個對象
        Undo.DestroyObjectImmediate(go);//把刪除操做註冊要內存中,按ctrl +z能夠取消刪除
 }

mainitem中的True 和false 相互配合,來實現按鈕選擇性實現

9:[contextMenu(「按鍵名」)]給自定義的腳本添加按鍵   [contextMenuitem("按鍵名","要執行的方法名")]給自定義的腳本屬性添加按鍵

contextMen和contextMenuitem標籤不須要再編輯器的腳本中使用,能夠直接再要添加按鈕的腳本中使用,生成本身定義的按鈕

public class text1 : MonoBehaviour { [ContextMenuItem("addcount", "Add")]//直接在自定義腳本的屬性a添加按鈕,按鈕執行的功能是執行add方法,按鈕名是addCount
    public int a = 0; void Add() { a += 10; print(a); } [ContextMenu("TestButton")]//直接在自定義的腳本添加右鍵按鈕TestButton,執行的功能是標籤下面的方法

    void Onbutton() { print("a"); } }

 10:建立一個對話框,對話框中讀取的數據是從指定的腳本中讀取的。對話框只能從繼承ScripttableWizard類的類中讀取數據,建立對話框的腳本也是編輯器腳本

       建立對話框的函數是scriptTableWrizard.DisplayWizard<存儲數據的腳本,腳本要繼承ScripttableWizard的類>("對話框的名稱");

using UnityEditor; public class CreateEdior :ScriptableWizard { [MenuItem("Assets/tab3",false,2)]//建立tab3按鈕
    static void tab3() { ScriptableWizard.DisplayWizard<CreateEdior>("修改數據");//建立對話框,讀取CreateEditor腳本的數據,文本框的名字爲「修改數據」
 } public float speed;//CreateEditor腳本中的數據
    public int index; [MenuItem("Assets/tab4", false, 3)]//建立tab4按鈕
    static void tab4()//建立對話框
 { ScriptableWizard.DisplayWizard<stab>("修改數據"); } } public class stab:ScriptableWizard//文本框要交互的數據
{ public int a = 10; public int b = 19; }

11:在建立的對話框中建立按鈕,觸發點擊事件  ScriptTableWizard.DisplayWizard<存儲數據的腳本,腳本要繼承ScripttableWizard的類>("對話框的名稱",「在對話框中建立的按鈕名」)  這個按鈕是綁定固定的方法 OnWizardCreate(),按鈕被點擊時觸發這個方法

public float speed;//CreateEditor腳本中的數據
    public int index; [MenuItem("Assets/tab3",false,2)]//建立tab3按鈕
    static void tab3() { ScriptableWizard.DisplayWizard<CreateEdior>("修改數據","CreatButton");//建立對話框,讀取CreateEditor腳本的數據,文本框的名字爲「修改數據」
 } void OnWizardCreate()//對話框的按鈕被點擊時,觸發這個方法
 { GameObject[] enemy = Selection.gameObjects;//獲取全部被選中的對象
        foreach (var go in enemy) { if(go.transform.tag=="enemy")//獲取選中標籤爲enemy的物體
 { text1 text2 = go.GetComponent<text1>();//獲取他們的text1腳本
                text2.a = index;//用對話框的index值修改獲取對象的腳本值
 } } } 

 12:OnWizardUpdate()  和 OnSelectionChange()

 OnWizardUpdate()咱們修改對話框中的字段或值時,就會調用這個方法

 OnSelectionChange()當咱們更改選中的對象時,就會觸發這個方法

/// <summary>
    /// 替換被選中的對象時就會觸發這個方法 /// </summary>
    void OnSelectionChange() { Debug.Log(Selection.activeGameObject.name);//打印出被選中的一個遊戲對象的名字
 } /// <summary>
    /// 對話框打開時觸發這個方法,對話框中字段一改動就執行該方法 /// </summary>
    void OnWizardUpdate() { Debug.Log(index); }

 

13: otherButton,建立對話框的第二個按鈕,OnwizardotherButton這個方法綁定這個按鈕,對話框的第一個按鈕在按下以後對話框就會關閉,但第二個按鈕按下對話框不會關閉

建立第二個按鈕  ScriptTableWiazrd.DisplayWiazid<script>("對話框的名字",「第一個按鈕名」,「第二個按鈕名」)

第一個按鈕名 觸發的方法OnWiazrdCreate()

第二個按鈕名 觸發的方法OnWiazrdotherButton()

[MenuItem("Assets/tab3",false,2)]//建立tab3按鈕
    static void tab3() { ScriptableWizard.DisplayWizard<CreateEdior>("修改數據","CloseButton","otherButton");//建立對話框,讀取CreateEditor腳本的數據,文本框的名字爲「修改數據」
 } void OnWizardCreate()//對話框的CloseButton按鈕被點擊時,觸發這個方法
 { Debug.Log("對話框已關閉"); } void OnWizardOtherButton()//對話框的otherButton按鈕被點擊時,觸發這個方法
 { GameObject[] enemy = Selection.gameObjects;//獲取全部被選中的對象
        foreach (var go in enemy) { if (go.transform.tag == "enemy")//獲取選中標籤爲enemy的物體
 { text1 text2 = go.GetComponent<text1>();//獲取他們的text1腳本
                Undo.RecordObject(text2, "change");//把text2這個類的數據存儲起來,類修改後,能夠ctrl +z恢復到如今記錄的類的數據
                text2.a = index;//用對話框的index值修改獲取對象的腳本值
 } } } 

 

14:記錄一個類的數據,在類被修改後,能夠用Ctrl +z撤銷修改類中數據的操做 Undo.Recordobject(類名,「這個操做在內存中的名字,是本身隨便起的」)

void OnWizardCreate()//對話框的按鈕被點擊時,觸發這個方法
 { GameObject[] enemy = Selection.gameObjects;//獲取全部被選中的對象
        foreach (var go in enemy) { if(go.transform.tag=="enemy")//獲取選中標籤爲enemy的物體
 { text1 text2 = go.GetComponent<text1>();//獲取他們的text1腳本
                Undo.RecordObject(text2, "change");//把text2這個類的數據存儲起來,類修改後,能夠ctrl +z恢復到如今記錄的類的數據
                text2.a = index;//用對話框的index值修改獲取對象的腳本值
 } } }

15:對話框的提示字符和錯誤警告提示字符     helpString 提示字符串    errorString 錯誤提示符

16:ShowNotification顯示提示信息。這個函數只能在對話框中顯示提示信息。

     

void OnWizardOtherButton()//對話框的otherButton按鈕被點擊時,觸發這個方法
 { int a = 0; GameObject[] enemy = Selection.gameObjects;//獲取全部被選中的對象
        foreach (var go in enemy) { a++; if (go.transform.tag == "enemy")//獲取選中標籤爲enemy的物體
 { text1 text2 = go.GetComponent<text1>();//獲取他們的text1腳本
                Undo.RecordObject(text2, "change");//把text2這個類的數據存儲起來,類修改後,能夠ctrl +z恢復到如今記錄的類的數據
                text2.a = index;//用對話框的index值修改獲取對象的腳本值
 } } ShowNotification(new GUIContent(Selection.objects.Length + "個物體值被修改"));//按下第二個按鈕,會顯示提示信息
    }

 

17:使用EditorPerfabs保存彈出窗口中修改的數據

保存int 類型的值 Editorperfabs.setint("保存到這個字段",要被保存的字段)

調用這個被保存的Int 類型的值 Editorperfabs.GetInt("保存到的新字段",第一次打開這個對話框的顯示值)

void OnEnable() { index= EditorPrefs.GetInt("IndexKey", index);//在窗口被打開時,第一次使用index賦值給index,之後再打開就把保存的indexkey值賦予index,這樣就完成保存每次修改的Index的值
 } EditorPrefs.SetInt("IndexKey", index);//把面板中修改的index值,保存到IndexKey中

 

18:顯示進度條,使用EditorUtility.DisplayProgressBar("標題",「下標題」,進度),關閉EditorUtility.clearProgressBar()進度條

foreach (var go in enemy) { a++; if (go.transform.tag == "enemy")//獲取選中標籤爲enemy的物體
 { text1 text2 = go.GetComponent<text1>();//獲取他們的text1腳本
                Undo.RecordObject(text2, "change");//把text2這個類的數據存儲起來,類修改後,能夠ctrl +z恢復到如今記錄的類的數據
                text2.a += index;//用對話框的index值修改獲取對象的腳本值
                EditorPrefs.SetInt("IndexKey", index);//把面板中修改的index值,保存到IndexKey中
 } EditorUtility.DisplayProgressBar("進度", a + "/" + enemy.Length, a / enemy.Length);//顯示修改數值的進度
 } EditorUtility.ClearProgressBar();//修改數值結束,關閉進度條

 20:建立自定義的窗口 建立自定義的窗口腳本繼承EditorWindows腳本,用MyWindow腳本對象的show方法,實現建立窗口

using UnityEditor; public class WindowEdior : EditorWindow { //腳本繼承editorWindow
    [MenuItem("windows/createWindows",false,1)]//建立createwindows按鍵,實現建立窗口的功能
    static void create() { WindowEdior window = EditorWindow.GetWindow<WindowEdior>();//建立窗口
        window.Show();//顯示窗口
 } }
相關文章
相關標籤/搜索