Проверьте, когда переменная изменилась в пользовательском редакторе

#c# #unity3d

Вопрос:

Я пытаюсь проверить, изменилась ли какая-либо переменная в пользовательском классе редактора, но, похоже, я не могу получить результат проверки. Это мой пользовательский класс редактора. Я использую EditorGUI.BeginChangeCheck () и EditorGUI.Проверка окончания():

 using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(TileManager))]
[CanEditMultipleObjects]
public class TileManagerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        TileManager tileManager = (TileManager)target;

        EditorGUI.BeginChangeCheck();

        serializedObject.Update();

        tileManager.tileCount = (int)Mathf.Clamp(EditorGUILayout.IntField("Tile Count", tileManager.tileCount), 0, Mathf.Infinity);
        tileManager.resizeTileCount = EditorGUILayout.Toggle("Resize Tile Count", tileManager.resizeTileCount);
        tileManager.tileSize = EditorGUILayout.Vector3Field("Tile Size", tileManager.tileSize);
        tileManager.tileSpacing = Mathf.Clamp(EditorGUILayout.FloatField("Tile Spacing", tileManager.tileSpacing), 0, Mathf.Infinity);
        tileManager.relativeSpacing = EditorGUILayout.Toggle("Relative Spacing", tileManager.relativeSpacing);

        if (tileManager.relativeSpacing == true)
        {
            tileManager.spacingMultiplier = Mathf.Clamp(EditorGUILayout.FloatField("Spacing Multiplier", tileManager.spacingMultiplier), 0, Mathf.Infinity);
        }

        EditorGUILayout.PropertyField(serializedObject.FindProperty("tilePrefab"), true);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("tileHolder"), true);
        EditorGUILayout.PropertyField(serializedObject.FindProperty("tiles"), true);

        serializedObject.ApplyModifiedProperties();

        if (EditorGUI.EndChangeCheck())
        {
            tileManager.UpdateOnChange();
        }
    }
}
 

Я также пытался Debug.Log(EditorGUI.EndChangeCheck()) использовать вместо оператора if, но не получил выходных данных

Комментарии:

1. «Изменение» — это не то понятие, которое вы можете проверить в программировании. «Разница» — это понятие, которое вы можете просто проверить. Поэтому ваша цель-проверить, есть ли какая-либо разница в предыдущем статусе. Где вы храните предыдущий статус?

2. Вам следует ознакомиться с документацией Unity, чтобы понять этот вопрос: docs.unity3d.com/2021.1/Documentation/ScriptReference/…

Ответ №1:

Есть два способа отследить, «что-то изменилось», которые я могу придумать.

И то, и другое я бы решил с помощью пользовательского универсального класса changeTrackableValue<T> (значение, в котором вы можете отслеживать изменения). В обоих случаях вам нужен способ решить, когда все изменения станут «новой нормой».

Вариант 1 — Сравнительный

Вы сохраняете «хорошую» ценность. Если текущее и известное «хорошее» значение не совпадают, valueChanged будет возвращено значение true.

Свойства:

  • если вы вернетесь по длинному маршруту к исходному значению, оно будет читаться как «без изменений». обычно рекомендуется для текстового редактора
  • Это в основном удвоит вашу потребность в памяти, если не больше (если части будут вырезаны или добавлены оптом).
  • исходное значение не обязательно должно быть свойством

Вариант 2 — архивный бит

Я копирую это из Файловой системы. Вы используете свойство с пользовательским набором значений. Вы сохраняете по одному bool changed = false с каждым значением. Если значение изменяется с помощью функции set, вы устанавливаете changed = true .

Свойства:

  • минимальное увеличение использования памяти
  • отслеживаются любые изменения, даже те, которые вернулись в исходное состояние (могут быть хорошими или плохими).
  • вам нужно свойство с общедоступным набором, и вам нужно иметь возможность изменять указанный сеттер.

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

Комментарии:

1. @LewisDawson Если вы знаете лучший ответ, напишите его. Не жалуйтесь, что другие люди действительно что-то делают, чтобы помочь плакату.