【问题标题】:Using serializedObject from another class使用另一个类的 serializedObject
【发布时间】:2021-11-12 18:05:45
【问题描述】:

我做了一个基础课

public class EditorSerializaion : Editor
    {
        public void DrawSerializedField(string name, string title)
        {
            SerializedProperty property;
            property = serializedObject.FindProperty(name);
            EditorGUILayout.PropertyField(property, new GUIContent(title));
            serializedObject.ApplyModifiedProperties();
        }
    }

我想从自定义编辑器类中调用它

[CustomEditor(typeof(BasicComponentScript))]
public class BaiscComponentEditor : Editor
{
    EditorSerializaion editorSerializaion;

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

但它不会起作用 (在DrawSerializedField 函数中,serializedObject.FindProperty(name) 返回null,但我在自定义检查器中使用相同的名称执行此操作)

【问题讨论】:

  • 你确定是Posotion 不是Position
  • 没关系,就是标题名

标签: c# unity3d editor unity-editor


【解决方案1】:

您可以将 serializedObject 作为参数传递给 DrawSerializedField。而且我认为从 Editor 扩展 EditorSerialization 对您的情况没有任何好处(如您所见,您不能自动访问其他 Editor 脚本的 serializedObjects)。如果我是你,我会把它变成一个静态实用程序类:

  • public static void DrawSerializedField(SerializedObject serializedObject, string name, string title)
  • EditorSerializaion.DrawSerializedField(serializedObject, "pos", "Position");

【讨论】:

    【解决方案2】:

    解决方案是从第一个对象传递serializedObject,但它一开始对我不起作用,因为您需要创建一个新的对象实例。

    public class EditorSerializaion : Editor
    {    // This has changed
        public void DrawSerializedField(SerializedObject sb,string name, string title)
        {
            SerializedProperty property;
            // This has changed
            property = sb.FindProperty(name);
            EditorGUILayout.PropertyField(property, new GUIContent(title));
            // This has changed
            sb.ApplyModifiedProperties();
        }
    }
    
    
    [CustomEditor(typeof(BasicComponentScript))]
    public class BaiscComponentEditor : Editor
    {
        EditorSerializaion editorSerializaion;
    
        // This is new
        private void OnEnable()
        {
            editorSerializaion = new EditorSerializaion();
        }
    
        public override void OnInspectorGUI()
        {    // This has changed
            editorSerializaion.DrawSerializedField(serializedObject,"pos", "Posotion");
        }
    }
    
    • 您还可以将DrawSerializedField 函数更改为静态,然后您就不需要创建它的实例

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2011-04-15
      • 2017-11-16
      • 2014-10-06
      相关资源
      最近更新 更多