Editor.target 与 Editor.serializedObject

Rus*_*tun 4 unity-game-engine

所以我有这个简单的脚本:

using UnityEngine;

public class MyScript: MonoBehaviour
{
    public int damage = 25;

    public void PrintStuff()
    {
        Debug.Log("Stuff");
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用的这个 CustomEditor Editor.serializedObject

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(MyScript))]
public class LookAtPointEditor : Editor
{
    SerializedProperty damageProp;

    void OnEnable()
    {
        // Setup the SerializedProperties.
        damageProp = serializedObject.FindProperty("damage");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.IntSlider(damageProp, 0, 100, new GUIContent("Damage"));

        serializedObject.ApplyModifiedProperties();

    }
}
Run Code Online (Sandbox Code Playgroud)

这工作正常:撤消事情有效,退出播放模式有效,但我可以使用Editor.target并且更容易做同样的事情。并且所有功能都可以与Editor.target. 那这样做的目的是serializedObject什么?

Fog*_*zie 6

好问题!在Editor API docs解释这一点,但信息大多是散,所以我会总结一下:

首先,有一个CanEditMultipleObjects您目前没有使用的选项。文档中的引用:

如果使用这种方法,用户可以在层次结构窗口中选择多个资产并一次更改所有资产的值。

作为一个基本示例,GameObjects在场景中选择两个具有相同 Unity 组件(如ImageRigidbody)的组件,您将能够同时修改这些组件以具有相同的值。大多数内置组件都支持它。

这是使用serializedObject会给你的第一个优势;它支持多对象编辑,Editor.target但不支持(您需Editor.targets要这样做)。所以现在如果你想知道,“为什么我不只是Editor.targets用于多对象编辑? ”考虑一下文档中的引用:

与其直接修改脚本变量,不如使用 SerializedObject 和 SerializedProperty 系统来编辑它们,因为这会自动处理多对象编辑、撤消和预制覆盖

这归结为,如果您不想为您自动处理撤消、预制覆盖和多对象编辑功能,只需使用Editor.targetEditor.targets。如果您确实希望这些功能自动运行,请使用SerializedObjectSerializedProperty