Agizo la matukio katika Unity3D, na matumizi ya Coroutine. Vidokezo vyangu. Matukio ya Mchezo na Mifano katika Matukio ya Usasishaji ya Kawaida ya Unity

Matukio katika Unity3D yamegawanywa katika vikundi vitatu vikubwa:

Matukio yanayotokana na matukio ya mafuta (upakiaji wa eneo, kuondoka kwa mtumiaji)
Kundi hili la matukio linaendesha kwa misingi isiyo ya kawaida

Matukio yanayoitwa wakati wa kuchora fremu
Katika kesi hii, maandiko yote yaliyotumiwa yanaitwa katika mzunguko wa kuchora skrini, ambayo ina maana kwamba yataathiri moja kwa moja FPS (muafaka kwa sekunde). Kwa hiyo, hapa unahitaji kufanya kazi kwa makini sana na kazi zinazohitaji muda mwingi wa usindikaji.

Matukio yaliyoanzishwa wakati wa hesabu za fizikia
Na kundi la mwisho. Ili kuhesabu fizikia, thread tofauti, huru imeundwa, ambayo matukio huitwa kwa muda fulani. Ukubwa wa muda huu unaweza kusanidiwa katika kipengee cha menyu: Hariri -> Mipangilio ya Mradi -> Muda -> Hatua Iliyowekwa.

Kujua uchanganuzi huu, unaweza tayari kufanya maamuzi kuhusu wapi ni bora kuweka msimbo gani.
Hata hivyo, hesabu zote zilizofanywa wakati wa kukokotoa fizikia na wakati wa utekelezaji huathiri "mwitikio" wa mchezo. Kwa hiyo, wakati wa kuendeleza programu, inashauriwa kutekeleza mahesabu ya rasilimali nyingi zaidi katika Coroutines.

Sasa hebu tuendelee kutafsiri sehemu ya usaidizi.

Utaratibu wa utendaji wa tukio
Katika Unity3D, kuna idadi ya matukio ambayo yanatekelezwa kwa mpangilio maalum. Tutaelezea utaratibu huu hapa chini:

Amka: Kazi hii daima huitwa kabla ya kuanza kwa kazi yoyote, na pia mara moja baada ya kuanzishwa kwa prefab.
OneEnable:(inayoitwa ikiwa kitu kinatumika): Chaguo hili la kukokotoa linaitwa tu baada ya kitu kuwezeshwa.

Kabla ya sasisho la kwanza la sura

Anza: Inaitwa kabla ya kuchora fremu ya kwanza ikiwa tu hati imefafanuliwa.

Kati ya muafaka

OnApplicationPause: Tukio hili huinuliwa mwishoni mwa fremu wakati pazia linapogunduliwa, kwa ufanisi kati ya masasisho ya kawaida ya fremu. Baada ya OnApplicationPause, fremu moja ya ziada inachorwa ili kuonyesha dirisha ambalo linaonyeshwa wakati wa kusitisha.

Utaratibu wa kusasisha
Ili kufuatilia mantiki ya mchezo, mwingiliano wa vitu na uhuishaji, nafasi ya kamera, n.k., kuna matukio kadhaa tofauti unaweza kutumia. Utaratibu wa jumla wa kukamilisha kazi nyingi uko kwenye Usasishaji() kazi, lakini kuna kazi zingine pia.

Usasisho uliorekebishwa: FixedUpdate() haitegemei Usasishaji(), na inaweza kuitwa mara nyingi zaidi au chini ya mara nyingi (kawaida huitwa mara chache ikiwa FPS iko juu vya kutosha). Tukio hili linaweza kurushwa mara nyingi kwa kila fremu ikiwa Ramprogrammen ni ya chini na huenda lisirushwe kabisa kati ya fremu ikiwa FPS iko juu. Mahesabu yote ya injini ya kimwili na sasisho hutokea mara moja baada ya FixedUpdate (). Unapotumia hesabu za mwendo ndani ya FixedUpdate(), huhitaji kuzidisha thamani yako kwa Time.deltaTime. Hii ni kwa sababu FixedUpdate() inaitwa kutoka kwa kipima saa huru cha kasi ya fremu.
Sasisha: Update() inaitwa mara moja kwa kila fremu. Hili ndilo tukio kuu la kuchora sura.
LateSasisho: LateUpdate() inaitwa mara moja kwa kila fremu, baada ya Usasishaji() kukamilika. Hesabu zozote zinazofanywa katika Sasisho() zitakamilika wakati LateUpdate() itaitwa. Matumizi kuu ya LateUpdate() kawaida ni ufuatiliaji wa kamera ya mtu wa tatu. Ukihamisha mhusika wako katika tukio la Sasisha(), basi unaweza kusogeza kamera na kuhesabu eneo lake katika tukio la LateUpdate(). Hii itahakikisha kwamba mhusika ametembea njia yote mbele ya kamera na ameweka nafasi yake.

Akitoa tukio

OnPreCull: Imeitwa kabla ya tukio kukusanywa kwenye kamera. Mkutano huamua ni vitu gani vinavyoonekana kwa kamera. OnPreCull inaitwa tu ikiwa eneo "limekatwa" kutoka kwa vitu visivyoonekana.
OnBecameVisible / OnBecameInvisible: Inaitwa wakati kitu kinaonekana/kutoonekana kwa kamera yoyote.
OnWillRenderObject: Inaitwa mara moja kwa kila kamera ikiwa kitu kinaonekana.
OnPreRender: Imepigiwa simu kabla ya kamera kuanza kuonyesha tukio
OnRenderObject: Imeitwa wakati vitu vyote kwenye eneo vimechorwa. Unaweza kutumia vitendaji vya GL au Graphics.DrawMeshNow ili kuunda michoro yako mwenyewe kwenye kamera hii.
OnPostRender: Imeitwa baada ya tukio kuonyeshwa kwenye kamera.
OnRenderImage (Toleo la Pro pekee): Imeitwa baada ya kutoa tukio ili kuchakata picha kwenye skrini.
OnGUI: Inaitwa mara nyingi kwa kila fremu kwa kujibu matukio ya kiolesura. Matukio ya nafasi na rangi huchakatwa kwanza, na kufuatiwa na matukio ya kuweka kibodi/kipanya.
OnDrawGizmos: Ilitumika kuchora Gizmo kwenye jukwaa.

Coroutines
Kawaida, simu ya kawaida hufanywa baada ya kitendakazi cha Usasishaji () kurudi. Coroutine ni chaguo la kukokotoa ambalo linaweza kusitisha utekelezaji (mazao) hadi litekelezwe. Matumizi tofauti ya Coroutines:

mavuno: coroutine itaendelea baada ya kazi zote za Update() ambazo zinaitwa kwenye fremu inayofuata.
mavuno WaitForSeconds(2): Endelea baada ya muda uliobainishwa wakati utendakazi wote wa Update() tayari umeitwa kwenye fremu
mavuno WaitForFixedUpdate(): Huendelea wakati vitendaji vyote vya FixedUpdate() tayari vimeitwa
mavuno WWW: Huendelea wakati upakiaji wa maudhui ya WWW umekamilika.
mavuno StartCoroutine(MyFunc): Vyama vya Corroutine, simu ya kawaida itasubiri kitendakazi cha MyFunc kukamilika.

Uharibifu wa vitu

OnDestroy: Chaguo hili la kukokotoa linaitwa kwenye fremu ya mwisho ya kuwepo kwa kitu (kitu kinaweza kuharibiwa kutokana na Object.Destroy au tukio likifungwa).

Wakati wa kutoka
Kazi hizi zinaitwa kwa vitu vyote amilifu kwenye tukio:

OnApplicationQuit: Chaguo hili la kukokotoa linaitwa kwa vitu vyote vya mchezo kabla ya programu kufungwa. Katika kihariri, hii hutokea mtumiaji anaposimamisha PlayMode. Katika kicheza wavuti hii hufanyika wakati kicheza wavuti kimefungwa.
OnDisable: Chaguo hili la kukokotoa linaitwa wakati kipengee kimezimwa au kinapoacha kutumika.

Kwa hivyo, mpangilio ufuatao wa utekelezaji wa hati hufanyika:

Matukio yote ya Amkeni
Matukio Yote ya Anza
kitanzi (na nyongeza katika kutofautisha kwa wakati wa delta)
- kazi zote za FixedUpdate
- maendeleo ya injini ya fizikia
- anzisha matukio OnEnter/Exit/Stay
-Matukio ya mgongano OnEnter/Exit/Stay
Ubadilishaji wa mwili mgumu, kulingana na transform.position na mzunguko
OnMouseDown/OnMouseUp matukio mengine ya ingizo
Matukio yote ya Sasisho ().
Uhuishaji, kuchanganya na mabadiliko
Matukio yote ya LateUpdate
Utoaji

Ushauri
Ukiendesha coroutines katika LateUpdate, zitaitwa pia baada ya LateUpdate kabla tu ya kuwasilisha.
Coroutines hutekelezwa baada ya utendakazi wote wa Update().


Siku njema!

Leo ningependa kuzungumza kwa ufupi juu ya kutumia matukio ili kuondoa takataka na kutoa utendaji tata na wa nguvu kwa nambari yako. Ikumbukwe kwamba makala hii inalenga zaidi kwa Kompyuta ambao wanataka kujifunza zaidi kuhusu mifumo ya tukio.

Tutachambua suala hili zima kwa kutumia mfano wa mfumo wa kudhibiti sauti. Mfumo huu utaturuhusu kuwasha/kuzima muziki na sauti katika mipangilio ya mchezo.

Kabla ya kuunda darasa la meneja litakalodhibiti mipangilio ya sauti na muziki, tutaunda darasa rahisi linaloweza kutatuliwa. Itatumika kama kielelezo cha data itakayohifadhiwa katika JSON.

Kwa kutumia System.Collections; kwa kutumia System.Collections.Generic; kutumia UnityEngine; //================================================ ============ // AudioSettingsModel // @usage model kwa mipangilio ya sauti // // Imetengenezwa na CodeBits Interactive // https://cdbits.net/ //===== ================= ======================== darasa la umma AudioSettingsModel ( public bool music = true; // Bendera inayowajibika kwa sauti za sauti za umma = kweli; // Bendera, inayowajibika kwa sauti)
Sasa unaweza kuanza kuandika darasa la meneja. Tutaiweka kwenye hatua ya kwanza kabisa. Kidhibiti hiki kitakuwa kipengee cha kimataifa na hakitafutwa wakati wa kuhama kutoka eneo hadi tukio.

Kwa kutumia System.Collections; kwa kutumia System.Collections.Generic; kutumia UnityEngine; kutumia System.IO; //================================================ ============ // Kidhibiti cha Sauti // @usage hufanya kazi na mipangilio ya sauti // // Imetengenezwa na CodeBits Interactive // https://cdbits.net/ //==== ================= ========================== darasa la umma AudioManager: MonoBehaviour( // Public vigezo ya umma tuli ya AudioManager mfano = null; // Mfano wa Meneja Mipangilio ya umma tuli ya AudioSettingsModel = null; // Mfano wa mipangilio ya sauti kamba tuli ya faragha _settings_path = ""; // Njia ya faili ya mipangilio ya sauti // Kuanzishwa kwa kidhibiti bila Amkeni( ))( // Weka njia ya kuhifadhi mipangilio _settings_path = Application.persistentDataPath + "/audioSettings.gdf" ; // Angalia ikiwa mfano wa meneja wetu umewekwa ikiwa (mfano == null)( // Mfano haujawekwa mfano = hii; // Weka kitu cha sasa kwa mfano ) // Weka kigezo kinachoonyesha // kwamba kitu hiki hakipaswi kufutwa wakati wa kupakua // kiwango cha DontDestroyOnLoad(gameObject); // Anzisha mipangilio ya meneja wetu InitializeSettings (); ) // Anzisha utupu wa faragha wa kidhibiti InitializeSettings())( // Ikiwa muundo wa mipangilio haujabainishwa ikiwa (mipangilio == null) mipangilio = AudioSettingsModel(); // Unda muundo mpya ikiwa (File.Exists(_settings_path) )( // Iwapo kuna faili iliyo na mipangilio loadSettings(); // Pakia faili ya mipangilio ya sauti ) ) // Pakia mipangilio ya sauti utupu Mipangilio ya umma())( kamba _data = File.ReadAllText(_settings_path); // Soma yote maandishi kutoka kwa mipangilio ya faili = JsonUtility.FromJson (_data); // Iondoe katika muundo wa sasa) // Hifadhi mipangilio ya sauti utupu saveSettings())( string _json_data = JsonUtility.ToJson(mipangilio); // Sawazisha mipangilio ya sasa kutoka kwa modeli ya File.WriteAllText(_settings_path, _json_data); // Hifadhi kwenye faili yetu ) // Unda wajumbe wa tukio letu, ambalo baadaye // litatumika kufuatilia mabadiliko katika mipangilio ya sauti, mjumbe wa umma utupu, AudioSettingsChanged(); // Ongeza mjumbe mpya tukio la umma AudioSettingsChanged OnAudioSettingsChanged; // Unda tukio kulingana nalo // Washa/zima sauti za utupu za umma za kugeuza Sauti(bool imewashwa)( settings.sounds = imewashwa; // Badilisha mipangilio ya sauti katika muundo wa sasa wa saveSettings(_settings_path, settings); // Hifadhi mipangilio ikiwa (OnAudioSettingsChanged ! = null) OnAudioSettingsChanged(); // Anzisha tukio letu) // Washa/zima muziki utupu toggleMusic(bool imewashwa)( settings.music = imewashwa; // Badilisha mipangilio ya muziki katika muundo wa sasa saveSettings(_settings_path, mipangilio); // Hifadhi mipangilio ikiwa (OnAudioSettingsChanged != null) OnAudioSettingsChanged(); // Piga simu tukio letu ) )
Sasa kwa kuwa meneja yuko tayari, unaweza kuunda kitu tupu katika onyesho lako la awali na kukipa jina k.m. "_AUDIO_MANAGER", na kisha uongeze msimamizi wa darasa letu kwake. Hii inaweza kufanyika kwa urahisi kwa kupiga orodha ya sehemu ya kuongeza kwenye kitu na kuchagua "Wasimamizi wa Mchezo" => "Kidhibiti cha Sauti".

Baada ya hayo, tunahitaji kuandika kijenzi ambacho tutaambatisha kwa kila kitu na AudioSource.

Kwa kutumia System.Collections; kwa kutumia System.Collections.Generic; kutumia UnityEngine; //================================================ ============ // Kizima sauti // @utumiaji kuwasha/kuzima vyanzo vya sauti kwenye vitu // // Imetengenezwa na CodeBits Interactive // ​​​​https://cdbits.net/ //= ================= ============================ darasa la umma AudioMuter: MonoBehaviour ( // Vigezo vya umma vya kipengele cha umma bool is_music = uongo; // Alama hii inaweka wazi kwa darasa letu ikiwa Chanzo cha Sauti ni sauti au muziki. // Vigezo vya faragha vya Chanzo cha Sauti _as; // AudioSource kuelea binafsi _base_volume = 1F; // Sauti ya msingi ya Chanzo cha Sauti // Anzisha utupu wa kitu Anza())( // Pata kipengele cha AudioSource na sauti yake ya awali _as = this.gameObject.GetComponent (); // Pata kijenzi _base_volume = _as.volume; // Pata sauti ya msingi // Hapa tunaongeza msikilizaji ambaye atatekeleza mbinu ya _audioSettingsChanged // wakati mipangilio ya muziki/sauti imebadilishwa AudioManager.instance.OnAudioSettingsChanged += _audioSettingsChanged; // Sakinisha // Naam, mwanzoni lazima tuangalie hali ya sasa ya sauti/muziki _audioSettingsChanged(); ) // Kipengee kinapoharibiwa void OnDestroy())( AudioManager.instance.OnAudioSettingsChanged -= _audioSettingsChanged; // kuharibu kisikilizaji) // Mbinu hii hutumika kuwasha/kuzima sauti ya utupu wa faragha wa AudioSource _audioSettingsChanged()) ( ikiwa (ni_muziki) _as.volume = (AudioManager.settings.music) ? _base_volume: 0F; kama (!ni_muziki) _as.volume = (SautiManager.settings.sauti) ? _base_volume: 0F; ) )
Kwa njia hii tunaweza kudhibiti sauti/muziki kwenye mchezo. Mfano huu hauambii jinsi ya kuifanya kwa usahihi, lakini unaonyesha tu utendakazi wa mfumo wa tukio na wasikilizaji katika Unity3D.

Na hatimaye, ningependa kuzungumza juu ya kile tulichotumia sasa. Katika mfano ulio hapa chini, mjumbe alitangazwa ambapo msikilizaji aliundwa:

Mjumbe wa umma Mipangilio ya Sauti iliyobatilika Iliyobadilishwa(); tukio la umma Mipangilio ya SautiImebadilishwa OnAudioSettingsImebadilishwa;
Unaweza kuweka msikilizaji kutekeleza chini ya hali fulani na kufuata njia maalum ambazo zitatekelezwa wakati masharti hayo yametimizwa.

Na kwa msaada wa wajumbe, kwa msingi ambao tumeunda msikilizaji, unaweza kuunda kazi za Callback. Hii inaweza kuwa muhimu haswa kwa njia zisizolingana (kwa mfano, wakati wa kutuma maombi ya POST isiyolingana).

Natumai utapata uzoefu wangu mdogo katika suala hili kuwa muhimu na unaweza kutumia mfano huu kwa miradi yako. Pia nitafurahi kujibu maswali yako (ikiwa mtu haelewi kitu).

Unaweza kusaidia na kuhamisha baadhi ya fedha kwa ajili ya maendeleo ya tovuti

Unapofanya kazi na injini ya mchezo ya Unity3D, mojawapo ya dhana za kwanza ambazo unahitaji kujifunza ni mpangilio ambao matukio huitwa kwenye mchezo na uchakataji wa matukio haya haya.

Ingawa kuna habari nyingi kwa Kirusi kuhusu injini hii, sikupata maelezo sahihi ya matukio. Lakini nilipata kifungu cha Kiingereza cha Agizo la Utekelezaji la Shughuli za Tukio kutoka kwa usaidizi wa Unity3D.

Dibaji ya Mfasiri

Lakini, kabla ya kuanza habari rasmi, nataka kutambua kuwa matukio katika Unity3D yamegawanywa katika vikundi vinne vikubwa:

  1. Matukio yanayoitwa wakati wa kuchora fremu
    Katika kesi hii, maandiko yote yaliyotumiwa yanaitwa katika mzunguko wa kuchora skrini, ambayo ina maana kwamba yataathiri moja kwa moja FPS (muafaka kwa sekunde). Kwa hiyo, hapa unahitaji kufanya kazi kwa makini sana na kazi zinazohitaji muda mwingi wa usindikaji.
  2. Matukio yaliyoanzishwa wakati wa hesabu za fizikia
    Ili kuhesabu fizikia, thread tofauti, huru imeundwa, ambayo matukio huitwa kwa muda fulani. Ukubwa wa muda huu unaweza kusanidiwa katika kipengee cha menyu: Hariri -> Mipangilio ya Mradi -> Muda -> Hatua Iliyowekwa.
  3. Coroutines (Corutins).
    Na kundi la mwisho. Ikiwa ni mbali sana, basi wanaweza kulinganishwa na michakato tofauti, lakini kwa kuwa Unity3D hairuhusu uundaji wa nyuzi tofauti, hii ni aina ya maelewano. Inakuruhusu kukatiza mahesabu, kutoa rasilimali kwa uzi kuu, na kisha kuanza tena sehemu inayofuata ya mahesabu. Mfano wa kushangaza ni hesabu ya mara kwa mara ya gharama ya bidhaa katika maduka tofauti ya rejareja. Itajiendesha yenyewe, haitapunguza kasi ya mchakato wa mchezo, na bei katika duka zitakuwa za kisasa kila wakati.

Kujua uchanganuzi huu, unaweza tayari kufanya maamuzi kuhusu wapi ni bora kuweka msimbo gani.

Hata hivyo, hesabu zote zilizofanywa wakati wa kukokotoa fizikia na wakati wa utekelezaji huathiri "mwitikio" wa mchezo. Kwa hiyo, wakati wa kuunda programu, usisahau kugawanya mahesabu ya rasilimali nyingi zaidi katika hatua na kupanga katika coroutines.

Sasa hebu tuendelee kutafsiri sehemu ya usaidizi.

Utaratibu wa utendaji wa tukio

Katika Unity3D, kuna idadi ya matukio ambayo yanatekelezwa kwa mpangilio maalum. Tutaelezea utaratibu huu hapa chini:

Inapakia eneo kwa mara ya kwanza

Kazi hizi huitwa tukio linapoanza (mara moja kwa kila kitu kwenye fremu).

  • Amka: Kazi hii daima huitwa kabla ya kuanza kwa kazi yoyote, na pia mara moja baada ya kuanzishwa kwa prefab.
  • OneEnable:(inayoitwa ikiwa kitu kinatumika): Chaguo hili la kukokotoa linaitwa tu baada ya kitu kuwezeshwa.

Kabla ya sasisho la kwanza la sura

  • Anza: Inaitwa kabla ya kuchora fremu ya kwanza ikiwa tu hati imefafanuliwa.

Kati ya muafaka

  • OnApplicationPause: Tukio hili huinuliwa mwishoni mwa fremu wakati pazia linapogunduliwa, kwa ufanisi kati ya masasisho ya kawaida ya fremu. Baada ya OnApplicationPause, fremu moja ya ziada inachorwa ili kuonyesha dirisha ambalo linaonyeshwa wakati wa kusitisha.

Utaratibu wa kusasisha

Ili kufuatilia mantiki ya mchezo, mwingiliano wa vitu na uhuishaji, nafasi ya kamera, n.k., kuna matukio kadhaa tofauti unaweza kutumia. Utaratibu wa jumla wa kukamilisha kazi nyingi uko kwenye Usasishaji() kazi, lakini kuna kazi zingine pia.

  • Usasisho uliorekebishwa: FixedUpdate() haitegemei Usasishaji(), na inaweza kuitwa mara nyingi zaidi au chini ya mara nyingi (kawaida huitwa mara chache ikiwa FPS iko juu vya kutosha). Tukio hili linaweza kurushwa mara nyingi kwa kila fremu ikiwa Ramprogrammen ni ya chini na huenda lisirushwe kabisa kati ya fremu ikiwa FPS iko juu. Mahesabu yote ya injini ya kimwili na sasisho hutokea mara moja baada ya FixedUpdate (). Unapotumia hesabu za mwendo ndani ya FixedUpdate(), huhitaji kuzidisha thamani yako kwa Time.deltaTime. Hii ni kwa sababu FixedUpdate() inaitwa kutoka kwa kipima saa huru cha kasi ya fremu.
  • Sasisha: Update() inaitwa mara moja kwa kila fremu. Hili ndilo tukio kuu la kuchora sura.
  • LateSasisho: LateUpdate() inaitwa mara moja kwa kila fremu, baada ya Usasishaji() kukamilika. Hesabu zozote zinazofanywa katika Sasisho() zitakamilika wakati LateUpdate() itaitwa. Matumizi kuu ya LateUpdate() kawaida ni ufuatiliaji wa kamera ya mtu wa tatu. Ukihamisha mhusika wako kwenye Tukio la Sasisha(), basi unaweza kusogeza kamera na kuhesabu eneo lake katika tukio la LateUpdate(). Hii itahakikisha kwamba mhusika ametembea njia yote mbele ya kamera na ameweka nafasi yake.

Akitoa tukio

  • OnPreCull: Imeitwa kabla ya tukio kukusanywa kwenye kamera. Mkutano huamua ni vitu gani vinavyoonekana kwa kamera. OnPreCull inaitwa tu ikiwa eneo "limekatwa" kutoka kwa vitu visivyoonekana.
  • OnBecameVisible / OnBecameInvisible: Inaitwa wakati kitu kinaonekana/kutoonekana kwa kamera yoyote.
  • OnWillRenderObject: Inaitwa mara moja kwa kila kamera ikiwa kitu kinaonekana.
  • OnPreRender: Imepigiwa simu kabla ya kamera kuanza kuonyesha tukio
  • OnRenderObject: Imeitwa wakati vitu vyote kwenye eneo vimechorwa. Unaweza kutumia vitendaji vya GL au Graphics.DrawMeshNow ili kuunda michoro yako mwenyewe kwenye kamera hii.
  • OnPostRender: Imeitwa baada ya tukio kuonyeshwa kwenye kamera.
  • OnRenderImage(Toleo la Pro pekee): Inaitwa baada ya tukio kutolewa, ili kuchakata picha kwenye skrini.
  • OnGUI: Inaitwa mara nyingi kwa kila fremu kwa kujibu matukio ya kiolesura. Matukio ya nafasi na rangi huchakatwa kwanza, na kufuatiwa na matukio ya kuweka kibodi/kipanya.
  • OnDrawGizmos: Ilitumika kuchora Gizmo kwenye jukwaa.

Coroutines

Kawaida, simu ya kawaida hufanywa baada ya kitendakazi cha Usasishaji () kurudi. Coroutine ni chaguo la kukokotoa ambalo linaweza kusitisha utekelezaji (mazao) hadi litekelezwe. Matumizi tofauti ya Coroutines:

  • mavuno: coroutine itaendelea baada ya kazi zote za Update() ambazo zinaitwa kwenye fremu inayofuata.
  • mavuno WaitForSeconds(2): Endelea baada ya muda uliobainishwa wakati utendakazi wote wa Update() tayari umeitwa kwenye fremu
  • mavuno WaitForFixedUpdate(): Huendelea wakati vitendaji vyote vya FixedUpdate() tayari vimeitwa
  • mavuno StartCoroutine(MyFunc): Vyama vya Corroutine, simu ya kawaida itasubiri kitendakazi cha MyFunc kukamilika.

Uharibifu wa vitu

  • OnDestroy: Chaguo hili la kukokotoa linaitwa kwenye fremu ya mwisho ya kuwepo kwa kitu (kitu kinaweza kuharibiwa kutokana na Object.Destroy au tukio likifungwa).

Wakati wa kutoka

Kazi hizi zinaitwa kwa vitu vyote amilifu kwenye tukio:

  • OnApplicationQuit: Chaguo hili la kukokotoa linaitwa kwa vitu vyote vya mchezo kabla ya programu kufungwa. Katika kihariri, hii hutokea mtumiaji anaposimamisha PlayMode. Katika kicheza wavuti hii hufanyika wakati kicheza wavuti kimefungwa.
  • OnDisable: Chaguo hili la kukokotoa linaitwa wakati kipengee kimezimwa au kinapoacha kutumika.

Kwa hivyo, baada ya kukamilika, matukio huitwa kwa utaratibu ufuatao:

  • Matukio yote ya Amkeni
  • Matukio Yote ya Anza
  • kitanzi (na nyongeza katika kutofautisha kwa wakati wa delta)
    • Vipengele vyote vya FixedUpdate
    • kupima injini ya fizikia
    • anzisha matukio OnEnter/Exit/Stay
    • Matukio ya mgongano ya OnEnter/Toka/Kaa
  • Ubadilishaji wa mwili mgumu, kulingana na transform.position na mzunguko
  • OnMouseDown/OnMouseUp matukio mengine ya ingizo
  • Matukio yote ya Sasisho ().
  • Uhuishaji, kuchanganya na mabadiliko
  • Matukio yote ya LateUpdate
  • Utoaji

Ukiendesha coroutines katika LateUpdate, zitaitwa pia baada ya LateUpdate kabla tu ya kuwasilisha.

Coroutines hutekelezwa baada ya utendakazi wote wa Update().

P.S. nyongeza kutoka kwa mtumiaji Leopotam

Coroutine ni kipande tu cha nambari iliyotekelezwa kwenye uzi kuu. Hii ni muhimu sana kuelewa, kwa sababu kuweka tu hesabu nzito kwenye mpangilio na kudhani kuwa kila kitu kitakuwa sawa sio sawa kimsingi; mahesabu yataziba mtiririko kwa njia ile ile kama yamefanywa katika Usasishaji au mahali pengine kwa kiwango. mbinu. Ni muhimu kuvunja mahesabu kwa marudio ili wakati inarudia tena, mchakato uendelee. Jambo zima la coroutines ni kubinafsisha wito wa marudio haya kwenye kila mzunguko wa kutoa.

Kwa mfano:

IEnumerator FindBozons() ( var isFound = false ; var colliderSectionID = 0 ; var colliderSectionCount = 10 ; wakati (! Inapatikana) ( // Mchakato sehemu moja tu kwa wakati ili kupunguza mzigo isFound = ProcessDataFromSection(colliderSectionID) ; colliderSectionID = (colliderSectionID ++ ) % colliderSectionCount; mavuno kurudi null; ) // Tunanunua yachts/meli // Coroutine inaisha) utupu Start() ( StartCoroutine(FindBozons() ) ;)

Utaratibu wa utaratibu utahakikisha uokoaji wa moja kwa moja wa hali ya muktadha wa utekelezaji wa kazi na kurudi kwenye hatua ya usumbufu (mavuno).

Uandishi katika Umoja si kama wazo la kitamaduni la programu, ambapo msimbo huendelea kwa kitanzi hadi ikamilishe kazi yake. Badala yake, Umoja huhamisha udhibiti mara kwa mara kwa hati wakati vitendaji fulani vilivyotangazwa ndani yake vinaitwa. Mara tu chaguo la kukokotoa litakapokamilisha utekelezaji, udhibiti unarudi kwenye Umoja. Vitendo hivi vinajulikana kama vitendaji vya tukio kwa sababu huwashwa na Unity kujibu matukio yanayotokea wakati wa mchezo. Umoja hutumia mpango wa kutoa majina ili kubaini ni kitendakazi kipi cha kuitisha tukio mahususi. Kwa mfano, tayari umeona kazi ya Usasishaji (inayoitwa kabla ya mabadiliko ya sura) na kazi ya Mwanzo (inayoitwa haki kabla ya sura ya kwanza ya kitu). Kuna vipengele vingi zaidi vya matukio vinavyopatikana katika Umoja; orodha kamili yenye maelezo ya ziada juu ya matumizi yao yanaweza kupatikana kwenye ukurasa wa nyaraka wa darasa la MonoBehaviour. Yafuatayo ni baadhi ya matukio muhimu na yanayotokea mara kwa mara.

Matukio ya Usasishaji wa Mara kwa mara

Mchezo ni aina ya uhuishaji ambapo fremu hutolewa kwa kuruka. Dhana kuu katika upangaji wa mchezo ni kubadilisha nafasi, hali, na tabia ya vitu kwenye mchezo kabla tu ya fremu kuchorwa. Aina hii ya nambari katika Umoja kawaida huwekwa kwenye kitendakazi cha Usasishaji. Usasishaji huitwa kabla fremu haijachorwa na kabla ya uhuishaji kuhesabiwa.

Usasishaji Utupu() ( float distance = kasi * Time.deltaTime * Input.GetAxis("Horizontal"); transform.Translate(Vector3.right * distance); )

Injini ya fizikia pia husasishwa katika hatua za muda maalum, sawa na jinsi uonyeshaji wa fremu unavyofanya kazi. Kitendaji tofauti cha tukio la FixedUpdate kinaitwa kabla tu ya kila sasisho la data halisi. Kwa sababu Kwa kuwa fizikia na fremu hazijasasishwa kwa kiwango sawa, utapata matokeo sahihi zaidi kutoka kwa msimbo wa fizikia ikiwa utaiweka kwenye kipengele cha FixedUpdate badala ya Usasisho.

Batili FixedUpdate() ( Vector3 force = transform.forward * driveForce * Input.GetAxis("Wima"); rigidbody.AddForce(force); )

Pia wakati mwingine ni muhimu kuweza kufanya mabadiliko ya ziada wakati Usasishaji na FixedUpdate vitendaji vimefanya kazi kwa vitu vyote kwenye tukio na uhuishaji wote umehesabiwa. Kwa mfano, kamera inapaswa kubaki imefungwa kwa kitu kinacholengwa; marekebisho ya mwelekeo wa kamera lazima yafanywe baada ya kitu lengwa kusogezwa. Mfano mwingine ni wakati msimbo wa hati unahitaji kubatilisha athari ya uhuishaji (sema, fanya kichwa cha mhusika kuelekea kitu kinacholengwa kwenye tukio). Katika aina hizi za hali, unaweza kutumia kazi ya LateUpdate.

Upya LateUpdate() ( Camera.main.transform.LookAt(target.transform); )

Matukio ya Kuanzisha

Mara nyingi ni muhimu kuweza kupiga nambari ya uanzishaji kabla ya masasisho yoyote kutokea wakati wa mchezo. Kazi ya Kuanza inaitwa kabla ya sura ya kwanza au fizikia ya kitu kusasishwa. Kitendaji cha Amkeni kinaitwa kwa kila kitu kwenye eneo tukio linapopakiwa. Tafadhali kumbuka kuwa ingawa vitendaji vya Anza na Amka vinaitwa kwa mpangilio tofauti kwa vitu tofauti, Amkeni zote zitatekelezwa kabla ya Kuanza kwa kwanza kuitwa. Hii ina maana kwamba msimbo katika kipengele cha Anza unaweza kutumia kila kitu kilichofanywa katika awamu ya Amkeni.

Matukio ya GUI

Umoja una mfumo wa kutoa vidhibiti vya GUI juu ya kila kitu kinachotokea kwenye tukio na kujibu mibofyo kwenye vipengele hivyo. Nambari hii inashughulikiwa tofauti kidogo kuliko sasisho la kawaida la fremu, kwa hivyo ni lazima iwekwe kwenye kitendakazi cha OnGUI ambacho kitaitwa mara kwa mara.

Utupu OnGUI() ( GUI.Label(labelRect, "Game Over");)

Unaweza pia kufafanua matukio ya kipanya ambayo yanawaka kwenye GameObject iliyoko kwenye eneo la tukio. Hii inaweza kutumika kulenga bunduki au kuonyesha maelezo ya mhusika chini ya kishale cha kipanya. Kuna seti ya vitendaji vya tukio la OnMouseXXX (km OnMouseOver, OnMouseDown) ambayo huruhusu hati kujibu vitendo vya kipanya vya mtumiaji. Kwa mfano, ikiwa kitufe cha kipanya kimebonyezwa huku kishale cha kipanya kikiwa juu ya kitu fulani, basi ikiwa chaguo la kukokotoa la OnMouseDown lipo kwenye hati ya kitu hiki, kitaitwa.

Matukio ya Fizikia

Injini ya fizikia itaripoti migongano na kitu kwa kuita vitendaji vya tukio katika hati ya kitu hicho. Kazi

Habari zenu. Leo nataka kuzungumza kuhusu jinsi unavyoweza kutekeleza matukio ya mchezo, kuyawasilisha, na pia jinsi ya kuunda mfumo unaokubalika kabisa wa matukio ya mchezo katika Umoja kwa kubofya mara mbili bila kutumia UnityActions tofauti.

Kumbuka: Makala hii sio ukweli wa ukweli. Hili ni wazo langu tu na uzoefu wangu.

Sina muda wa kufanya picha kwa ajili ya makala, lakini ni lazima! Ndiyo maana picha imetoka kwa Google!

Ngoja nikupe mfano na lifti. Tunajua nini kumhusu? Inaweza kusonga juu au chini kulingana na kubonyeza kitufe. Hata hivyo, inafaa kukumbuka
kwamba pia inafungua / kufunga milango, inacheza sauti na labda kitu kingine. Kwa muda mrefu nimezoea kuzingatia mambo mengi bila kufikiria,
Kwa hiyo, naweza kusema kwamba matukio ya mchezo yanaweza kugawanywa katika vipengele viwili. Ya kwanza ni Handlers. Ya pili ni matukio.
Vishikilizi ni hati zinazoanzisha matukio ya mchezo. Niligawanya tukio hilo kuwa chaguzi kadhaa:

  1. Linear. Chaguo hili linamaanisha kuwa nambari ya N ya matukio hutekelezwa baada ya inayofuata.
  2. Sambamba. Kuinua zaidi ya tukio moja kwenye kidhibiti kimoja.
  3. Imechanganywa. Hii ni mchanganyiko wa chaguzi za kwanza na za pili.

Hebu turudi kwenye lifti. Unaweza kusema mara moja kwamba lifti ni ya chaguo nambari 3. Hebu nielezee. Tunapobonyeza kitufe, tukio la mwendo wa lifti huanzishwa. Ifuatayo, wakati iko kwenye sakafu yako, milango inafunguliwa na, sema, sauti inachezwa. Ufunguzi wa mlango na sauti hutokea kwa sambamba, lakini baada ya harakati. Unaweza kufikiria mara moja hii katika utekelezaji wa mchezo. Lakini baadaye.

Ili uelewe ninachomaanisha na washikaji, hapa kuna mifano: Vichochezi, vitufe vilivyobonyezwa (vifunguo vya kibodi), miale (Raycast), nk.
Naam, chini ya vichochezi: Kucheza sauti, vitu vinavyotembea, nk.

Kwa kweli, niliunda usanifu ufuatao:

Inaonekana rahisi sana, sivyo? Hata kwa maneno ya programu, hakuna haja ya kupakia mienendo (ingawa ilikuwa ngumu kwangu kuja na utekelezaji)

Hivi ndivyo darasa la msingi la matukio yote linaonekana kama:

Kutumia UnityEngine; // System.Collections.Generics; Tukio la msingi la umma la msingi: MonoBehaviour ( CoreEvent nextEvent;// Tukio linalofuata // Orodha ya umma listMatukio; Public abstract void Action(); )

Katika maoni nilionyesha orodha ya matukio ambayo yanaweza / yanapaswa kusababisha. mfano mdogo:

Kutumia UnityEngine; public class LookEvent: CoreEvent ( kubatilisha hadharani batili Action() ( //if(nextEvent != null) nextEvent.Action(); //else print("Look"); ) )

Katika mfano huu, ninaongeza tu tukio lifuatalo. Kwa orodha/safu tumia kitanzi. Ikiwa tukio moja litawaka,
Hatuelezi chochote katika uga wa nextEvent na ndivyo hivyo, kwa sababu Katika utekelezaji, tayari tumeshughulikia usindikaji wa maadili yasiyofaa.

Jambo moja kuhusu utekelezaji. Hapo awali, darasa la tukio la msingi halikukusudiwa kuwa dhahania. Nitaeleza kwa nini. Kama ulivyoona
wenyewe, hali ya thamani isiyo na maana iko katika moja ya matukio. Hiyo ni, hali hiyo inafanywa kwa kila tukio. Kwa kweli, hii sio lazima ikiwa hutumii usindikaji sambamba. Hapo awali, darasa halikuwa la kufikirika na halikuwa la kufikirika. Njia ya Action() ilikuwa ya mtandaoni
ambayo ilifanya iwezekane kuangalia katika darasa la msingi kwa kuiandika mara moja, na kisha kuifanya kama hii:

Kitendo kisicho wazi cha umma () ( base.Action(); //Baadhi ya kazi)

Hata hivyo, hapa ni rahisi zaidi kwa mtu yeyote. Niliamua kuifanya kuwa ya kufikirika kwa sababu ilipunguza kwa kiasi kikubwa idadi ya nambari katika darasa la tukio la msingi + hii,
Kutoka kwa mtazamo wa programu, inafanya akili zaidi ikiwa unajua ufafanuzi wa neno kuu la abstract.

HandlerEvents za darasa la umma: MonoBehaviour ( Orodha ya umma matukio; // Taja darasa la msingi. public virtual void Launch() ( kwa (byte countEvent = 0; countEvent< events.Count; countEvent++) { if (events != null) events.Action(); // Вызываем только те события, которые указаны в листе (не null). } } } public enum TriggerType { Enter, Stay, Exit } public class TriggerHandler: HandlerEvents { public TriggerType triggerType; private void OnTriggerEnter2D(Collider2D other) { if (triggerType == TriggerType.Enter && other.GetComponent()) Uzinduzi(); ) utupu wa faragha OnTriggerExit2D(Collider2D nyingine) ( ikiwa (triggerType == TriggerType.Toka && other.GetComponent ()) Uzinduzi(); ) utupu wa faragha OnTriggerStay2D(Collider2D nyingine) ( ikiwa (triggerType == TriggerType.Stay && other.GetComponent ()) Uzinduzi(); ))

Msimbo wa ulimwengu wote, sivyo? Hii ni mbinu inayotumika sana, kwani unaweza kupiga simu ya tukio moja, ambayo itaita matukio mengine, na kadhalika hadi upate kuchoka. Nilitengeneza kipengee kwa teknolojia kama hiyo na imekuwa hapo kwa nusu mwaka, lakini niliamua kuishiriki hapa kwa kuwa toleo hilo limepitwa na wakati.

Hiyo inaonekana kuwa yote. Ikiwa una maswali, uliza!

Hivi karibuni nitazungumza juu ya kanuni nyingi za kupendeza ambazo ninatumia ambazo zinaweza kusaidia wakati wa kufanya kazi na Umoja.
Kweli, kuna shirika la mradi, kusoma kutoka kwa XML, shirika la nambari, nk. Hivi karibuni!