#c# #unity3d
#c# #unity3d
Вопрос:
Поскольку я работал над новым редактором для класса, который у меня есть, и мне нужно было использовать EditorGUILayout.InspectorTitlebar
метод, я немного запутался. Вероятно, это связано с тем, что я довольно новичок в создании пользовательских редакторов, но мне кажется, что я где-то упускаю часть.
Мой вопрос: используя приведенный ниже блок кода, почему foldout
bool foldout = EditorGUILayout.InspectorTitlebar(foldout, anObject);
не всегда равен foldout
bool, переданному в него?
Для меня эта строка приводит к перерисовке графического интерфейса InspectorTitlebar при каждом его выполнении. И, учитывая значение foldout
, оно будет либо открытым, либо свернутым, поэтому возвращает то же значение для нового foldout
значения. В какой момент редактор регистрирует щелчок на InspectorTitlebar и каким-то образом сохраняет его для проверки при выполнении этой строки? Это как-то связано с объектом, первоначально переданным в метод?
[CustomEditor(typeof(ClassForCustEditor))]
public class CustomEditor: Editor
{
ClassForCustEditor classForCustEditor;
private void OnEnable()
{
classForCustEditor = (ClassForCustEditor)target;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
GenerateEditor(ref classForCustEditor.foldout, classForCustEditor.anObject);
}
// Method to add multiple Editors into the main Editor instance
private void GenerateEditor(ref bool foldout, Object anObject)
{
if (settings != null)
{
foldout = EditorGUILayout.InspectorTitlebar(foldout, anObject);
if (foldout)
{
Editor editor = CreateEditor(settings);
editor.OnInspectorGUI();
}
}
}
}
Ответ №1:
Вы передаете исходное состояние из classForCustEditor.foldout
в качестве аргумента. Это текущее состояние свертки для этого экземпляра класса.
Сам пользовательский интерфейс строки заголовка внутренне уже обрабатывает получение щелчка и впоследствии возвращает состояние свертки.
Поскольку вы передаете его через ref
, вы снова сохраняете его classForCustEditor.foldout
.
Комментарии:
1. Да, может быть, я прошу слишком многого. Я просто не понимаю, как я перехожу в состояние свертки, и он может каким-то образом разграничить это и тот факт, что на него нажали. Кажется, что каждый раз, когда я вызываю эту строку, я воссоздаю строку заголовка и присваиваю ей новое значение для свертки. Но вместо этого он каким-то образом знает, что строка заголовка уже есть и на нее нажали… Это просто закулисное действие, которое я не собираюсь понимать?
2. Нет 😉 Это то, с чем графический интерфейс Unity просто справляется сам, да. Что на самом деле происходит за кулисами: каждый вызов GUI (может выполняться несколько раз за кадр, движение мыши, щелчок и т. Д.) Текущее состояние Сначала десериализуется из этого объекта в Инспектор. Инспектор обрабатывает текущее событие (например, ваш щелчок), затем возвращает новое состояние. Затем вы сериализуете его обратно в этот объект, где новое значение снова сохраняется. Пользовательский интерфейс решает, изменилось ли оно между тем в этом вызове рисования или нет 😉