#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 Если вы знаете лучший ответ, напишите его. Не жалуйтесь, что другие люди действительно что-то делают, чтобы помочь плакату.