如何基于枚举选择更新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
相关产品推荐
相关产品推荐

