| Инициализация объекта при 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 |  |  |  |  |