「Unity3D」(1)自定义Inspector绘制默认Script

这是一个关于强迫症的故事。Unity中如果没有自定义脚本的Inspector,就会默认绘制出一个,不可编辑的脚本对应选取框。

「Unity3D」(1)自定义Inspector绘制默认Script_第1张图片

这有什么好处呢 ?鼠标点击的时候,能够在Project试图里定位脚本所在的文件夹和位置。当然如果没有,也可以鼠标右键进行Editor Script。

如果我们override了OnInspectorGUI函数,除非调用base.OnInspectorGUI父类的方法,否则是不会绘制这个脚本选择框的。UGUI自带的组件,也都没有绘制这个选择框。

「Unity3D」(1)自定义Inspector绘制默认Script_第2张图片

那么,现在我需要自定义Inspector,并且还就是想要这个默认的脚本选择框,该怎么办 ? 经过我的研究,虽然UGUI的源码没有答案,但我还是找到了一个实现的途径。

先直接看代码。

public abstract class BaseEditor : Editor
{
    protected SerializedObject serializedTarget;
    protected Object           monoScript;


    protected virtual void OnEnable()
    {
        this.serializedTarget = new SerializedObject(this.target);
        this.monoScript       = MonoScript.FromMonoBehaviour(this.target as MonoBehaviour);
    }


    protected void DrawMonoScript()
    {
        EditorGUI.BeginDisabledGroup(true);
        EditorGUILayout.ObjectField("Script",   this.monoScript, typeof(MonoScript), false);
        EditorGUI.EndDisabledGroup();
    }
}
  • 首先,我们需要知道mono的脚本,其实是一个MonoScript类型的Asset,这个类型直接继承TextAsset,作为文本文件载入的。

  • 其次,MonoScript.FromMonoBehaviour这个函数能够通过MonoBehaviour对象,找到MonoScript对象。

  • 最后,EditorGUILayout.ObjectField方法能够绘制,一个Asset的选择框。默认选择的Project视图里的文件,就是第二个参数。

  • 有些坑的是,禁用一个控件状态的函数,并不在EditorGUILayout里面,而是在EditorGUI里。BeginDisabledGroup 和 EndDisabledGroup。

现在,自定义Inspector的代码,继承BaseEditor,然后重写OnInspectorGUI就可以了。

public override void OnInspectorGUI()
{
     this.DrawMonoScript();
}

效果就是:

「Unity3D」(1)自定义Inspector绘制默认Script_第3张图片


「很好看的Script默认框」

你可能感兴趣的:(Unity3D)