軟件工程:Unity3D Editor類(Inspector) 編寫經驗總結

1. Editor類中的全部控件描畫,都是通過GUI完成的,所以不一定非要使用EditorGUILayout,使用GUILayout有時候更方便。

2. 因爲1, 所以我們可以使用GUI直接做一些完全自定義的描畫。例如在一張圖片上畫一個區域選擇框。

3. Inspector光標定位Bug,具體表現爲,你的代碼無錯誤,無任何提示。但Inspector的編輯光標定位卻不準。我做了一些簡單的測試:

    3.1 該問題與 Component 腳本(就是你寫的類)的編寫和 Editor 類(也就是 Inspector 的自定義類)的編寫無關。

    3.2 該問題的出現,似乎與編譯緩存有關,出現問題後,我嘗試過刪除Assets同級目錄下的obj文件夾(這個文件夾可以隨意刪除)或Library文件夾(刪除這個會導致全部的關係鏈接丟失,需要手動恢復腳本間的掛接關係),之後重新打開Unity,Inspector光標正常了。

    3.3 我還遇到過,新建一個對象,Inspector光標定位異常。關閉Unity,再次打開,正常。

    3.4 我還遇到過,前一天正常,第二天無任何修改,打開,Inspector光標定位異常。

    3.5 經過反覆測試發現,該bug似乎和MeshFilter有關。當你的Component中依賴了MeshFilter,但Mesh卻是空,就會出現該bug。例如

[RequireComponent(typeof(MeshCollider), typeof(MeshRenderer))]
public class Test : MonoBehaviour
{ 
    ……
}

    所以我將MeshFilter的添加,延遲到了Start中。

void Start()
    {
        // 沒有在定義時直接添加 MeshFilter 的依賴關係,是因爲,直接那麼做會導致Editor出錯。
        // 雖然很詭異,但不清楚原因。所以只有在Start中手動添加了。
        MeshFilter mf = GetComponent<MeshFilter>();

        if (mf == null)
            mf = gameObject.AddComponent<MeshFilter>();

        ……

     }

4. EditorGUIUtility.LookLikeControls(80f) 很有用,它可以讓所有控件的前置標籤的寬度統一。雖然不夠靈活,但至少比沒有強,不過也僅僅比沒有強一點。這句代碼可以寫在 public override void OnInspectorGUI() 中。

5. 有些資料中說,Editor的派生類不能被繼承,這個是錯誤的。你可以從Control派生出Button,然後讓Button的ButtonEditor再繼承ControlEditor,這樣可以省去很多功夫。

6. Editor寫成模板類的時候,需要小心。public class ControlEditor<T> : Editor這樣的定義,將不能編譯出正確的Inspector。

7. 編輯環境下,和運行環境下,是兩套不同的體系,爲Inspector帶來的問題是,動態數據無法直接被應用到Runtime(運行時)中。例如,你根據一個xml解析出一些數據。在編輯中,你會描畫一個文件選擇框(TextAsset對象),然後選擇一個xml文件。之後文件被解析,在ExecuteInEditMode類中,編輯時這些解析出的數據也可以正常使用。一旦你點擊了運行那個小三角,一切解析出的臨時數據都將灰飛煙滅,記得在Start或Update中檢查必要的數據,發現沒有就及時處理。所見即所得有時候只是幻覺。

8. 你可以定義一些GUIStyle,用來控制描畫樣式。這些GUIStyle可以是系統默認的,例如

GUIStyle Style = new GUIStyle(EditorStyles.toolbarButton);
也可以完全的自定義。但記得,直接修改EditorStyles.toolbarButton會讓系統所有用到該GUIStyle的地方一起變化。所以建議不要直接修改系統默認樣式。

9. 如果你在找ComboBox或List這樣的控件,不用找了,GUI中沒有,也沒給你任何自己簡單的創造。自己做吧。

10. 如果你認爲可以用一個字符串數組生成一個彈出菜單,不用做夢了,只有enum類型可以這麼做。所以如果你的菜單是動態的,那就是個噩夢啊。

11. GUI中的控件並不是以面向對象思想設計的,自然,Editor類中的描畫也就變得一塌糊塗。其底層封裝應該是類似GDI+這樣的描畫庫。但GUI的封裝做的並不好。所以很多時候,發揮創造力,自己倒騰自己需要的控件吧。



綜上,如果不是因爲編輯器類不能用別的辦法描畫,我早不用GUI了。在生產環境下,還是放棄GUI吧,有很多實用的UI擴展庫,例如EZGUI、NGUI,我自己也正在寫一套,名字叫做Chords UI,中文名和絃。目前在整理中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章