2021-04-23

Unity Inspector界面按需要显示元素

在自制Button来简单快捷开启关闭GameObject状态的时候,遇到了一些情况。

比如点击按钮,按钮所在的整个UI状态关闭,并且打开某一物体显示状态。此时Inspector界面会显示一些不需要用到的引用。尽管不会报错,但是看起来不好看。

于是我在想有没有一种Unity自带的方法坐到:根据枚举类型显示合适的待引用物体。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


/// <summary>
/// 快捷改变物体显示/隐藏的脚本
/// </summary>
public class OpenCloseObj : MonoBehaviour
{

    public enum ChangeType
    {
        Open,
        Close,
        OpenClose,
    }

    [Header("需要改变的类型")]
    public ChangeType changeType;


    private Button CurrentObj;

    [Header("需要操作的物体")]
    public GameObject TargetObj;

    [Header("需要被打开的物体")]
    public List<GameObject> OpenObj;
    [Header("需要被关闭的物体")]
    public List<GameObject> CloseObj;
    // Start is called before the first frame update
    void Start()
    {
        CurrentObj = transform.GetComponent<Button>();


        CurrentObj.onClick.AddListener(() =>
        {
            switch (changeType)
            {
                case ChangeType.Open:
                    TargetObj.SetActive(true);
                    break;
                case ChangeType.Close:
                    TargetObj.SetActive(false);
                    break;
                case ChangeType.OpenClose:
                    foreach (var item in OpenObj)
                    {
                        item.SetActive(true);
                    }
                    foreach (var item in CloseObj)
                    {
                        item.SetActive(false);
                    }
                    break;
                default:
                    break;
            }
        });
    }


}

经过搜索,需要建立一个Editor文件夹,该文件位于Asset文件夹下根节点或者任意文件夹下都可。
注意:继承自Editor

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(OpenCloseObj))]
public class OpenCloseInspector : Editor
{

    private SerializedObject TargetSerialized;//序列化
    private SerializedProperty changeType, TargetObj, OpenObj, CloseObj;//定义类型
    void OnEnable()
    {


        TargetSerialized = new SerializedObject(target);
        changeType = TargetSerialized.FindProperty("changeType");//获取changeType
        TargetObj = TargetSerialized.FindProperty("TargetObj");//获取TargetObj
        OpenObj = TargetSerialized.FindProperty("OpenObj");//获取OpenObj
        CloseObj = TargetSerialized.FindProperty("CloseObj");//获取CloseObj
    }
    public override void OnInspectorGUI()
    {
        TargetSerialized.Update();//更新
        EditorGUILayout.PropertyField(changeType);
        if (changeType.enumValueIndex == 0)
        {//当选择第一个枚举类型
            EditorGUILayout.PropertyField(TargetObj);
        }
        else if (changeType.enumValueIndex == 1)
        {
        //当选择第二个枚举类型
            EditorGUILayout.PropertyField(TargetObj);

        }
        else if (changeType.enumValueIndex == 2)
        {
        //当选择第三个枚举类型
            EditorGUILayout.PropertyField(OpenObj);
            EditorGUILayout.PropertyField(CloseObj);
        }
        //serializedObject.ApplyModifiedProperties();
        TargetSerialized.ApplyModifiedProperties();//应用
    }

}

这样选择第一种枚举类型,完整Inspector界面如下
第一种枚举类型

这样选择第二种枚举类型,完整Inspector界面如下
第一种枚举类型

确实感觉清爽了一些……


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值