Unity - Ръчни функции за събития

Скриптирането в Unity не е като традиционната идея за програма, където кодът работи постоянно в цикъл, докато не изпълни задачата си. Вместо това Unity периодично прехвърля контрола върху скрипта, когато се извикват определени функции, декларирани в него. Веднага след като функцията завърши изпълнението, управлението се връща обратно към Unity. Тези функции са известни като функции за събития, защото те се активират от Unity в отговор на събития, които се случват по време на играта. Unity използва схема за именуване, за да определи коя функция да извика за конкретно събитие. Например, вече сте виждали функцията Актуализиране (извиквана преди промяна на кадър) и функцията Старт (извиквана точно преди първия кадър на обекта). В Unity има много повече функции за събития; пълен списък с повече информация за тяхното използване може да бъде намерен на страницата с документация на класа MonoBehaviour. По-долу са някои от най-важните и често срещани събития.

Редовни събития за актуализиране

Играта е нещо като анимация, в която кадрите се генерират в движение. Ключова концепция в програмирането на играта е да се промени позицията, състоянието и поведението на обектите в играта точно преди да бъде изчертан кадър. Такъв код в Unity обикновено се поставя във функцията Update. Актуализацията се извиква преди рамката да бъде изчертана и преди да се изчислят анимациите.

Физическият двигател също се актуализира във фиксирани времеви стъпки, подобно на това как работи изобразяването на кадри. Отделна функция за събитие FixedUpdate се извиква точно преди всяка актуализация на физическите данни. защото физиката и рамката не се актуализират с еднаква честота, ще получите по-точни резултати от кода на физиката, ако го поставите във функцията FixedUpdate вместо Update.

Също така понякога е полезно да можете да добавяте допълнителнипромени в момента, когато функциите Update и FixedUpdate са изпълнени за всички обекти в сцената и всички анимации са изчислени. Като пример, камерата трябва да остане заключена към целта; регулирането на ориентацията на камерата трябва да се извърши след преместване на целевия обект. Друг пример е, когато кодът на скрипта трябва да замени анимационен ефект (да речем, че накарайте главата на героя да се обърне към целевия обект в сцената). В ситуации от този вид можете да използвате функцията LateUpdate.

Събития за инициализация

Често е полезно да можете да извиквате код за инициализация, преди да се появят актуализации по време на играта. Функцията Start се извиква преди първият кадър или физиката на обекта да се актуализира. Функцията Awake се извиква за всеки обект в сцената, когато сцената се зареди. Обърнете внимание, че въпреки че за различни обекти функциите Start и Awake се извикват в различен ред, всички Awake ще бъдат изпълнени, преди да бъде извикан първият Start. Това означава, че кодът във функцията Start може да използва всичко, което е направено във фазата Awake.

GUI събития

Unity има система за изчертаване на GUI контроли върху всичко в сцената и реагиране на кликвания върху тези контроли. Този код се обработва малко по-различно от нормалната актуализация на рамка, така че трябва да бъде поставен във функция OnGUI, която ще се извиква периодично.

Можете също така да дефинирате събития на мишката, които се задействат върху GameObject в сцената. Това може да се използва за насочване на оръжия или за показване на информация за героите под курсора на мишката. Съществува набор от функции за събития OnMouseXXX (напр. OnMouseOver, OnMouseDown), които позволяват на скрипта да реагира на действията с мишката на потребителя. Например, ако бутонът на мишката е натиснатвремето, когато курсорът на мишката е върху определен обект, тогава ако функцията OnMouseDown присъства в скрипта на този обект, тя ще бъде извикана.

Събития по физика

Физическият двигател ще докладва сблъсъци с обект чрез извикване на функциите за събития в скрипта на този обект. Функциите OnCollisionEnter, OnCollisionStay и OnCollisionExit ще бъдат извикани, когато контактът започне, продължи и приключи. Съответните функции OnTriggerEnter, OnTriggerStay и OnTriggerExit ще бъдат извикани, когато колайдерът на обекта е конфигуриран като тригер (т.е. този колайдер просто открива, че нещо го пресича и не реагира физически). Тези функции могат да бъдат извикани няколко пъти подред, ако по време на актуализацията на физиката бъде открит повече от един контакт, така че към функцията се предава параметър, който предоставя допълнителна информация за сблъсъка (координати, „идентичност“ на входящия обект и т.н.).