Įdiekite įvykių aptikimą naudodami plytelių žemėlapius

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2021.3.3F1
Įvesties sistemos paketas
  • 1.3.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Kokios yra šio patarimo prielaidos?

Apie žemėlapių medžiagos skolinimąsi

Mes apdorojame pasiskolintas iš šių svetainių.

Pėsčiųjų simbolių įgyvendinimas

Pirmiausia įdiekite žemėlapį ir simbolį, kuris atlieka įvykių aptikimą. Šį simbolį galima perkelti žymeklio klavišais klaviatūroje. Tačiau jei įgyvendinsite tinkamą pasivaikščiojimą, jis bus ilgas ir toli nuo knygos patarimų esmės, todėl šį kartą perkelsiu tik paprastą vieną paveikslėlį.

Jei norite įdiegti ėjimo animaciją, peržiūrėkite šiuos patarimus:

Sukūrę projektą, įtraukite objekto, kurį norite perkelti į projektą, sprite vaizdą.

Pasirinkite vaizdą ir iš inspektoriaus nustatykite pikselių vienetui reikšmę 32. Taip yra todėl, kad vieno žemėlapio kvadrato dydis yra 32 pikseliai, todėl jis tam tinka. Sukonfigūravę spustelėkite žemiau esantį mygtuką "Taikyti".

Įdėkite sprite į rodinį.

Sukurkite scenarijų, kad perkeltumėte "sprite". Tai panašu į šiuos patarimus:

Palikite scenarijaus pavadinimą Player kaip .

Kodas:

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

Pritvirtinkite prie sprite, kurį norite perkelti.

Paleiskite žaidimą ir patikrinkite, ar norite jį perkelti klaviatūra.

Žemėlapių patarimų paruošimas

Visų pirma, mes paruošime žemėlapį ir sukursime žemėlapį. Ši procedūra yra panaši į šiuos patarimus: "MapTips" su "2D Tilemap Extras" taip pat gali aptikti susidūrimą, tačiau šiame straipsnyje jie nebus naudojami, nes procedūra bus ilga.

Paruoškite originalų žemėlapio patarimo vaizdą ir pridėkite jį prie savo projekto. Kad operacija būtų lengviau suprantama, žemėlapio lusto medžiagai paruoškite "vaikščiojamą vietą" ir "nevaikštomą vietą".

Nustatykite jį "MapChips" inspektoriuje ir spustelėkite mygtuką Taikyti. Sukonfigūravę atidarykite "Sprite" redaktorių.

Tai 32 pikselių žemėlapio patarimas, todėl padalinsiu jį į 32.

Pasirinkite skirtuką Plytelių paletė. Jei ne, meniu parodykite jį su "Window > 2D -> Tile Palette". Sukurkite naują paletę. Pavadinimas yra savavališkas, tačiau kol kas mes jį vadinsime "MapChipPalette".

Sukurkite "MapChipPalette" aplanką "Scenes" ir nurodykite jį.

Pridėkite žemėlapio patarimą vilkdami jį į paletę. Išsaugokite jį aplanke MapChipPalette, kurį sukūrėte anksčiau.

Žemėlapio kūrimas

Šį kartą žemėlapio hitas bus atliekamas "Tilemap" vienetais. Todėl sukursime du "Tilemaps": "Tilemap be paspaudimo aptikimo" ir "Tilemap with hit detection".

Pirmiausia hierarchijoje sukurkite dvi plytelių schemas. Tinklelyje galite sukurti du. Aiškumo dėlei pavadinimai yra "TilemapObeject" ir "TilemapGround".

Pirmiausia sukurkite "TilemapGround". Kadangi tai yra kilnojamasis diapazonas, galite tiesiog uždėti žemę. Jei jis yra ant žemės, galite pakeisti modelį.

Beje, jei simbolis yra paslėptas, pasirinkite simbolio objektą ir nustatykite inspektoriaus sluoksnio tvarką Sprite Renderer į 2. Pagal numatytuosius nustatymus sluoksnių tvarka yra 0, o plytelių schema yra 0, taigi, jei padidinsite ją virš šios vertės, ji bus rodoma pirmame plane.

Tada pasirinkite TilemapObject ir padėkite žemėlapio patarimą, kurį norite padaryti nejudantį. Pirmiausia nustatykite sluoksnių tvarką į 1. Tai yra tam, kad jis pasirodytų priešais žemę.

Štai kaip atrodo, jei slepiate žemę.

Žinoma, šiuo metu nėra jokių nustatymų, susijusių su susidūrimo aptikimu, todėl galite įprastai važiuoti ant aukšto paviršiaus. Po to nustatysime susidūrimo aptikimą.

Susidūrimo aptikimo nustatymai

Pirmiausia nustatykime personažą. Šis nustatymas yra beveik toks pat, kaip ir toliau pateikti patarimai, todėl praleisiu išsamią informaciją ir trumpai paaiškinsiu procedūrą.

Hierarchijoje pasirinkite simbolio objektą ir iš Įtraukti komponentą pasirinkite Fizika 2D -> Circle Collider 2D. Jei objekto forma yra stačiakampė, "Box Collider 2D" yra gerai.

Panašiai pridėkite "Physics 2D -> Rigidbody 2D".

Nustatykite gravitacijos skalę į 0, kad išvengtumėte Rigidbody 2D automatinio kritimo.

Patikrinkite Z dalyje Apribojimai, kad sprite nesisuktų susidūrus.

Tada pasirinkite "TilemapObject", kurį norite paspausti, ir pasirinkite "Tilemap -> Tilemap Collider 2D" iš "Pridėti komponentą".

Tai viskas, kas yra. Jums net nereikia jokio programavimo. Paleiskite žaidimą ir pabandykite pataikyti į objektą, kuris tampa siena. Manau, kad galite įsitikinti, kad jis tinkamai sustoja.

Tačiau kai iš tikrųjų pataikysi, manau, kad elgesyje bus nerimą keliančių dalykų. Štai keletas sprendimų:

Nepatogus įvykių aptikimo elgesys su žemėlapiu ir sprendimais

Kai atsitrenkiate į sieną, galite rasti keletą dalykų, kurie jus vargina.

Jei judėsite prie sienos, pateksite į vidurį

Box Collider 2D Manau, kad tai atsitiks, jei naudosite objektą.

Pavyzdžiui, iš žemiau esančios scenos, kai paspausite klavišą apatiniame kairiajame kampe, norite, kad jis judėtų į kairę palei sieną. Tačiau po tam tikros pažangos, manau, jis kažką įstrigs ir sustos.

Atpažinkite įlenkimus sienose pagal padėtį

Circle Collider 2D Manau, kad tai lengva suprasti, jei pridedate . Siena turėtų būti plokščia, bet jei ją perkelsite prie sienos, pamatysite, kad siena juda taip, tarsi ji būtų netolygi.

Priežastys ir sprendimai, susiję su užkandžiais ir iškilimais

Atrodo, kad priežastis, kodėl jie atsiranda, yra ta, kad "smūgio nustatymas atliekamas žemėlapio pagrindu". Tiesą sakant, kai pasirenkate "TilemapObject", toje vietoje, kur yra įvykio aptikimas, pasirodo žalia linija ir matote, kad tai yra linija, nubrėžta "MapTip" vienetais.

Taigi, jei judantis objektas yra linijoje, lygioje tiksliai vienam žemėlapio lustui, jis bus vertinamas kaip smūgis su vienu žemėlapio lustu. Jei susidursite ties žemėlapio žetonų riba, bus pataikyti ir įvertinti du žemėlapio lustai, todėl atšokimo stiprumas padidės.

Manau, kad geriausias būdas išspręsti šią problemą yra sujungti pataikymo aptikimą su pridėtais žemėlapiais. Štai kaip tai padaryti:

PasirinkiteTilemap Collider 2D "TilemapObject" su inspektoriaus paspaudimų aptikimu ir pažymėkite "Naudoti kompozitiškai" iš .

Kaip nurodyta įspėjime, vien tai neturi jokio poveikio, todėl iš "Pridėti komponentą" pasirinkite "Physics 2D -> Composite Collider 2D".

"Rigidbody 2D" pridedamas kartu su "Composite Collider 2D".

Tai šiek tiek painu, bet manau, kad galite patvirtinti, kad žalia linija ties riba tarp žemėlapių su pataikymo aptikimu išnyko.

Nenoriu, kad plytelių žemėlapis judėtų, todėl komponento kėbulo tipą paliksiu Rigidbody 2D kaip "statinį".

Dabar paleiskite žaidimą ir pabandykite jį pajudinti. Manau, kad net jei judėsite įstrižai išilgai sienos, jis nesusigaudys ir galėsite sklandžiai judėti be nelygaus judesio.

Pašalinkite charakterio stūmimą atgal nuo sienų

Matote, kad jei perkelsite personažą, kad pastumtumėte sieną, o tada nustosite judėti, jis elgsis šiek tiek kaip atšokęs nuo sienos.

Norėdami tai išspręsti,Rigidbody 2D pasirinkite simbolio objektą ir pakeiskite "Susidūrimo aptikimas" į "Nuolatinis" iš komponento.

Skirtumas tarp "nepertraukiamo" ir "nuolatinio" yra toks.

Diskretinio

Susidūrimo aptikimas yra mechanizmas, kuris galvoja po judėjimo. Tai forma, kuri atlieka susidūrimo aptikimą iš būsenos, kurioje ji yra perkelta ir įdėta į sieną. Tai lengva suprasti, jei jį susiejate su batutais ir guma, tačiau kuo daugiau jis bus įdėtas, tuo labiau atstumianti jėga padidės, o atšokimas bus stipresnis. Vietoj to, skaičiavimas atliekamas po perkėlimo, todėl apdorojimo išlaidos yra mažos.

Nuolat

Jis apdorojamas nustatant, kas yra kelyje. Nustatykite, ar tarp padėties prieš ir po judėjimo yra siena, Jei yra siena, ji įvertins susidūrimą ten ir sustos, todėl praktiškai nėra atbaidymo. Vietoj to, apdorojimo išlaidos šiek tiek padidėja, nes skaičiavimas įtraukiamas į judėjimo vidurį.

Įstrigo žemėlapio objekto kampe

Priklausomai nuo programos ir vietos, kai kurie yra sugauti, o kai kurie ne, o priežastis labai nepasikeitė. Beje, tai atsitinka su kampiniais kampais, tokiais kaip "Box Collider 2D", o ne su apvaliais apskritimais.

Net jei atsiranda toks paslaptingas reiškinys, gerai turėti užapvalintus susidūrimo kampus, kad būtų išvengta užkliuvimų. Jis apsiriboja "Box Collider 2D", tačiau norint, kad jis būtų apvalus, simbolio objekto "Box Collider 2D" komponentas turi "krašto spindulį" ir jūs ten įdedate vertę. Jei įvesite 1 kaip skaitmeninį vienetą, objekto dydis bus apvalintas. Tai priklauso nuo dydžio, tačiau gerai įdėti apie 0,1.

Beje, pataikymo sprendimas padidėja tik apvalumo dydžiu, todėl prašome jį pakoreguoti, jei jis yra didelis. "Box Collider 2D" turi "Collider" redagavimo mygtuką, kuris leidžia pakeisti jo dydį tiesiai rodinyje spustelėjus mygtuką. Kadangi išorinė žalia linija yra tikrasis smūgio aptikimas, nustatykite dydį taip, kad jis nebūtų nenatūralus.

Po to paleiskite žaidimą, kad įsitikintumėte, jog jis nesubraižytas, ir atlikite koregavimus.