You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动