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

调用其他Editor类方法时serializedObject.FindProperty返回null如何解决

根因

  • 你定义的EditorSerializaion继承自Editor类,父类Editor自带的serializedObject属性是Unity自动为绑定了 inspected 目标对象的Editor实例初始化的。你在BaiscComponentEditor中只是声明了EditorSerializaion类型的字段,没有做任何初始化绑定操作,这个实例的serializedObject是空值,自然找不到对应属性。
  • 你直接在自定义Editor类中调用可以成功,是因为Unity已经自动为BaiscComponentEditor实例绑定了当前选中的BasicComponentScript对象,它的serializedObject是有效的。

修复方案

这里提供两种可行的修改方式,优先选择第一种更轻量易维护:

方案1:改造成通用序列化工具类(无继承)

不需要让EditorSerializaion继承Editor,调用时把当前Editor的有效serializedObject作为参数传入即可,代码修改如下:

// 改造后的工具类
public static class EditorSerializationUtil
{
    public static void DrawSerializedField(SerializedObject serializedObject, string name, string title)
    {
        SerializedProperty property = serializedObject.FindProperty(name);
        // 增加非空判断避免属性名错误时报错
        if (property != null)
        {
            EditorGUILayout.PropertyField(property, new GUIContent(title));
            serializedObject.ApplyModifiedProperties();
        }
    }
}

// 自定义Editor调用方式
[CustomEditor(typeof(BasicComponentScript))]
public class BaiscComponentEditor : Editor
{
    public override void OnInspectorGUI()
    {
        // 直接传入当前Editor的有效serializedObject
        EditorSerializationUtil.DrawSerializedField(serializedObject, "pos", "Position");
    }
}

方案2:保留Editor继承,手动初始化绑定

如果一定要保留EditorSerializaion的Editor继承关系,需要在自定义Editor的OnEnable生命周期里手动创建绑定了当前目标对象的实例:

// 原EditorSerializaion逻辑不需要修改
public class EditorSerializaion : Editor
{
    public void DrawSerializedField(string name, string title)
    {
        SerializedProperty property = serializedObject.FindProperty(name);
        EditorGUILayout.PropertyField(property, new GUIContent(title));
        serializedObject.ApplyModifiedProperties();
    }
}

// 自定义Editor补充初始化逻辑
[CustomEditor(typeof(BasicComponentScript))]
public class BaiscComponentEditor : Editor
{
    EditorSerializaion editorSerializaion;

    private void OnEnable()
    {
        // 为当前目标对象创建绑定好serializedObject的EditorSerializaion实例
        editorSerializaion = (EditorSerializaion)CreateEditor(target, typeof(EditorSerializaion));
    }

    public override void OnInspectorGUI()
    {
        editorSerializaion.DrawSerializedField("pos", "Position");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:24:02