Как пользовательский редактор InspectorTitlebar в Unity узнает, что на него нажали?

#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 (может выполняться несколько раз за кадр, движение мыши, щелчок и т. Д.) Текущее состояние Сначала десериализуется из этого объекта в Инспектор. Инспектор обрабатывает текущее событие (например, ваш щелчок), затем возвращает новое состояние. Затем вы сериализуете его обратно в этот объект, где новое значение снова сохраняется. Пользовательский интерфейс решает, изменилось ли оно между тем в этом вызове рисования или нет 😉