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。例如
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,中文名和弦。目前在整理中。