You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于枚举选择更新ScriptableObject的枚举?技能角色类型限制实现

实现方案:自定义Editor动态控制字段显示

这种动态适配角色类型的编辑器需求,用Unity的自定义Editor就能完美解决,完全不用依赖那种臃肿的全量枚举。我给你分步讲具体实现:

1. 定义基础枚举与Skill ScriptableObject

先把核心的角色类型、专属子类型和Skill本体定义好:

// 基础职业枚举
public enum CharacterClass
{
    Warrior,
    Rogue,
    Mage // 后续可扩展其他职业
}

// 战士专属子类型枚举
public enum WarriorSubclass
{
    Berserker,
    Paladin,
    Guardian
}

// Skill ScriptableObject 本体
[CreateAssetMenu(fileName = "New Skill", menuName = "Game/Skill")]
public class Skill : ScriptableObject
{
    public string skillName;
    public CharacterClass restrictedClass;

    // 用HideInInspector让它默认不显示,后续通过自定义Editor控制显示时机
    [HideInInspector]
    public WarriorSubclass restrictedWarriorSubclass;
}

2. 编写自定义Editor脚本(关键)

创建一个放在Editor文件夹下的脚本(必须放在Editor目录,避免打包报错),用来动态控制字段显示:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Skill))]
public class SkillEditor : Editor
{
    private SerializedProperty restrictedClassProp;
    private SerializedProperty restrictedWarriorSubclassProp;

    void OnEnable()
    {
        // 获取序列化属性,兼容Unity的Undo/Redo系统,确保修改能正确保存
        restrictedClassProp = serializedObject.FindProperty("restrictedClass");
        restrictedWarriorSubclassProp = serializedObject.FindProperty("restrictedWarriorSubclass");
    }

    public override void OnInspectorGUI()
    {
        // 先绘制默认的通用字段(比如skillName)
        DrawDefaultInspector();

        // 更新序列化对象状态
        serializedObject.Update();

        // 绘制职业选择下拉框
        EditorGUILayout.PropertyField(restrictedClassProp);

        // 仅当选中Warrior时,显示战士子类型选择框
        if ((CharacterClass)restrictedClassProp.enumValueIndex == CharacterClass.Warrior)
        {
            EditorGUILayout.PropertyField(restrictedWarriorSubclassProp, new GUIContent("Warrior Subclass Restriction"));
        }

        // 应用所有修改到序列化对象
        serializedObject.ApplyModifiedProperties();
    }
}

3. 扩展性说明

如果后续要给其他职业加子类型限制(比如Mage的专属子类型),只需要三步:

  • 新增对应职业的子类型枚举(如MageSubclass)
  • 在Skill类里添加[HideInInspector]标记的对应字段
  • 在SkillEditor里新增判断逻辑,当选中对应职业时显示子类型字段

这种方案的优势很明显:结构清晰,每个职业的子类型独立管理,编辑器操作直观,完全避免了单一大枚举带来的维护麻烦。

内容的提问来源于stack exchange,提问作者Dtb49

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:15:11