Решил, я значит сделать красивый компонент. Решил сделать кнопку которая добавляет новое поле. Кусок кода:
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. Буду рад любой помощи.
Метод 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, "путь до папки");
//здесь вы можете добавить только что созданный ассет в список на отрисовку
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть цикл который работает в отдельном потоке и другой цикл нем выполняет действия, мне нужно по нажатию кнопки из стартового потока...
Помогите разобратьсяПишу бота использую inline keyboard
Сейчас у меня код вот такой, но он не работает (ошибка)