Порядок подій у Unity3d

unity3d

Події в Unity3D поділяються на три великі групи:

-Події, що викликаються за подіями масло масляне (завантаження сцени, вихід користувача) Ця група подій виконується на нерегулярній основі

-Події, що викликаються при промальовуванні кадру У цьому випадку всі скрипти, що використовуються, викликаються в циклі промальовування екрану, а значить, будуть безпосередньо впливати на FPS (частоту кадрів в секунду). Тому тут потрібно дуже акуратно працювати з функціями, які вимагають багато часу на обробку.

-Події, викликані під час розрахунку фізики І остання група. Для розрахунку фізики створюється окрема, незалежна нитка, події якої викликаються з певним інтервалом часу. Розмір цього інтервалу можна налаштувати у пункті меню: Edit -> Project Settings -> Time -> Fixed Timestep.

Знаючи цю розбивку, Ви вже можете приймати рішення про те, де який код краще розташувати. Однак, всі обчислення, вироблені як із розрахунку фізики, і при промальовуванні, впливають на «чуйність» гри. Тому, при розробці програми, найбільш ресурсомісткі обчислення бажано оформляти у співпрограмах (Coroutine).

Тепер перейдемо безпосередньо до переведення розділу довідки.

Порядок виконання функцій подійУ Unity3D, існує ціла низка подій, що виконуються в певному порядку. Цей порядок ми опишемо нижче:

Перше завантаження сцениЦі функції викликаються, коли сцена стартує (по одному разу для кожного об'єкта у кадрі).

Awake:Ця функція завжди викликається до початку будь-яких функцій, а також відразу після ініціалізації префабу.OnEnable:(викликається, якщо об'єкт є активним): Ця функція викликається тільки після того,як об'єкт буде увімкнено.

До першого оновлення кадрів

Start:викликається перед промальовуванням першого кадру, лише якщо сценарій визначений.

У проміжку між кадрами

OnApplicationPause:Ця подія викликається в кінці кадру, коли виявлена ​​пауза, фактично між звичайними оновленнями кадрів. Після OnApplicationPause промальовується один додатковий кадр, щоб показати вікно, яке відображається під час паузи.

Порядок оновленняДля відстеження логіки гри, взаємодії та анімації об'єктів, положення камери і т.д., є кілька різних подій, які Ви можете використовувати. Загальний механізм до виконання більшості завдань перебуває у функції Update(), але є інші функції.

FixedUpdate:FixedUpdate() не залежить від Update(), і може викликатися як частіше за нього так і рідше (зазвичай викликається рідше, якщо FPS досить високий). Ця подія може бути викликана кілька разів у кадрі, якщо FPS низький, а може бути і взагалі не викликана між кадрами, якщо FPS високий. Всі фізичні розрахунки двигуна та оновлення відбувається відразу після FixedUpdate(). При застосуванні розрахунків руху всередині FixedUpdate() вам не потрібно множити ваше значення на Time.deltaTime. Це тому, що FixedUpdate() викликається з таймера незалежного від частоти кадрів.Update:Update() викликається один раз за кадр. Це основна подія для промальовування кадру.LateUpdate:LateUpdate() викликається один раз у кадрі, після завершення Update(). Будь-які розрахунки, які здійснюються в Update() буде завершено під час виклику LateUpdate(). Основним використанням LateUpdate() зазвичай є стеження за камерою від третьої особи. Якщо Ви здійсните рух Вашого персонажа у події Update(), торуху камери та розрахунків її розташування можна вести в події LateUpdate (). Це гарантуватиме, що персонаж пройшов повністю перед камерою, і закріпив своє розташування.

Откреслення сцени (Rendering)

OnPreCull:Викликається перед збиранням сцени на камері. Складання визначає, які об'єкти видно камері. OnPreCull викликається тільки якщо буде відбуватися «обрізання» сцени від невидимих ​​об'єктів.OnBecameVisible / OnBecameInvisible:Викликається, коли об'єкт стає видимим / невидимим для будь-якої камери.OnWillRenderObject:Викликається один раз для кожної камери, якщо об'єкт є видимим.OnPreRender:Викликається перед тим, як на камеру починається відтворення сцениOnRenderObject:Викликається, коли всі об'єкти сцени промальовані. Ви можете використовувати функції GL або Graphics.DrawMeshNow, щоб створити свої малюнки на цій камері.OnPostRender:Викликається після завершення відтворення сцени на камері.OnRenderImage (лише Pro версія):Викликається після промальовування сцени для постобробки зображення на екрані.OnGUI:викликається кілька разів у кадрі у відповідь на події інтерфейсу. Події розташування та заповнення кольором обробляються в першу чергу, а потім події введення з клавіатури/миші.OnDrawGizmos:Використовується для малювання Gizmo на сцені.

СопрограмиЗазвичай виклик співпрограми виконується після повернення функції Update(). Програма це функція, яка може призупинити виконання (yield), доки не буде виконана. Різні види використання співпрограм:

yield:співпрограма буде продовжена після всіх функцій Update(), які будуть викликані в наступному кадрі.yield WaitForSeconds(2):Продовжити після цьогочасу затримки, коли всі функції Update() вже були викликані у кадріyield WaitForFixedUpdate():Триває, коли всі функції FixedUpdate() вже були викликаніyield WWW:Триває, коли завантаження WWW-контенту завершено.yield StartCoroutine(MyFunc):Зв'язки співпрограм, виклик співпрограми буде очікувати завершення функції MyFunc.

OnDestroy:Ця функція викликається для останнього кадру існування об'єкта (об'єкт може бути знищений у відповідь на Object.Destroy або при закритті сцени).

При виходіЦі функції викликаються для всіх активних об'єктів у сцені:

Таким чином, відбувається такий порядок виконання скриптів:

Всі події Awake Всі події Start цикл (з кроком у змінній delta time) -всі функції FixedUpdate -відпрацювання фізичного движка -події тригерів OnEnter/Exit/Stay - події зіткнень OnEnter/Exit/Stay Rigidbody перетворення, згідно transform.position і обертання OnMouseDown/OnMouseUp ін. LateUpdate Прорисовка (Rendering)

ПорадиЯкщо Ви запускаєте співпрограми в LateUpdate, вони також будуть викликані після LateUpdate безпосередньо перед рендерингом. Сопрограми виконуються після всіх функцій Update().