Unity3D Editor 擴(kuò)展細(xì)節(jié)

1.首先來個(gè)Inspector面板Editor的實(shí)現(xiàn)
要實(shí)現(xiàn)一個(gè)組件在Inspector中的Editor功能,首先需要寫一個(gè)編輯器類:


要點(diǎn)
1.繼承Editor
2.放在Editor文件夾中
3.在類的頭部寫[CustomEditor(typeof(你要實(shí)現(xiàn)編輯的組件的類名))]
4.復(fù)寫OnInspectorGUI函數(shù)(此函數(shù)僅在Inspector刷新時(shí)自動(dòng)調(diào)用),然后在函數(shù)里實(shí)現(xiàn)編輯器功能的拓展實(shí)現(xiàn)。例如GUILayout.Label("Hello World");
5.通過target as ‘你的類名’ 來實(shí)現(xiàn)引用你要擴(kuò)展的組件的類的具體對(duì)象。

2.GUILayoutOption
EditorGUILayout 與 EditorGUI功能基本差不多,它是EditorGUI的自動(dòng)布局版本,用它可以快速創(chuàng)建默認(rèn)UI,若要自定義UI樣式,應(yīng)該使用EditorGUI并傳入GUIStyle等參數(shù)
GUILayoutOption是一種GUI布局方式的設(shè)置,常在GUILayout的具體控件中看到,
例如,


的最后一個(gè)參數(shù)便是一些GUILayoutOption不定參,表示可以有多個(gè)設(shè)置方案。
注意:GUILayoutOption只是表示是設(shè)置方案的意思,并不是代表有GUILayoutOption這種設(shè)置方法,GUILayoutOption其實(shí)是個(gè)空類,
具體的設(shè)置方案由具體決定。
例如:
GUILayout.Label("Hello World"), EditorStyles.helpBox);
GUILayout.Label("Hello World")表示在面板上顯示一條內(nèi)容為“Hello World”的Label,(下圖第一條)
而EditorStyles.helpBox則表示此Label的顯示方式是以幫助框的形式顯示(下圖第二條)

更多的GUILayoutOption:

EditorStyles.boldLabel

EditorStyles.centeredGreyMiniLabel

EditorStyles.radioButton

EditorStyles.whiteBoldLabel

3.GUILayout 之 SelectionGrid
設(shè)置一個(gè)網(wǎng)格按鈕,并返回按鈕的序號(hào)。
string[] text = { "1", "2", "3", "4" };Debug.Log(GUILayout.SelectionGrid(-1, text, 2) + " has been choose.");
按鈕可以是文字(上面的1,2,3,4四個(gè)按鈕),也可以是圖片等。
第一參數(shù)的-1表示按鈕哪個(gè)被按下,如果為0,則表示第一按鈕顯示為被按下,-1表示沒有。
第三個(gè)參數(shù)的2表示此網(wǎng)格分為2列,具體如圖:

4.折頁
首先用這句:
showState = EditorGUILayout.Foldout(showState, "State List"); 參數(shù)分別為是否打開,顯示標(biāo)簽的名字
其實(shí)折頁就相當(dāng)于一個(gè)toggle按鈕,并不做任何事,只是你按下它,它會(huì)返回一個(gè)是否折開或者合并的結(jié)果,
然后自己再根據(jù)這個(gè)結(jié)果顯示對(duì)應(yīng)內(nèi)容來達(dá)到折頁效果。

if (showState){  GUILayout.Label("內(nèi)容", EditorStyles.inspectorDefaultMargins);}
// 為了模擬折頁后的子層級(jí)的樹狀縮進(jìn)結(jié)構(gòu),我門用EditorStyles.inspectorDefaultMargins這中設(shè)置來將內(nèi)容向右縮進(jìn)。

5.自定義自己的GUIStyle
在2中我們知道了如何用GUIStyle擴(kuò)展GUILayout的各種控件的樣式,但我們用的都是EditorStyles附帶的風(fēng)格,
這個(gè)EditorStyles是系統(tǒng)用的,我們只能用里面的風(fēng)格,不能修改(其實(shí)也可以改,但改后會(huì)將系統(tǒng)其他所以使用該風(fēng)格的地方都改)。
為了定制我們自己的風(fēng)格,其實(shí)我們可以自己創(chuàng)建一個(gè)GUIStyle。

GUIStyle topStyle = new GUIStyle(EditorStyles.centeredGreyMiniLabel);  // 這里我用EditorStyles的centeredGreyMiniLabel來初始化我的新風(fēng)格
topStyle.fontStyle = FontStyle.Bold;                       // 新Style的字體為粗體
topStyle.fontSize = 20;
topStyle.richText = true;                              // 允許富文本

6.再來個(gè)Scene面板的Editor實(shí)現(xiàn)
基本與Inspector面板Editor的寫法一樣,只不過Scene面板的更新函數(shù)是OnSceneGUI,與之對(duì)應(yīng)的是
Inspector面板的更新函數(shù)OnInspectorGUI。
甚至可以在同一個(gè)腳本里同時(shí)實(shí)現(xiàn)Inspector與Scene面板的Editor功能。
要點(diǎn):
1.在OnSceneGUI()中只能通過Handles來繪制新視圖,如果你想引入GUI的元素哪么就需要使用BeginGUI()和EndGUI()組合的使用。
2.同Inspector一樣,僅在持有該腳本的對(duì)象被選擇時(shí)才激活。

void OnSceneGUI() 
{
  //得到test腳本的對(duì)象
  Test test = (Test) target;
  //在Scene視圖中,在該對(duì)象本身的位置畫一個(gè)坐標(biāo)軸,但畫自身坐標(biāo)軸的意義不大,因?yàn)樽陨碜鴺?biāo)軸在被選中時(shí)本來就會(huì)畫出來。但可以用來顯示其他對(duì)象的坐標(biāo)軸。
  Handles.PositionHandle(fsm.test.transform.position, Quaternion.identity);
  //在場(chǎng)景中GameObject所在的位置繪制文本框,內(nèi)容為該GO的坐標(biāo)
  Handles.Label(test.transform.position + Vector3.up*2, test.transform.name +" : "+ test.transform.position.ToString() );
  //開始繪制GUI
  Handles.BeginGUI();
  //規(guī)定GUI顯示區(qū)域
  GUILayout.BeginArea(new Rect(100, 100, 100, 100));
  //GUI繪制一個(gè)按鈕
  if(GUILayout.Button("這是一個(gè)按鈕!"))
      Debug.Log("test");
  //GUI繪制文本框
  GUILayout.Label("我在編輯Scene視圖");    
  GUILayout.EndArea();
  Handles.EndGUI();
 }

7.利用Gizmos在Editor里繪制圖形
Gizmos是常見的DebugDraw方式之一,可方便地在Editor里繪制線段,射線,方塊之類的
用法:Gizmos只能用于OnDrawGizmos函數(shù)里,該函數(shù)跟Start,Update一樣會(huì)自動(dòng)調(diào)用


但是一般情況下,繪制函數(shù)里的參數(shù)只有'center','size'之類的,繪制出來的圖形是沒有角度的,
如果有需要繪制旋轉(zhuǎn)過的圖形,例如一個(gè)跟隨攝影機(jī)旋轉(zhuǎn)的Cube

那么就需要利用Gizmos的重要參數(shù)——matirx,
這是Gimos的繪制矩陣,繪制的圖形信息在這里,要縮放,旋轉(zhuǎn)Gizmos繪制出來的圖形,
只需要改變矩陣即可。

void OnSceneGUI() 
{
  //得到test腳本的對(duì)象
  Test test = (Test) target;
  //在Scene視圖中,在該對(duì)象本身的位置畫一個(gè)坐標(biāo)軸,但畫自身坐標(biāo)軸的意義不大,因?yàn)樽陨碜鴺?biāo)軸在被選中時(shí)本來就會(huì)畫出來。但可以用來顯示其他對(duì)象的坐標(biāo)軸。
  Handles.PositionHandle(fsm.test.transform.position, Quaternion.identity);
  //在場(chǎng)景中GameObject所在的位置繪制文本框,內(nèi)容為該GO的坐標(biāo)
  Handles.Label(test.transform.position + Vector3.up*2, test.transform.name +" : "+ test.transform.position.ToString() );
  //開始繪制GUI
  Handles.BeginGUI();
  //規(guī)定GUI顯示區(qū)域
  GUILayout.BeginArea(new Rect(100, 100, 100, 100));
  //GUI繪制一個(gè)按鈕
  if(GUILayout.Button("這是一個(gè)按鈕!"))
      Debug.Log("test");
  //GUI繪制文本框
  GUILayout.Label("我在編輯Scene視圖");    
  GUILayout.EndArea();
  Handles.EndGUI();
 }

8.Editor菜單欄快捷鍵



%代表 Ctrl

代表 Shift

9.手動(dòng)將Scene標(biāo)志為“修改過的”
有時(shí)候會(huì)動(dòng)態(tài)在Editor腳本里創(chuàng)建對(duì)象在Scene里,但是動(dòng)態(tài)創(chuàng)建之后Scene默認(rèn)是認(rèn)為場(chǎng)景沒被修改過的,
這個(gè)時(shí)候是沒法保存場(chǎng)景的,就算你強(qiáng)制Ctrl + S,重載場(chǎng)景后之前動(dòng)態(tài)生成的對(duì)象也會(huì)丟失(除非你在生成對(duì)象后,又手動(dòng)在場(chǎng)景里做一些修改)
那么我需要手動(dòng)調(diào)用場(chǎng)景管理器里的一個(gè)方法,將當(dāng)前所有打開的場(chǎng)景標(biāo)志為“臟的”,即被改動(dòng)過的,這個(gè)時(shí)候在就可以Ctrl + S保存了。
EditorSceneManager.MarkAllScenesDirty();
同理,如果你通過代碼改過資源,那么也需要手動(dòng)調(diào)用AssetDatabase.Refresh 刷新下編輯器。

文章轉(zhuǎn)自:http://www.cnblogs.com/jeason1997/p/5109541.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Babybus-u3d技術(shù)交流-Unity3d UnityEditor編輯器定制和開發(fā)插件 如何讓編輯器運(yùn)行你的代...
    Babybus_Unity閱讀 5,663評(píng)論 1 6
  • 首先介紹下draw call(這個(gè)東西越少你的游戲跑的越快): 在游戲中每一個(gè)被展示的獨(dú)立的部分都被放在了一個(gè)特別...
    楊夏MX閱讀 13,593評(píng)論 0 17
  • Unity3D塔防開發(fā)流程 配置環(huán)境及場(chǎng)景搭建 編程語言:C#,略懂些許設(shè)計(jì)模式,如果不了解設(shè)計(jì)模式,BUG Mo...
    Grape_葡萄閱讀 3,106評(píng)論 1 3
  • 文 蔚藍(lán)天空中的一片云 最近幾年,朋友圈開始流行曬新年計(jì)劃。幾乎在所有人長(zhǎng)長(zhǎng)的清單中都會(huì)有讀書的一席之地。我今年要...
    蔚藍(lán)天空中的一片云閱讀 393評(píng)論 1 6
  • 仇恨的力量遠(yuǎn)大于愛的力量。愛讓我們變得溫暾懈怠、快樂滿足,只有恨能讓我們?cè)谀婢持袚蜗氯?/div>
    江墨笙閱讀 117評(píng)論 0 0

友情鏈接更多精彩內(nèi)容