GUILayout.Button не реагирует на нажатия

166
05 декабря 2018, 09:50

Решил, я значит сделать красивый компонент. Решил сделать кнопку которая добавляет новое поле. Кусок кода:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Starter))]
public class StarterEditor : Editor {
    /// <summary>
    /// Компонент
    /// </summary>
    private Starter starter;
    /// <summary>
    /// Получение компонента при активации
    /// </summary>
    public void OnEnable()
    {
        starter = (Starter)target;
    }
    /// <summary>
    /// Изменение вида компонента
    /// </summary>
    public override void OnInspectorGUI()
    {
        int count = starter.managers.Count;
        EditorGUILayout.IntField("Размер", count);

        //Если уже есть Менеджеры в памяти, то вывести их список
        if (starter.managers.Count > 0)
        {
            foreach( var manage in starter.managers)
            {
                int index = starter.managers.IndexOf(manage);
                starter.managers[index] = (Manager.ManagerBase)EditorGUILayout.ObjectField("Менеджер", manage, typeof(Manager.ManagerBase), false);
            }
        }
        else { /* Если елементов в списке нету */ EditorGUILayout.LabelField("Нет елементов в списке"); }

        //Кнопка добавления нового менеджера
        if (GUILayout.Button("Добавить менеджер"))
        {
           Manager.ManagerBase newManager = (Manager.ManagerBase)EditorGUILayout.ObjectField("Менеджер", null, typeof(Manager.ManagerBase), false);
        }
    }
}

Но что бы я не вводил в if () {} конструкция не исполняется. Всё подключил, и унаследовал класс от Editor. Буду рад любой помощи.

Answer 1

Метод OnInspectorGUI выполняется каждый кадр пока окно инспектора активно. Соответственно if (GUILayout.Button("Добавить менеджер")) тоже проверяется каждый кадр, а отрисовка поля, которое находится внутри условия происходит только в том кадре, в котором условие возвращает true.

В итоге, при нажатии кнопки - создаётся переменная newManager, в которую записывается результат отрисовки поля. После чего с переменной вы ничего не делаете и она просто удаляется при выходе из метода, как следствие в следующем кадре кнопка уже не нажата, с результатом вы ничего не сделали и поле уже опять не рисуется.

Если бы вы вставили внутрь нажатия кнопки банальный Debug.Log("Я тутъ");, то и сами бы прекрасно увидели в консоли, что нажатие кнопки отрабатывается, как и всё, что написано внутри условия.

Выходом является, например, лист ваших Manager.ManagerBase, в который по клику GUILayout.Button("Добавить менеджер") вы будете добавлять новый экземпляр класса. А в основном теле метода OnInspectorGUI вы через цикл foreach можете рисовать по полю для каждого экземпляра, который есть в этом листе.

Сейчас вы рисуете напрямую из target, можете напрямую в него тогда и добавлять, чтобы ничего особо не переписывать.

Из соседнего вашего вопроса я понял, что Manager.ManagerBase - наследуется от ScriptableObject, это значит, что создать его через new() у вас не выйдет и вам придётся воспользоваться примерно такой комбинацией, чтобы сохранить новый экземпляр в файловую систему:

if (GUILayout.Button("Добавить менеджер"))
{
    Manager.ManagerBaseobj = ScriptableObject.CreateInstance<Manager.ManagerBase>();
    AssetDatabase.CreateAsset(obj, "путь до папки");
    //здесь вы можете добавить только что созданный ассет в список на отрисовку
}
READ ALSO
Приостановка и действие в другом потоке по нажатию кнопки

Приостановка и действие в другом потоке по нажатию кнопки

У меня есть цикл который работает в отдельном потоке и другой цикл нем выполняет действия, мне нужно по нажатию кнопки из стартового потока...

120
Телеграм бот C# telegram bot is not responding. Please try again later

Телеграм бот C# telegram bot is not responding. Please try again later

Помогите разобратьсяПишу бота использую inline keyboard

221
Получить значение элемента массива в json

Получить значение элемента массива в json

Сейчас у меня код вот такой, но он не работает (ошибка)

116