能否根据条件向Unity Inspector暴露指定变量?按枚举显示单个序列化字段
实现Unity Inspector根据枚举值动态显示对应字段
这个需求完全可以实现,核心是通过Unity的Editor扩展功能自定义Inspector的渲染逻辑,以下是具体实现方案:
步骤1:保留原脚本结构
基础脚本无需大幅修改,保持现有字段和枚举定义即可:
using UnityEngine; public class PaletteObject : MonoBehaviour { [SerializeField] PaletteObjectType paletteObjectType; [SerializeField] CustomTile customTile; [SerializeField] MaterialTile materialTile; [SerializeField] NewAnaglpyh anaglyphTile; [SerializeField] EffectObject effectObject; public enum PaletteObjectType { CustomTile, MaterialTile, AnaglyphTile, EffectObject } }
步骤2:编写自定义Editor脚本
在项目中创建Editor目录(无则新建),然后新建PaletteObjectEditor脚本,代码如下:
using UnityEditor; using UnityEngine; [CustomEditor(typeof(PaletteObject))] public class PaletteObjectEditor : Editor { public override void OnInspectorGUI() { PaletteObject targetObj = (PaletteObject)target; serializedObject.Update(); // 绘制枚举选择栏 SerializedProperty typeProp = serializedObject.FindProperty("paletteObjectType"); EditorGUILayout.PropertyField(typeProp); // 根据枚举值显示对应字段 switch (targetObj.paletteObjectType) { case PaletteObject.PaletteObjectType.CustomTile: EditorGUILayout.PropertyField(serializedObject.FindProperty("customTile")); break; case PaletteObject.PaletteObjectType.MaterialTile: EditorGUILayout.PropertyField(serializedObject.FindProperty("materialTile")); break; case PaletteObject.PaletteObjectType.AnaglyphTile: EditorGUILayout.PropertyField(serializedObject.FindProperty("anaglyphTile")); break; case PaletteObject.PaletteObjectType.EffectObject: EditorGUILayout.PropertyField(serializedObject.FindProperty("effectObject")); break; } serializedObject.ApplyModifiedProperties(); } }
关键说明
- 自定义Editor脚本必须放在
Editor目录下,Unity才会将其识别为编辑器扩展代码,不会打包进最终游戏包。 - 使用
serializedObject和SerializedProperty操作字段,能保证序列化数据的一致性,避免直接修改对象字段引发的异常。 - 切换枚举值时,Inspector会自动刷新,仅展示当前枚举对应的字段。
内容的提问来源于stack exchange,提问作者Geode
相关产品推荐
相关产品推荐

