Страница 1 из 1

Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 16:26
Alkos26Rus
Я так понимаю в MonoBehaviour отсутствуют аналоги методов Start, Awake которые бы вызывались на отключенном объекте(скрипт включен)? Есть какие нибудь вменяемые костыли, без того что типо создай другой активный объект и из него вызывай? Конструкторы не катят.

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 16:54
waruiyume
FindObjectsOfType
Я так понимаю, что это для объектов которые грузятся вместе со сценой?

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 17:24
Alkos26Rus
waruiyume писал(а):FindObjectsOfType
Я так понимаю, что это для объектов которые грузятся вместе со сценой?

Я так понял ты предлагаешь использовать FindObjectsOfType именно из какого то другого скрипта и вызывать нужные методы у отключенных объектов? Ну такое, костыль какой то, да и есть сомнения в скорости данного метода. Тем более это не удобно когда мне нужно создать неактивный\активный объект во время выполнения. Думал есть что то более правильное.

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 18:00
waruiyume
Для чего конкретно это нежно?
Я не могу представить себе ситуацию когда нужно инициализировать неактивные объекты, кроме случая когда нужно получить на них ссылки. После загрузки сцены FindObjectsOfType должен для этого подойти, насчёт скорости хз, а создаваемый во время выполнения, итак будет создаваться из активного скрипта и из негоже инициализироваться.

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 18:46
Alkos26Rus
waruiyume писал(а):Для чего конкретно это нежно?
Я не могу представить себе ситуацию когда нужно инициализировать неактивные объекты, кроме случая когда нужно получить на них ссылки. После загрузки сцены FindObjectsOfType должен для этого подойти, насчёт скорости хз, а создаваемый во время выполнения, итак будет создаваться из активного скрипта и из негоже инициализироваться.

Да, нужна инициализация объектов. Банально даже instance не инициализируется у неактивного объекта, не говоря уже про разные поля. Вызывая внутренние методы такого неактивного объекта естественно будет выдавать ошибки. Притом нужно что бы инициализация работала как у активного так и у неактивного объекта, как при наличии на сцене так и при создании в реалтайме. Универсального метода для этого я не знаю, как всегда чтоли придется лепить костыли. Awake например работает в отключенном скрипте, почему не работает при отключенном объекте в иерархии, непонятно. Просто банально неактивный объект сам себя может добавить в массив, как вариант.

PS: Знаю что можно прописать инициализацию в Get поля instance, но хотелось бы при старте, так как есть прямые ссылки на объект и в этом случае нет запроса на instance

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 19:33
Alkos26Rus
Alkos26Rus писал(а):Знаю что можно прописать инициализацию в Get поля instance, но хотелось бы при старте, так как есть прямые ссылки на объект и в этом случае нет запроса на instance

Хотя нет, в статичном поле я получается не могу прописать таким образом
Синтаксис:
Используется csharp
[HideInInspector]public static sc_body_screen instance{
get {
if(!_instance)_instance = this;
return _instance;
}
set {_instance = value;}
}
 


Получается только в Start или в Awake, что опять же не работает в отключенном объекте

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 27 дек 2022, 23:17
KBEP
Только грязным костылём извне, создать какой-нибудь Init или Setup метод, и его вызывать:
Синтаксис:
Используется csharp
bool isSetUp;//флаг чтобы нельзя было несколько раз настройку сделать

public void Setup ()
{
        if (isSetUp) return;

        //детаем грязь тут

        isSetUp = true;
}

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 28 дек 2022, 00:06
Alkos26Rus
KBEP писал(а):Только грязным костылём извне, создать какой-нибудь Init или Setup метод, и его вызывать:
Синтаксис:
Используется csharp
bool isSetUp;//флаг чтобы нельзя было несколько раз настройку сделать

public void Setup ()
{
        if (isSetUp) return;

        //детаем грязь тут

        isSetUp = true;
}

Да не, в том то и дело что нужно чтобы неактивный объект делал это сам, автономно. Без всяких дополнительных объектов которые вызывают метод по ссылке или перебирают все объекты на сцене.

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 28 дек 2022, 01:39
1max1
Как бы суть неактивных объектов в том что они не вызывают свои методы. Ты можешь их скрыть отключив рендеры, но при этом оставить сам объект активным, а уже потом выключить после того как пройдет инициализация. Или использовать конструктор иначе никак.

Re: Метод Start, Awake для неактивного объекта

СообщениеДобавлено: 06 апр 2023, 18:02
kapibara47
Просто вместо деактивирования объекта декативируй все его элементы. Тогда он как-бы будет не неактивен, но никак не будет реагировать на мир, даж не будет виден, и тогда сможешь с ним по человечески работать.