Unity, проверка наличия компонента в Editor

124
16 сентября 2019, 05:20

Недавно решил поиграть с кастомным 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>();

То при перезапуске всё сохраняется.

Где то на уровне интуиции как то понятно, но не могли бы Вы конкретнее обьяснить, почему так?

Answer 1

Если правильно понял вопрос

[RequireComponent(typeof(Controller))]
public class ClassName...........
READ ALSO
как добавить дату и время к строке

как добавить дату и время к строке

Подскажите, как можно с помощью php пересохранить файл с указанием даты и текущего времени?

187
php реферальная система

php реферальная система

Пишу многоуровневую реферальную систему с рангамиТ

121
Yii2 file kit не правильно проставляет индексы

Yii2 file kit не правильно проставляет индексы

Суть вот в чём: Загружаю файлы через https://githubcom/yii2-starter-kit/yii2-file-kit На выходе получается так, что грузит все файлы, но я не могу их сохранить так...

116
Как разделить CSV файл с помощью команды split?

Как разделить CSV файл с помощью команды split?

Есть файлCSV с названием file

139