Инициализация объекта при Instantiate
|
|
Suntrash | Дата: Четверг, 17 Апреля 2014, 16:01 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Поискал-поискал, да, видно, плохо.
Вопрос коротко. Инстанциируем объект со скриптом. Как инициализировать паблик переменные этого скрипта до того, как он попадёт в Awake()?
Вопрос развёрнуто. GameObject objA имеет некий скрипт scrA. В какой-то момент времени этот скрипт создаёт GameObject objB из префаба. У objB есть скрипт scrB: Код using UnityEngine; public class scrB : MonoBehaviour { public bool param = true; private void Awake() { if(param) Debug.Log("Объект находился на сцене в момент создания"); else Debug.Log("Объект создан скриптом scrA"); // забегая вперёд - эта строчка никогда не сработает } }
Кусок кода в scrA: Код private void Update() { if(Input.GetMouseButtonDown(0)) { GameObject _objB = Instantiate(objB) as GameObject; // если здесь поставить точку останова и двинуться на шаг вперёд, то попадём в Awake() скрипта scrB scrB _scrB = _objB.GetComponent<scrB>(); // здесь очень хочется инициализировать param, но Awake() уже отработал... _scrB.param = false; // всё бесполезно... } }
Теперь читаем в начале пункт "Вопрос коротко".
P.S. Да, я знаю про Start(), но важный кусок инициализации (это должно случиться в Awake()) происходит в зависимости от параметра, необходимого к заполнению на этапе конструктора объекта.
Сообщение отредактировал Suntrash - Пятница, 18 Апреля 2014, 08:06 |
|
| |
Ranger | Дата: Четверг, 17 Апреля 2014, 16:11 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Наступал на эти грабли. параметр в авэйк и старт не передается. делать инициализацию после инстанциации.
это не есть необходимое препятствие для создания логики. В чем задача собстно? почему не устраивает инициализация после awake? Start запустится на след кадре.(убери код туда)
Сообщение отредактировал Ranger - Четверг, 17 Апреля 2014, 16:14 |
|
| |
beril | Дата: Четверг, 17 Апреля 2014, 16:28 | Сообщение # 3 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Перемести все в OnEnable. Я возможно не так понял, но Awake срабатывает так же и при инициализации префаба так, что все должно работать и так
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
Сообщение отредактировал beril - Четверг, 17 Апреля 2014, 16:29 |
|
| |
Ranger | Дата: Четверг, 17 Апреля 2014, 16:38 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| Да, можно OnEnable.
Я вот только этой фразы не понял Цитата beril ( ) Awake срабатывает так же и при инициализации префаба так, что все должно работать и так
Не должно работать (проверено). awake идет сразу после или вовремя инстанциации.
|
|
| |
beril | Дата: Четверг, 17 Апреля 2014, 17:03 | Сообщение # 5 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата Ranger ( ) Я вот только этой фразы не понял Вот к примеру: делал игру и там был респаун монстров. При старте монстра на карте не было и он появлялся через несколько секунд. Надо было проиництализировать некоторые переменные, когда он появлялся и включить скрипты его. В Start само собой не срабатывало. Соответственно я всю инициализацию перенес в OnEnable, там все работало как и должно. Мне стало интересно и я попробовал перенести все в Awake, как оказалось и там все срабатывает.
Awake: Эта функция всегда вызывается до начала любых функций, а также сразу после инициализации префаба. OnEnable: Эта функция вызывается только после того, как объект будет включен.
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Suntrash | Дата: Пятница, 18 Апреля 2014, 07:59 | Сообщение # 6 |
был не раз
Сейчас нет на сайте
| Спасибо, дяденьки, много написали - узнал кое-что полезное.
В целом, после некоторого времени размышлений и марания бумажек стало ясно, что этот кусок действительно можно перенести в Start(). Но, следуя вашим советам, решил сунуть в OnEnable() - выглядит логичнее.
Собственно кусок - это регистрация объекта в глобальном пуле, чтобы другие могли его легко найти. Только у меня есть ситуации, когда он зарегистрируется сильно позже рождения. Из Awake() и Start() никто другие объекты не ищет (и вряд ли будет).
Дальше осталось для себя понять - как и когда правильно использовать Awake(), Start() и OnEnable(). Но это тема для нового вопроса =)
|
|
| |
Ranger | Дата: Пятница, 18 Апреля 2014, 08:51 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| Цитата Suntrash ( ) Дальше осталось для себя понять - как и когда правильно использовать Awake(), Start() и OnEnable(). Но это тема для нового вопроса =) Awake удобен для создания синглтонов. В Старте обычно прикручиваю компоненты и референсы на ресурсы к главному скрипту OnEnable полезен при записи объекта в пул (для работы менеджера объектов.)
Сообщение отредактировал Ranger - Пятница, 18 Апреля 2014, 08:54 |
|
| |