Unity自定义Inspector中无法修改序列化变量值问题求助
问题原因
你的自定义Inspector代码存在核心逻辑缺失,导致speed属性修改无法生效:
- 使用
serializedObject系列API绘制可编辑属性时,没有在绘制前拉取对象最新序列化状态、绘制后提交修改,所有面板修改都是临时状态,不会被实际写入组件,自然会回弹为初始值0 - speed的
[HideInInspector]特性仅会屏蔽默认Inspector的自动绘制,不会影响序列化,属于正常写法,不是问题点
修复方案
修改自定义Editor的OnInspectorGUI方法,补充serializedObject的同步和提交逻辑即可,修复后的完整代码如下:
public class script : MonoBehaviour { [HideInInspector] public float speed; public bool usesSpeed; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { Debug.Log(speed); } [CustomEditor(typeof(script))] public class edtr : Editor { public override void OnInspectorGUI() { // 同步序列化对象的最新数据 serializedObject.Update(); base.OnInspectorGUI(); script scrpt = (script)target; if (scrpt.usesSpeed) { EditorGUILayout.LabelField("Speed stuff"); EditorGUILayout.PropertyField(serializedObject.FindProperty("speed")); } // 提交用户修改到组件,支持撤销/重做功能 serializedObject.ApplyModifiedProperties(); } } }
补充说明
如果不想用serializedObject的写法,也可以直接手动绘制字段并赋值,写法如下:
scrpt.speed = EditorGUILayout.FloatField("Speed", scrpt.speed);
该写法逻辑更直观,但默认不支持Unity的撤销重做操作,更推荐使用serializedObject的规范写法。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

