Unity3D Editor 扩展
官方教程:鏈接
EditorLayout API:鏈接
Handles API:鏈接
?
1.首先來(lái)個(gè)Inspector面板Editor的實(shí)現(xiàn)
要實(shí)現(xiàn)一個(gè)組件在Inspector中的Editor功能,首先需要寫(xiě)一個(gè)編輯器類:
要點(diǎn):
1.繼承Editor
2.放在Editor文件夾中
3.在類的頭部寫(xiě)[CustomEditor(typeof(你要實(shí)現(xiàn)編輯的組件的類名))]
4.復(fù)寫(xiě)OnInspectorGUI函數(shù)(此函數(shù)僅在Inspector刷新時(shí)自動(dòng)調(diào)用),然后在函數(shù)里實(shí)現(xiàn)編輯器功能的拓展實(shí)現(xiàn)。例如GUILayout.Label("Hello World");
5.通過(guò)target as ‘你的類名’ 來(lái)實(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表示沒(méi)有。
第三個(gè)參數(shù)的2表示此網(wǎng)格分為2列,具體如圖:
?
4.折頁(yè)
首先用這句:
showState = EditorGUILayout.Foldout(showState, "State List"); 參數(shù)分別為是否打開(kāi),顯示標(biāo)簽的名字
其實(shí)折頁(yè)就相當(dāng)于一個(gè)toggle按鈕,并不做任何事,只是你按下它,它會(huì)返回一個(gè)是否折開(kāi)或者合并的結(jié)果,
然后自己再根據(jù)這個(gè)結(jié)果顯示對(duì)應(yīng)內(nèi)容來(lái)達(dá)到折頁(yè)效果。
if (showState) {GUILayout.Label("內(nèi)容", EditorStyles.inspectorDefaultMargins); }// 為了模擬折頁(yè)后的子層級(jí)的樹(shù)狀縮進(jìn)結(jié)構(gòu),我門(mén)用EditorStyles.inspectorDefaultMargins這中設(shè)置來(lái)將內(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來(lái)初始化我的新風(fēng)格 topStyle.fontStyle = FontStyle.Bold; // 新Style的字體為粗體 topStyle.fontSize = 20; topStyle.richText = true; // 允許富文本?
6.再來(lái)個(gè)Scene面板的Editor實(shí)現(xiàn)
基本與Inspector面板Editor的寫(xiě)法一樣,只不過(guò)Scene面板的更新函數(shù)是OnSceneGUI,與之對(duì)應(yīng)的是
Inspector面板的更新函數(shù)OnInspectorGUI。
甚至可以在同一個(gè)腳本里同時(shí)實(shí)現(xiàn)Inspector與Scene面板的Editor功能。
要點(diǎn):
1.在OnSceneGUI()中只能通過(guò)Handles來(lái)繪制新視圖,如果你想引入GUI的元素哪么就需要使用BeginGUI()和EndGUI()組合的使用。
2.同Inspector一樣,僅在持有該腳本的對(duì)象被選擇時(shí)才激活。
?eg:
void OnSceneGUI() {//得到test腳本的對(duì)象Test test = (Test) target;//在Scene視圖中,在該對(duì)象本身的位置畫(huà)一個(gè)坐標(biāo)軸,但畫(huà)自身坐標(biāo)軸的意義不大,因?yàn)樽陨碜鴺?biāo)軸在被選中時(shí)本來(lái)就會(huì)畫(huà)出來(lái)。但可以用來(lái)顯示其他對(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() );//開(kāi)始繪制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是常見(jiàn)的DebugDraw方式之一,可方便地在Editor里繪制線段,射線,方塊之類的
用法:Gizmos只能用于OnDrawGizmos函數(shù)里,該函數(shù)跟Start,Update一樣會(huì)自動(dòng)調(diào)用
但是一般情況下,繪制函數(shù)里的參數(shù)只有'center','size'之類的,繪制出來(lái)的圖形是沒(méi)有角度的,
如果有需要繪制旋轉(zhuǎn)過(guò)的圖形,例如一個(gè)跟隨攝影機(jī)旋轉(zhuǎn)的Cube
那么就需要利用Gizmos的重要參數(shù)——matirx,
這是Gimos的繪制矩陣,繪制的圖形信息在這里,要縮放,旋轉(zhuǎn)Gizmos繪制出來(lái)的圖形,
只需要改變矩陣即可。
void OnDrawGizmos(){Vector3 size = new Vector3(half.x * 2, half.y * 2, half.z * 2);// 變換矩陣Matrix4x4 trs = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);Gizmos.matrix = trs;// 在該Transform的Vector3.zero處繪制一個(gè)位置、角度、縮放均與該Transform一樣的方塊,大小為size Gizmos.DrawCube(Vector3.zero, size);// 復(fù)位Gizmos設(shè)置Gizmos.matrix = Matrix4x4.identity;}?
8.Editor菜單欄快捷鍵
%代表 Ctrl
#代表 Shift
?
9.手動(dòng)將Scene標(biāo)志為“修改過(guò)的”
有時(shí)候會(huì)動(dòng)態(tài)在Editor腳本里創(chuàng)建對(duì)象在Scene里,但是動(dòng)態(tài)創(chuàng)建之后Scene默認(rèn)是認(rèn)為場(chǎng)景沒(méi)被修改過(guò)的,
這個(gè)時(shí)候是沒(méi)法保存場(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)前所有打開(kāi)的場(chǎng)景標(biāo)志為“臟的”,即被改動(dòng)過(guò)的,這個(gè)時(shí)候在就可以Ctrl + S保存了。
EditorSceneManager.MarkAllScenesDirty();
同理,如果你通過(guò)代碼改過(guò)資源,那么也需要手動(dòng)調(diào)用AssetDatabase.Refresh?刷新下編輯器。
轉(zhuǎn)載于:https://www.cnblogs.com/jeason1997/p/5109541.html
總結(jié)
以上是生活随笔為你收集整理的Unity3D Editor 扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Effective C++ 条款44
- 下一篇: Android 开源项目android-