抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

简介

有时候我们需要在某个功能开启的情况下编辑一些参数,这时候就可以自定义 Inspector 面板的显示逻辑来实现这一需求。

原理

Unity 提供自定义编辑器的功能,通过使用属性标签[CustomEditor(typeof(CustomClass))]定义一个编辑器类来自定义我们需要的 Inspector 显示。如果需要多选编辑的话,只要再加一个属性标签[CanEditMultipleObjects]即可。

实现

我们需要一个原始的 MonoBehaviour 类,以及一个派生 Editor 的类,即我们自定义修改某一 MonoBehaviour 类显示面板的类。

假设我们有一个 MonoBehaviour 类如下:

MonoBehaviour类
1
2
3
4
5
6
using UnityEngine;
public class Test : MonoBehaviour
{
public bool _isShow = false;
public int _initNum = 0;
}

我们要实现如下需求:当_isShow 为 true 的时候在面板上显示_initNum。

我们需要这样一个 Editor 类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEditor;

[CustomEditor(typeof(Test))]
[CanEditMultipleObjects]
public class TestEditor : Editor
{
public override void OnInspectorGUI()
{
Test test = (Test)target;

test._isShow = EditorGUILayout.Toggle("是否显示", test._isShow);
if(test._isShow)
{
EditorGUI.indentLevel++;
test._initNum = EditorGUILayout.IntField("InitNum", test._initNum);
EditorGUI.indentLevel--;
}
}
}

Editor 类的编写方式和普通的 Editor 拓展一样,需要注意的是没有写的属性也不会出现在 Inspector 中,这个类相当于完全接管原来的面板显示逻辑。

为了更好分辨面板属性层级,我们也可以用EditorGUI.indentLevel来缩进。或者使用EditorGUILayout.Space(),根据具体情况即可。

当然,显示属性的方法也可以和官方文档一样。具体直接看官方文档即可。

评论