Son dövlət maşınlarını kəşf etməyin: Birliyin Animatorundan necə istifadə etmək olar

Sonlu dövlət maşınları bir səbəblə oyun inkişafında ən məşhur nümunələrdən biridir. Mürəkkəbliyi azaltmaq və modul, təkrar istifadə edilə bilən vəziyyətləri təşviq etməklə daha oxunaqlı proqramlar yarada bilərsiniz. FSM'ləri (Bitmiş Dövlət Maşınları) daha mürəkkəb vəziyyətlərə salmaq mümkün olmasa da, tətbiq vəziyyəti ilə məşğul olmaq və ya sadə AI yaratmaq kimi ən ümumi hallar üçün əladır. *

* Əsas anlayışları izah etməyəcəyəm və FSM-lərin vəziyyətlərini istifadə etməyəcəyəm, çünki düşünürəm ki, onsuz da onlayn çox yaxşı məqalələr var, məsələn Bob Nystromun oyun proqramlaşdırma nümunələri haqqında kitabından.

FSM-lərin yaradılması və istifadəsi üçün iki əsas yanaşma mövcuddur: sürətli və səhv tətbiq olunmağı yazmaq və ya aktiv mağazasından istifadə etmək üçün bir mal almaq. Ancaq üçüncü bir seçim var: Birlikdə inteqrasiya edilmiş animator sistemindən (Mecanim) istifadə.

Birlik animasiya sistemini niyə istifadə edirsiniz?

Dövlət maşınlarını yaratmaq üçün animasiya sistemini yenidən istifadə etmək qəribə görünə bilər, amma animator dövlət maşındır. Animator sistemi cizginizdə ola bilən, lakin demək olar ki, istədiyiniz hər şeyə animasiya üçün xüsusi funksiyalar təqdim edir. İş vaxtında dövlət maşınını düzəltmək və görüntüləmək üçün alətlərdən ibarətdir. Bundan əlavə, milyonlarla inkişaf etdirici tərəfindən sınanan Birlik tərəfindən dəstəklənir və mövcud olan Birlik animasiya təcrübələri tətbiq olunur.

Niyə bunun yerinə tez və çirkli bir tətbiq yaratmayaq?

Sürətli və qarışıq bir tətbiq, işlənib hazırlanması üçün yaxşı işləyir. Ancaq bu nümunəni başqa bir yerdə istifadə etməlisinizsə, eyni kodu təkrar-təkrar yazmaq məcburiyyətində qalacaqsınız. Animator sistemi asanlıqla təkrar istifadə olunan dövlət davranışları ilə müxtəlif dövlət maşınları yarada bilər.

Bəs üçüncü tərəfin aktivi necə?

Mürəkkəblik və performans baxımından (məsələn, NodeCanvas kimi) animator sistemi ilə ayaqlaşa bilən üçüncü tərəf var. Animasiya ilə məşğul olmadıqları üçün daha təmiz bir API-nin faydalarına sahibdirlər. Hətta heç vaxt animatordan istifadə etmədiyim öz tətbiqimi yaratdım. Dövlət maşınlarını canlandırmaq və yenidən istifadə etmək üçün Animator-dan istifadə etmək istədiyiniz üçün iki oxşar sistem arasında kontekstdən keçmək lazım deyil.

Tamam, necə başlayım?

Birincisi, Birliyin animator sisteminin (Mecanim) əsas anlayışlarını əhatə edəcəyəm.

  • Birlikdə Animator Controller adlı bir aktivlik yarada bilərsiniz. Bu dövlət maşın şablonudur.
  • Dövlət maşınında dövlətlər var. Yəqin ki, dövlətləri animasiyalarla əlaqələndirməyə alışmışsınız. Ancaq sırf məntiqi bir dövlət maşını yaratmaq istəyirsinizsə, onlar isteğe bağlıdırlar.
  • Dövlət maşınını idarə etmək üçün GameObject-ə Animator adlı bir komponent əlavə edin və onu yaratdığınız bir animator nəzarətçisi ilə qurun. İndi dövlət maşınınızın bir nümunəsidir.
  • Hər bir dövlət üçün məntiq işlətmək üçün StateMachineBehaviour sinifindən gələn bir skript yaratmalıyıq. Bu yeni bir davranışa sahib olduqdan sonra dövlət maşınındakı istənilən vəziyyətə əlavə edə bilərik. **

Buradakı animatorlar haqqında daha çox məlumat əldə edə bilərsiniz və ya burada bir dərs izləyə bilərsiniz.

** Qeyd edək ki, bu MonoBehaviours ilə eyni işləyir: skript OnEnter, OnExit və s. Kimi əvvəlcədən təyin edilmiş mesajlar alır.

StateMachineBehaviours-dan necə istifadə edirsiniz?

Ən çox dövlətlərdən DövlətMachineBehaviour'u miras alarkən OnStateEnter və OnStateExit mesajlarından istifadə edərək obyektlərin həyat dövrlərini və öz davranışlarını idarə etmək üçün istifadə edirəm. Məsələn, vəziyyətimin oyun hadisələrinə qulaq asmasını istəsəm, ümumiyyətlə dinləyiciləri daxil olduqda əlavə edirəm və ayrıldıqda onları çıxarıram. Çıxarkən obyektləri təmizləyərək, qalan oyun obyektləri və ya zombi dinləyiciləri kimi başa düşmək çətin olan nəticələrdən qaçınmaq olar. Vəziyyətinizin işləməyəndə oyuna təsir etməsini istəmirsiniz!

Diqqət etdiyim problemlərdən biri OnStateExit-in animator əlil olduqda və ya məhv edildikdə zəng etməməsidir. Cari vəziyyəti düzgün təmizləmək üçün OnDisable ***-nin də müalicə olunduğunu təmin etməlisiniz.

*** Vaxtıma qənaət etmək üçün burada oyunuma idxal etdiyim bir depo yaratmışam. Öz layihələrinizdə istifadə etməkdən çekinmeyin!

Gəlin öz oyunumda Jellyquest-də düşmən üçün yaratdığım sadə bir dövlət maşınından keçək.

Bu pis puffer balığıdır. Oyunçunu görənə qədər yavaş-yavaş dönür və sonra sürətlə oyunçu istiqamətində hərəkət edir.

Zərbə, AngryPufferfish adlı bir animator nəzarətçisi ilə konfiqurasiya edilmiş bir prefabrik evdir. Üç dövlət var: hədəf almaq, qəbul etməyə hazırlaşmaq və götürmək. Puf iki status davranışından ibarət olan "məqsədi" statusundan başlayır: "RotateFacingDirection" və "AimInFacingDirection".

RotateFacingDirection konfiqurasiya edilə bilən sürətə əsaslanaraq pufu döndərir. AimInFacingDirection, pufanın hədəfə qarşı olub olmadığını müəyyən etmək üçün raycast istifadə edir.

"PreparingToShoot" statusunda gecikmə müddəti üçün bir parametr ilə yenidən "TriggerContinueAfterDelay" status davranışını istifadə edirəm.

Yazma vəziyyətində, puf balıqlarını oyunçuya doğru hərəkət etdirmək üçün bir MoveInFacingDirection status davranışından istifadə edirəm.

Bu davranışların hər birini ümumi bir məqsəd halına gətirərək, müxtəlif düşmən növlərini yaratmaq üçün onları digər dövlət maşınlarında yenidən istifadə edə bilərəm.

Əla, başqa bir şey bilməliyəm?

İzləmək üçün bəzi ümumi tələ var. Animator sistemi ilə nə qədər tanış olsanız, bir o qədər faydalıdır.

  • Eyni çərçivədə bir neçə dəfə tətik təyin edə bilən kod yazmaqdan bezdiniz. Tetikleyicilər yalnız bir keçid ilə istifadə edildiyi üçün tətik istehlakdan sonra təyin oluna bilər və mövcud vəziyyətə uyğun olaraq qalır.
  • Uşaq kompüterlərindəki OnStateEnter və OnStateExit gözlənildiyi kimi işləməyə bilər. Onlar yalnız yarımstansiya maşınının giriş və çıxış qovşaqlarına vurulduqda çağırılır. Ancaq bu düyünlər birbaşa müəyyən bir yarımstansiyaya və ya xarici bir dövlətə gedən keçidlər etməklə səhv buraxıla bilər.
  • Keçid dövrü, ehtimal ki, həmişə sıfıra qoyulmalıdır. Keçid müddəti sıfır deyilsə, sonrakı vəziyyətin OnEnter cari vəziyyətin OnExitindən əvvəl çağırılır.
  • Tetikleyicileri istifadə edən keçidlər eyni çərçivədəki növbəti vəziyyətə keçir. Digər parametr tiplərinə əsaslanan keçidlər əlavə bir çərçivə tələb edir.

TL; DR:

  • Dövlət maşınları obyektlərin həyat dövrünü idarə etmək üçün faydalıdır
  • İstifadəçilər ya öz dövlət maşınlarını kod şəklində yazırlar və ya aktivlər mağazasında üçüncü tərəfi satın alırlar. Birlik Animatorundan digər məqsədlər üçün də istifadə edə bilərsiniz.
  • Animator daxili vizualizasiya, alətlər, keçidlər və tanış bir API var.
  • Animatoru istifadə etmək fantastikdir, amma bəzi təlaşlarla diqqətli olun. Daha çox məlumatı yuxarıda tapa bilərsiniz!

Tərtib müddətini qısaltmaq istərdinizmi? Yoxsa səhv qurmağın qarşısını almaq üçün oyununuz avtomatik təsdiqlənə bilər? Digər məqalələrimə baxın!