Unity自定义Editor中SerializedProperty.enumValueIndex值无法保存求助
问题解决:SerializedProperty枚举值无法保存的原因与修复
核心问题:对象引用不匹配
你的代码里存在一个引用错误:在OnEnable方法中,获取_state属性时误用了Editor类自带的serializedObject,而非你手动初始化的_serializedObject。两者不是同一个实例,导致你修改的属性并未关联到目标对象上,自然无法保存修改。
修复步骤
- 修正
OnEnable中获取_state的代码,将serializedObject替换为_serializedObject - 移除冗余的
SetObjectDirty调用——SerializedObject.ApplyModifiedProperties()已经会自动处理标记对象为脏、保存修改的逻辑,手动调用反而可能引发冲突(尤其在新版Unity中)
修正后的自定义编辑器代码
using UnityEditor; using UnityEngine; [CustomEditor(typeof(Door))] public class DoorEditor : Editor { private Door _target; private SerializedObject _serializedObject; private SerializedProperty _state, _startPoint; private void OnEnable() { _target = (Door)target; _serializedObject = new SerializedObject(_target); _startPoint = _serializedObject.FindProperty("_startPoint"); // 修正:使用自己初始化的_serializedObject而非Editor自带的serializedObject _state = _serializedObject.FindProperty("_state"); } public override void OnInspectorGUI() { // 每次绘制前更新SerializedObject,确保属性值同步 _serializedObject.Update(); EditorGUILayout.BeginVertical("box"); _startPoint.objectReferenceValue = (Transform)EditorGUILayout.ObjectField("Start Point", _startPoint.objectReferenceValue, typeof(Transform), true); _state.enumValueIndex = (int)(DoorState)EditorGUILayout.EnumPopup("Door State", (DoorState)_state.enumValueIndex); EditorGUILayout.EndVertical(); // 应用修改,自动处理脏标记与保存 _serializedObject.ApplyModifiedProperties(); } }
额外说明
- 必须在
OnInspectorGUI开头调用_serializedObject.Update(),确保SerializedProperty的数值与目标对象的实际值同步,避免出现显示不一致的问题 - 新版Unity(2020+)中,
EditorUtility.SetDirty已被标记为过时,推荐完全使用SerializedObject/SerializedProperty的工作流来处理Inspector修改 - 你的Door组件中
_state字段已经标记了[SerializeField],完全符合SerializedProperty的访问要求,不需要额外用反射处理私有字段
内容的提问来源于stack exchange,提问作者Aiden VMR
相关产品推荐
相关产品推荐

