如何在C#中根据枚举值在Unity Inspector中显示指定变量?
如何在C#中根据枚举值在Unity Inspector中显示指定变量?
嘿,这个需求我之前也碰到过,在Unity里要实现根据枚举值动态控制Inspector显示的属性,用自定义编辑器扩展就能轻松搞定,下面给你两种靠谱的实现方式:
首先先确认你的原有代码没问题,就是这个枚举和Match3类:
public enum Gamemode { ClassicMoves = 0, Classic = 1 }; public class Match3 : MonoBehaviour { public Gamemode gamemode; public int moveLimit = 15; public int timeLimit = 30; }
接下来要写编辑器脚本,注意这类脚本必须放在项目里的Editor文件夹下(没有的话手动新建一个就行),因为它只在Unity编辑器环境中生效。
方式一:直接操作实例属性(简单直观)
这种方式代码量少,适合快速实现需求:
using UnityEditor; using UnityEngine; [CustomEditor(typeof(Match3))] public class Match3Editor : Editor { public override void OnInspectorGUI() { // 获取当前选中的Match3脚本实例 Match3 match3 = (Match3)target; // 先绘制游戏模式的枚举选择框 match3.gamemode = (Gamemode)EditorGUILayout.EnumPopup("游戏模式", match3.gamemode); // 根据选中的模式显示对应的限制字段 switch (match3.gamemode) { case Gamemode.ClassicMoves: match3.moveLimit = EditorGUILayout.IntField("移动次数限制", match3.moveLimit); break; case Gamemode.Classic: match3.timeLimit = EditorGUILayout.IntField("时间限制", match3.timeLimit); break; } // 保存修改,确保Unity能识别到属性变化 if (GUI.changed) { EditorUtility.SetDirty(match3); } } }
方式二:使用SerializedProperty(推荐,更规范)
这种方式利用Unity的序列化系统,能自动处理撤销/重做操作,也更符合编辑器扩展的最佳实践:
using UnityEditor; using UnityEngine; [CustomEditor(typeof(Match3))] public class Match3Editor : Editor { // 声明序列化属性,对应Match3里的字段 private SerializedProperty gamemodeProp; private SerializedProperty moveLimitProp; private SerializedProperty timeLimitProp; private void OnEnable() { // 初始化序列化属性,绑定到对应字段 gamemodeProp = serializedObject.FindProperty("gamemode"); moveLimitProp = serializedObject.FindProperty("moveLimit"); timeLimitProp = serializedObject.FindProperty("timeLimit"); } public override void OnInspectorGUI() { // 更新序列化对象,同步最新的属性值 serializedObject.Update(); // 绘制游戏模式枚举 EditorGUILayout.PropertyField(gamemodeProp); // 根据当前枚举值判断显示哪个字段 Gamemode currentMode = (Gamemode)gamemodeProp.enumValueIndex; switch (currentMode) { case Gamemode.ClassicMoves: EditorGUILayout.PropertyField(moveLimitProp); break; case Gamemode.Classic: EditorGUILayout.PropertyField(timeLimitProp); break; } // 应用所有修改,确保生效 serializedObject.ApplyModifiedProperties(); } }
写完脚本后回到Unity编辑器,选中挂载了Match3脚本的物体,就能看到效果了:选ClassicMoves时只显示移动次数限制,选Classic时只显示时间限制~
备注:内容来源于stack exchange,提问作者MatthewGameDev




