Implementați detectarea accesărilor cu tilemap-uri

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2021.3.3F1
Pachet sistem de intrare
  • 1.3.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

Care sunt premisele pentru acest sfat?

Despre împrumutarea materialelor cartografice

Procesăm împrumutate de pe următoarele site-uri.

Implementarea personajelor de mers pe jos

Mai întâi, implementați o hartă și un caracter care efectuează detectarea accesărilor. Acest caracter poate fi mutat cu tastele cursorului de pe tastatură. Cu toate acestea, dacă implementați o plimbare adecvată, va fi lungă și departe de esența sfaturilor cărții, așa că de data aceasta voi muta doar o singură imagine simplă.

Dacă doriți să implementați animații de mers pe jos, consultați următoarele sfaturi:

După ce creați proiectul, adăugați o imagine sprite a obiectului pe care doriți să îl mutați în proiect.

Selectați imaginea și setați pixelii pe unitate la 32 de la inspector. Acest lucru se datorează faptului că dimensiunea unui pătrat al cipului de hartă este de 32 de pixeli, deci se potrivește cu asta. Odată configurat, faceți clic pe butonul "Aplicați" de mai jos.

Plasați personajul în vizualizare.

Creați un script pentru a muta personajul. Acest lucru este similar cu următoarele sfaturi:

Lăsați numele Player scriptului ca .

Cod după cum urmează:

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);
    }
  }
}

Atașați-vă la personajul pe care doriți să îl mutați.

Rulați jocul și verificați dacă doriți să îl mutați cu tastatura.

Pregătirea MapTips

În primul rând, vom pregăti un cip de hartă și vom crea o hartă. Această procedură este similară cu următoarele sfaturi: MapTips cu 2D Tilemap Extras sunt, de asemenea, capabile de detectarea coliziunilor, dar nu vor fi utilizate în acest articol, deoarece procedura va fi lungă.

Pregătiți imaginea originală a Sfatului hărții și adăugați-o la proiectul dvs. Pentru a face operațiunea mai ușor de înțeles, vă rugăm să pregătiți un "loc pietonal" și un "loc care nu poate fi umblat" pentru materialul cipului hărții.

Configurați-l pentru MapChips în Inspector și faceți clic pe butonul Aplicare. Odată configurat, deschideți Sprite Editor.

Este un vârf de hartă de 32 de pixeli, așa că îl voi împărți la 32.

Selectați fila Paletă Dale. Dacă nu, afișați-l cu "Window > 2D -> Tile Palette" din meniu. Creați o paletă nouă. Numele este arbitrar, dar deocamdată îl vom numi "MapChipPalette".

Creați un folder MapChipPalette în Scene și specificați-l.

Adăugați un sfat de hartă trăgându-l în paletă. Salvați-l în folderul MapChipPalette pe care l-ați creat anterior.

Crearea unei hărți

De data aceasta, judecata de lovire a hărții va fi efectuată în unități de "Tilemap". Prin urmare, vom crea două Tilemaps, "Tilemap fără detectarea loviturilor" și "Tilemap cu detectarea accesărilor".

Mai întâi, creați două hărți tilemap în ierarhie. Puteți crea două în grilă. Numele sunt "TilemapObeject" și "TilemapGround" pentru claritate.

Mai întâi, creați un "TilemapGround". Deoarece este o gamă mobilă, puteți pune pur și simplu pământul. Dacă este pe teren, puteți schimba modelul.

Apropo, dacă caracterul este ascuns, selectați obiectul de caractere și setați ordinea straturilor inspectorului Sprite Renderer la 2. Ordinea straturilor tematice este 0 în mod implicit, iar harta mozaicului este 0, deci dacă o măriți peste această valoare, aceasta va fi afișată în prim-plan.

Apoi selectați TilemapObject și plasați vârful hărții pe care doriți să îl faceți nemișcat. Setați mai întâi ordinea straturilor la 1. Acest lucru este pentru a-l face să apară în fața solului.

Așa arată dacă ascunzi pământul.

Desigur, în acest moment, nu există setări legate de detectarea coliziunilor, astfel încât să puteți merge pe teren înalt în mod normal. După aceasta, vom seta detectarea coliziunii.

Setări de detectare a coliziunilor

În primul rând, să configurăm personajul. Această setare este aproape aceeași cu sfaturile de mai jos, așa că voi sări peste detalii și voi explica pe scurt procedura.

Selectați un obiect de caracter din ierarhie și selectați Physics 2D -> Circle Collider 2D din Add Component. Dacă forma obiectului este dreptunghiulară, "Box Collider 2D" este bine.

În mod similar, adăugați "Physics 2D -> Rigidbody 2D".

Setați scara gravitațională la 0 pentru a preveni Rigidbody 2D căderea automată.

Verificați Z sub Constrângeri pentru a preveni rotirea personajului atunci când se ciocnește.

Apoi, selectați "TilemapObject" pe care doriți să îl apăsați și selectați "Tilemap -> Tilemap Collider 2D" din "Adăugați componentă".

Asta e tot ce există. Nici măcar nu aveți nevoie de programare. Rulați jocul și încercați să loviți obiectul care devine peretele. Cred că vă puteți asigura că se oprește corect.

Cu toate acestea, atunci când îl atingi efectiv, cred că vor exista puncte de îngrijorare în comportament. Iată câteva soluții:

Comportament incomod de detectare a loviturilor cu harta și soluțiile

Când te lovești de un zid, s-ar putea să găsești câteva lucruri care te deranjează.

Dacă vă deplasați împotriva peretelui, veți fi prins la mijloc

Box Collider 2D Cred că se va întâmpla dacă utilizați un obiect.

De exemplu, din scena de mai jos, când apăsați tasta din stânga jos, doriți să se deplaseze spre stânga de-a lungul peretelui. Cu toate acestea, după unele progrese, cred că se va bloca în ceva și se va opri.

Recunoașteți loviturile din pereți după poziție

Circle Collider 2D Cred că este ușor de înțeles dacă atașați . Peretele ar trebui să fie plat, dar dacă îl mutați pe perete, veți vedea că peretele se mișcă ca și cum ar fi neuniform.

Cauze și soluții la blocaje și umflături

Motivul pentru care acestea apar pare să fie că "determinarea loviturii se efectuează pe bază de mapchip". De fapt, atunci când selectați TilemapObject, apare o linie verde în locul în care se află detectarea accesării și puteți vedea că aceasta este o linie trasată în unitățile MapTip.

Deci, dacă obiectul în mișcare se află pe o linie echivalentă cu exact un cip de hartă, acesta va fi judecat ca un hit cu un cip de hartă. Dacă vă ciocniți la limita jetoanelor de hartă, două jetoane de hartă vor fi lovite și judecate, astfel încât puterea saltului va crește.

Cred că cel mai bun mod de a rezolva această problemă este de a combina detectarea loviturilor cu cipurile de hartă atașate. Iată cum se face:

SelectațiTilemap Collider 2D "TilemapObject" cu detectarea loviturilor de la inspector și bifați "Utilizați în compozit" din .

După cum se menționează în avertisment, acest lucru singur nu are niciun efect, deci selectați "Physics 2D -> Composite Collider 2D" din "Add Component".

Rigidbody 2D este adăugat împreună cu Composite Collider 2D.

Este puțin confuz, dar cred că puteți confirma că linia verde de la granița dintre cipurile de hartă cu detectarea loviturilor a dispărut.

Nu vreau ca tilemap-ul să se miște, așa că voi Rigidbody 2D lăsa tipul de corp component ca "static".

Acum rulați jocul și încercați să-l puneți în mișcare. Cred că, chiar dacă vă deplasați în diagonală de-a lungul peretelui, acesta nu va fi prins și vă puteți mișca fără probleme fără mișcări accidentate.

Eliminați împingerile personajului înapoi de pe pereți

Puteți vedea că dacă mutați personajul pentru a împinge peretele și apoi nu vă mai mișcați, acesta se va comporta puțin ca și cum ar fi sărit înapoi de pe perete.

Pentru a rezolva acest lucru,Rigidbody 2D selectați obiectul de caractere și schimbați "Detectarea coliziunii" la "Continuu" din componentă.

Diferența dintre "discontinuu" și "continuu" este după cum urmează.

Discontinue

Detectarea coliziunilor este un mecanism care gândește după mișcare. Este o formă care efectuează detectarea coliziunii din starea în care este mutată și încorporată în perete. Este ușor de înțeles dacă îl asociați cu trambuline și cauciuc, dar cu cât este mai încorporat, cu atât forța va crește mai respingătoare, iar săritura va fi mai puternică. În schimb, calculul se efectuează după mutare, astfel încât costul de procesare este scăzut.

Continuu

Acesta este procesat în timp ce se determină ce este pe drum. Determinați dacă există un perete între poziția înainte și după mutare, Dacă există un zid, acesta va judeca coliziunea acolo și se va opri, deci practic nu există repulsie. În schimb, costul de procesare crește puțin, deoarece calculul este inclus în mijlocul mișcării.

Prins în colțul unui obiect de hartă

În funcție de program și locație, unele sunt prinse, iar altele nu, iar cauza nu sa schimbat prea mult. Apropo, se întâmplă cu colțuri unghiulare precum Box Collider 2D, și nu cu cercuri rotunjite.

Chiar dacă apare un astfel de fenomen misterios, este bine să aveți colțurile rotunjite ale acceleratorului pentru a evita blocajele. Este limitat la Box Collider 2D, dar pentru a-l face rotund, componenta Box Collider 2D a obiectului de caractere are o "rază de margine" și puneți o valoare acolo. Dacă introduceți 1 ca unitate numerică, rotunjirea va avea loc pentru dimensiunea obiectului. Depinde de dimensiune, dar este bine să puneți aproximativ 0,1.

Apropo, judecata lovită crește doar cu dimensiunea rotunjimii, așa că vă rugăm să o ajustați dacă este mare. Box Collider 2D are un buton Collider Edit care vă permite să îl redimensionați direct în vizualizare făcând clic pe buton. Deoarece linia verde exterioară este detectarea reală a accesării, setați dimensiunea astfel încât să nu fie nenaturală.

După aceea, rulați jocul pentru a vă asigura că nu se zgârie și faceți ajustări.