UnityEditor自定义脚本的Inspector

前言

自定义inspector脚本界面是一个比较实用开发技巧,本篇博客用于记录我实际用到过的相关知识(不定期更新)。

基本知识

1.Editor开发需要引用UnityEditor
2.自定义界面的类前面需要加上特性 [CustomEditor(typeof(“需要编辑的类名”))]
3.覆写界面的类是一个独立的类,一会下面示例中可以看到,类名随意
4.这个类要继承Editor
5.编辑器类要放在Editor文件夹中,不然项目打包的时候会报错。或者在类的前面加上 #if UNITY_EDITOR,判断当前的环境,具体参照下面示例。二者任选其一

1.根据枚举显示内容和

代码

public enum TestEnum
{
    A,
    B
}
///要被重写界面的类
public class Test : MonoBehaviour
{
    public TestEnum t;
    public int num;
    public float f;
    public Vector3 v;
}

#if UNITY_EDITOR
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    public override void OnInspectorGUI()
    {
        var test = target as Test;//可以用test访问Test类的内容
        
		//在面板显示枚举t,这里记得要赋值,不然会导致界面与数据分离
        test.t = (TestEnum)EditorGUILayout.EnumPopup("type",test.t);

        switch (test.t)
        {
            case TestEnum.A:
                test.num = EditorGUILayout.IntField("int",test.num);//显示int
                test.f = EditorGUILayout.FloatField("float",test.f);//显示float
                break;
            case TestEnum.B:
                test.v = EditorGUILayout.Vector3Field("vector3",test.v);//显示Vector3
                break;
        }
    }
}
#endif

效果
在这里插入图片描述
在这里插入图片描述
还有另一种方式可以实现同样的效果,暂时不清楚两种方式的区别。个人更喜欢第一种。
代码

#if UNITY_EDITOR
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    private SerializedObject thisClass;
    private SerializedProperty type;
    private SerializedProperty num;
    private SerializedProperty v;
    private SerializedProperty f;

    private void OnEnable()
    {
        thisClass = new SerializedObject(target);
        type = thisClass.FindProperty("t");
        num = thisClass.FindProperty("num");
        f = thisClass.FindProperty("f");
        v = thisClass.FindProperty("v");

    }
    public override void OnInspectorGUI()
    {
        thisClass.Update();//更新面板信息

        EditorGUILayout.PropertyField(type);
        if(type.enumValueIndex == 0)
        {
            EditorGUILayout.PropertyField(num);
            EditorGUILayout.PropertyField(f);
        }
        if(type.enumValueIndex == 1)
        {
            EditorGUILayout.PropertyField(v);
        }

        //应用修改后的数据,不调用无法赋值
        thisClass.ApplyModifiedProperties();
	}
}
#endif

显示数组和List

if UNITY_EDITOR
[CustomEditor(typeof(SkillTreePanel))]
public class SkillTreePanelEditorInspector : Editor
{
    //序列化对象
    private SerializedObject _serializedObject;
    //序列化属性
    private SerializedProperty _assetLstProperty;

    public override void OnInspectorGUI()
    {
        var t = target as SkillTreePanel;//目标类

        //使用当前类初始化
        _serializedObject = new SerializedObject(t);
        //获取当前类中可序列化的属性
        _assetLstProperty = _serializedObject.FindProperty("skillDatas"); //将类中skillDatas变量序列化
        EditorGUILayout.PropertyField(_assetLstProperty, true); //显示
        
		_serializedObject.ApplyModifiedProperties(); //应用修改
    }
}
#endif

2.在脚本界面显示button,点击执行对应方法

这个按钮无论是否运行中都能执行。
代码

        if (GUILayout.Button("TestButton"))
        {
            Debug.Log("Test");
        }

效果
在这里插入图片描述
点击后
在这里插入图片描述

GUI、GUILayout、EditorGUI、EditorGUILayout使用介绍

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值