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界面如下
确实感觉清爽了一些……