編輯器簡介: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();//顯示窗口 } }