轉(zhuǎn)載:http://mp.weixin.qq.com/s/-zvUnISuugjaLwW2i0G3Ig
Unity最強(qiáng)大的地方之一是它擴(kuò)展性非常強(qiáng)的編輯器扛伍。Unite Europe 2016上有一個(gè)視頻專門講編輯器編程的:這里大概記錄一下里面的關(guān)鍵點(diǎn)褥实。
場(chǎng)景一
關(guān)注點(diǎn):
1桩卵、繪制重要區(qū)域笛臣,Gizmos.DrawXXX
2打掘、OnDrawGizmos和OnDrawGizmosSelected回調(diào)函數(shù)
3棘钞、點(diǎn)擊Gizmos按鈕就可以在Game視圖也看到線框了
場(chǎng)景二
關(guān)注點(diǎn):
組織面板上的參數(shù),添加滑動(dòng)條媳荒、Header跳夭、空白等
注意到上面面板的最小面有個(gè)Camera Height陷猫,調(diào)節(jié)它可以改變攝像機(jī)的高度。這個(gè)改變是可以發(fā)生在編輯器模式下的瑰步,而且也不需要腳本添加ExecuteInEditor矢洲。這是通過實(shí)現(xiàn)自定義的Editor腳本來實(shí)現(xiàn)的:
場(chǎng)景三
關(guān)注點(diǎn):
1、自定義繪制List對(duì)象
2缩焦、使用serializedObject來修改參數(shù)的話Unity會(huì)自動(dòng)有各種幫助函數(shù)读虏,例如自動(dòng)添加Undo功能
3、如果直接修改參數(shù)的話袁滥,需要使用EditorUtility.SetDirty來告訴Unity需要保存數(shù)據(jù)
4盖桥、BeginChangeCheck()和EndChangeCheck()會(huì)檢測(cè)它們之間的GUI有沒有被修改,如果修改了的話可以據(jù)此修改參數(shù)
5题翻、Undo.RecordObject可以為下一步修改添加Undo/Redo
6揩徊、EditorUtility.DisplayDialog可以打開內(nèi)置對(duì)話框
[圖片上傳中。嵌赠。靴拱。(6)]
1、首先在面板上隱藏默認(rèn)的List繪制方法猾普,使用HideInInspector隱藏屬性:
2、為了讓PistonState可以顯示在面板上本谜,需要序列化PistonState:
3初家、實(shí)現(xiàn)自定義的繪制方程:
DrawDefaultInspector:先繪制默認(rèn)的,DrawStatesInspector:自定義繪制面板函數(shù)。
4溜在、DrawState函數(shù):
場(chǎng)景四
關(guān)注點(diǎn):
實(shí)現(xiàn)了一個(gè)可以在編輯器狀態(tài)下預(yù)覽效果的編輯器窗口
為了在編輯器狀態(tài)下可以查看到cube的運(yùn)動(dòng)陌知,我們還需要實(shí)現(xiàn)OnDrawGizmos來繪制一些線框表示運(yùn)動(dòng)。原理就是使用PreviewTime.Time來控制運(yùn)動(dòng)掖肋。
場(chǎng)景五
關(guān)注點(diǎn):
在Scene視圖中仆葡,鼠標(biāo)的位置繪制特定的Handle
場(chǎng)景六
關(guān)注點(diǎn):
在Scene視圖繪制自定義的工具條
場(chǎng)景七
關(guān)注點(diǎn):
1、可以在場(chǎng)景六的基礎(chǔ)上志笼,點(diǎn)擊相應(yīng)按鈕后增加或刪除Cube
2沿盅、新的編輯器腳本邏輯和場(chǎng)景七類似,重點(diǎn)在于回調(diào)函數(shù)OnSceneGUI:
[圖片上傳中纫溃。腰涧。。(17)]
場(chǎng)景八
關(guān)注點(diǎn):
使用Scriptable Object把一些Prefab預(yù)覽在Scene視圖上
Scriptable Object是一個(gè)相當(dāng)于自定義Assets對(duì)象的類紊浩。下面是LevelBlocks的定義窖铡。它包含了一個(gè)LevelBlockData的數(shù)組來存儲(chǔ)可選的Prefab對(duì)象。
我們之后就可以在Hierency視圖創(chuàng)建一個(gè)LevelBlock資源坊谁,Editor類則會(huì)加載這個(gè)資源來得到相應(yīng)的數(shù)據(jù)费彼。
6G%5JU`U$}3{$XK@}I9S%Q8.png