在Unity下扩展我们的Inspector窗口

我们写的每一个可以挂在GameObject上的脚本,都会在Inspector窗口中显示部分变量,这是由UnityEditor.Editor类为我们实现的功能,如果我们想在Inspector窗口中展示更多内容,就必须手写自定义的Editor类,并覆盖UnityEditor.Editor类的OnInspectorGUI()方法。

自定义的Editor确实强大,但是不够通用,到处都要写Editor类是一个很烦的事情。本人一直都有2个通用需求,一个是显示Property,一个是显示可调用方法的按钮。写一个实现该需求的Editor类很容易,但是如果能只用写一个Editor,然后所有继承MonoBehaviour的脚本都会自动绑定该Editor就好了。

后来我找到了一个名叫Odin的Unity插件,它实现了自动绑定脚本到OdinEditor(它提供的自定义Editor)的功能,不过由于它的功能过于强大,我用不上那么多的功能,于是参考了它的实现代码,写了个MadEditor,提供了显示Property和方法按钮的功能。下面是界面展示:

下面说说原理:

Unity编辑器会检查所有Editor类的派生类,如果某个Editor有CustomEditorAttribute并指定了脚本Type,就会把该脚本类型和Editor类型的特殊关系记录下来,当需要在Inspector中显示脚本时,编辑器会先查找是否有对应的Editor,有就创建该Editor的实例,没有则创建默认Editor。

我们所需要做的,就是在启动编辑器时,用反射查找所有MonoBehaviour和Editor类型,然后找到那些没有指定Editor的MonoBehaviour,将它们与我们的自定义Editor绑定,完毕。

因为这些方法都在UnityEditor的内部,所以我们只能用反射调用实现,万幸Unity和Odin都提供了源代码^_^

再说下创建方法按钮的原理,我们在Editor启动时,用反射检查target的所有方法,如果某个方法绑定了指定的Attribute,我们就记下该方法的MethodInfo,显示界面时,每有一个MethodInfo我们就画一个按钮,如果该按钮被点击,我们就Invoke该MethodInfo,完毕。

而显示Property的原理也差不多,就不赘述了。

最后提供代码下载:https://pan.baidu.com/s/1GMrQBPvoOT7y6xKEnfYopA   密码:cp79

猜你喜欢

转载自blog.csdn.net/lzdidiv/article/details/81536703