Недавно решил поиграть с кастомным Unity Editor.
Что хотел:
Есть моно скрипт Main
, вешаю его на какой либо объект в сцене.У Main
есть ссылка на другой определённый компонент -Controller
.
Затем этот Main смотрит Transform дочерних gameObject и ищет там компонент Controller
.
Если Main
находит Controller
, то всё хорошо, ссылка сохраняется и в инспекторе рисуется зелёный квадратик.
Если не находит, или же Controller
пропал, то рисуем красный квадратик, появляется кнопка Fix. При нажатии на неё Main
снова пытается найти контроллер.
Код класса MainValidator
:
[CustomEditor(typeof(Main))]
public class MainValidator:Editor
{
private Rect _rect;
private Main _thisMain;
public override void OnInspectorGUI()
{
serializedObject.Update();
DrawDefaultInspector();
EditorGUILayout.BeginHorizontal();
EditorUtility.SetDirty(target);
_thisMain= (Main)target;
_rect = new Rect(50, 350, 250, 70);
if (_thisMain!= null)
{
if (_thisMain.IsTryed && !_thisMain.IsValidated)
{
if (GUILayout.Button("Fix"))
{
EditorApplication.delayCall += ReTry;
EditorApplication.delayCall += Validate;
}
}
_thisMain.Validate(_thisMain);
if (_thisMain.IsValidated)
{
EditorGUI.DrawRect(_rect, Color.green);
}
else
{
EditorGUI.DrawRect(_rect, Color.red);
}
}
else
{
EditorGUI.DrawRect(_rect, Color.red);
}
EditorGUILayout.EndHorizontal();
EditorUtility.SetDirty(target);
}
protected void Validate()
{
_thisMain.Validate(_thisMain);
EditorUtility.SetDirty(_thisMain);
}
protected void ReTry()
{
_thisMain.ReTry();
EditorUtility.SetDirty(_thisMain);
}
//endif
}
Код класса Main
:
[System.Serializable]
public class Main:MainBase
{
[HideInInspector]
[SerializeField, UsedImplicitly]
private Controller _controller;
protected override bool ValidateAction(MainBase mainlocal)
{
Main main =mainlocal as Main;
if(main==null)
return false;
//!!! вот здесь непонятно
_controller= //main.
gameObject.GetComponentInChildren<Controller>();
if (_controller== null)
return false;
return true;
}
protected override bool ValidateCheckAction()
{
if (_controller== null)
return false;
return true;
}
}
Пролема в коде Main
(там коментами помечено):
Если я при присвоении ссылки делаю так как в коментариях т.е.
_controller= main.gameObject.GetComponentInChildren<Controller>();
То ссылка находится и появляется зелёный квадрат, но если перезапустить Editor, то ссылка теряется и квадрат красный (при нажатии на Fix всё чинится).
Если сделать Controller
как public
или
_controller= gameObject.GetComponentInChildren<Controller>();
То при перезапуске всё сохраняется.
Где то на уровне интуиции как то понятно, но не могли бы Вы конкретнее обьяснить, почему так?
Если правильно понял вопрос
[RequireComponent(typeof(Controller))]
public class ClassName...........
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите, как можно с помощью php пересохранить файл с указанием даты и текущего времени?
Суть вот в чём: Загружаю файлы через https://githubcom/yii2-starter-kit/yii2-file-kit На выходе получается так, что грузит все файлы, но я не могу их сохранить так...