Editor.target vs Editor.serializedObject - PullRequest
2 голосов
/ 06 марта 2019

Итак, у меня есть простой скрипт:

using UnityEngine;

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

    public void PrintStuff()
    {
        Debug.Log("Stuff");
    }
}

И этот 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();

    }
}

Это отлично работает: отмена работает, выход из режима воспроизведения работает, но я могу сделать то же самое, используя Editor.target и намного проще. И все функции работают нормально с Editor.target. Какова цель serializedObject тогда?

1 Ответ

3 голосов
/ 06 марта 2019

Хороший вопрос! Editor API docs объясняет это, но информация в основном разбросана, поэтому я подведу итог:

Для начала, есть опция CanEditMultipleObjects, которую вы сейчас не используете. Цитата из документов:

Если этот подход используется, пользователь может выбрать несколько активов в окно иерархии и измените значения для всех них одновременно.

Для базового примера этого выберите два GameObjects в вашей сцене, которые имеют одинаковый компонент Unity (например, Image или Rigidbody), и вы сможете изменять эти компоненты одновременно, чтобы иметь одинаковые значения. Большинство встроенных компонентов поддерживают его.

Это первое преимущество использования serializedObject; он поддерживает редактирование нескольких объектов, а Editor.target - нет (для этого вам потребуется Editor.targets). Так что теперь, если вам интересно, «, почему бы мне просто не использовать Editor.targets для редактирования мультиобъектов? », рассмотрите эту цитату из документов:

Вместо непосредственного изменения переменных скрипта выгодно использовать для редактирования их системы SerializedObject и SerializedProperty, так как это автоматически обрабатывает редактирование нескольких объектов, отмену и Префаб перекрывает .

Что сводится к тому, что если вы не хотите, чтобы функции отмены, переопределения префабов и редактирования нескольких объектов автоматически обрабатывались для вас, просто используйте Editor.target или Editor.targets. Если вы хотите, чтобы эти функции просто работали автоматически, используйте SerializedObject и SerializedProperty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...