Суббота, 16 Ноября 2024, 07:44

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Инициализация объекта при 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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг