Implementer registrering af hit med tilemaps

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2021.3.3f1
Input System Pakke
  • 1.3.0

Forudsætninger for dette tip

Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.

Hvad er forudsætningerne for dette tip?

Om lån af kortmaterialer

Vi behandler lånt fra følgende sider.

Implementering af walking tegn

Først skal du implementere et kort og et tegn, der udfører hitdetektion. Dette tegn kan flyttes med piletasterne på tastaturet. Men hvis du implementerer en ordentlig gåtur, vil den være lang og langt fra essensen af bogens tip, så denne gang vil jeg kun flytte et enkelt enkelt billede.

Hvis du vil implementere ganganimationer, skal du se følgende tip:

Når du har oprettet projektet, skal du tilføje et sprite-billede af det objekt, du vil flytte til projektet.

Vælg billedet, og indstil Pixel pr. enhed til 32 fra infovinduet. Dette skyldes, at størrelsen på en firkant på mapchippen er 32 pixels, så det passer til det. Når du er konfigureret, skal du klikke på knappen "Anvend" nedenfor.

Placer sprite i visningen.

Opret et script for at flytte sprite. Dette ligner følgende tips:

Lad scriptnavnet Player være .

Kode som følger:

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

Fastgør til den sprite, du vil flytte.

Kør spillet og kontroller, om du vil flytte det med tastaturet.

Forberedelse af korttips

Først og fremmest vil vi forberede en mapchip og oprette et kort. Denne procedure ligner følgende tip: MapTips med 2D Tilemap Extras er også i stand til kollisionsregistrering, men de vil ikke blive brugt i denne artikel, fordi proceduren vil være lang.

Forbered det originale billede af MapTippet, og føj det til dit projekt. For at gøre operationen lettere at forstå, skal du forberede et "walkable place" og et "non-walkable place" til kortchipmaterialet.

Indstil det til MapChips i infovinduet, og klik på knappen Anvend. Når den er konfigureret, skal du åbne Sprite Editor.

Det er et 32-pixel maptip, så jeg deler det op på 32.

Vælg fanen Feltpalet. Hvis ikke, skal du vise det med "Window > 2D -> Tile Palette" fra menuen. Opret en ny palet. Navnet er vilkårligt, men for nu kalder vi det "MapChipPalette".

Opret en MapChipPalette-mappe i Scener, og angiv den.

Tilføj et korttip ved at trække det til paletten. Gem den i mappen MapChipPalette, du oprettede tidligere.

Opret et kort

Denne gang vil kortet hit dom blive udført i enheder af "Tilemap". Derfor opretter vi to Tilemaps, "Tilemap uden hitdetektion" og "Tilemap med hitdetektion".

Opret først to Tilemaps i hierarkiet. Du kan oprette to i gitteret. Navnene er "TilemapObeject" og "TilemapGround" for klarhedens skyld.

Opret først en "TilemapGround". Da det er et bevægeligt område, kan du simpelthen lægge jorden. Hvis det er på jorden, kan du ændre mønsteret.

Forresten, hvis tegnet er skjult, skal du vælge tegnobjektet og indstille inspektørens Sprite Renderer lagrækkefølge til 2. Lagenes rækkefølge er som standard 0, og Tilemap er 0, så hvis du øger den over denne værdi, vises den i forgrunden.

Vælg derefter TilemapObject, og placer det maptip, du vil gøre ubevægeligt. Indstil lagrækkefølgen til 1 først. Dette er for at få det til at se ud foran jorden.

Sådan ser det ud, hvis du skjuler jorden.

Selvfølgelig er der på dette tidspunkt ingen indstillinger relateret til kollisionsdetektering, så du kan køre på højt terræn normalt. Herefter indstiller vi kollisionsdetekteringen.

Indstillinger for kollisionsregistrering

Lad os først oprette karakteren. Denne indstilling er næsten den samme som nedenstående tip, så jeg vil springe detaljerne over og kort forklare proceduren.

Vælg et tegnobjekt fra hierarkiet, og vælg Fysik 2D -> Circle Collider 2D fra Tilføj komponent. Hvis objektets form er rektangulær, er "Box Collider 2D" fint.

På samme måde skal du tilføje "Fysik 2D -> Rigidbody 2D".

Indstil tyngdekraftsskalaen til 0 for at forhindre Rigidbody 2D automatisk fald.

Kontroller Z under Begrænsninger for at forhindre, at spritten roterer, når den kolliderer.

Vælg derefter "TilemapObject", du vil ramme, og vælg "Tilemap -> Tilemap Collider 2D" fra "Tilføj komponent".

Det er alt, hvad der er til det. Du behøver ikke engang nogen programmering. Kør spillet og prøv at ramme objektet, der bliver væggen. Jeg tror, du kan sørge for, at det stopper ordentligt.

Men når du rent faktisk rammer det, tror jeg, at der vil være bekymringspunkter i adfærden. Her er nogle løsninger:

Ubekvem opførsel af hitdetektion med kortet og løsningerne

Når du rammer en mur, kan du finde et par ting, der generer dig.

Hvis du bevæger dig mod væggen, bliver du fanget i midten

Box Collider 2D Jeg tror, det vil ske, hvis du bruger et objekt.

For eksempel, fra scenen nedenfor, når du trykker på tasten nederst til venstre, vil du have den til at flytte til venstre langs væggen. Men efter nogle fremskridt tror jeg, at det vil sidde fast i noget og stoppe.

Genkend buler i vægge efter position

Circle Collider 2D Jeg synes, det er let at forstå, hvis du vedhæfter . Væggen skal være flad, men hvis du flytter den mod væggen, vil du se, at væggen bevæger sig som om den er ujævn.

Årsager og løsninger på snags og bump

Årsagen til, at disse forekommer, synes at være, at "hitbestemmelse udføres på mapchip-basis". Når du vælger TilemapObject, vises der faktisk en grøn linje på det sted, hvor hitregistreringen er placeret, og du kan se, at dette er en linje, der er tegnet i MapTip-enheder.

Så hvis det bevægelige objekt er på en linje svarende til nøjagtigt en kortchip, vil det blive bedømt som et hit med en kortchip. Hvis du kolliderer ved grænsen af kortchipsene, vil to kortchips blive ramt og bedømt, så styrken af hoppet vil stige.

Jeg tror, at den bedste måde at løse dette problem på er at kombinere hitdetektionen med de vedhæftede mapchips. Sådan gør du:

VælgTilemap Collider 2D "TilemapObject" med hitdetektion fra inspektøren, og marker "Brug i komposit" fra .

Som anført i advarslen har dette alene ingen effekt, så vælg "Physics 2D -> Composite Collider 2D" fra "Add Component".

Rigidbody 2D tilføjes sammen med Composite Collider 2D.

Det er lidt forvirrende, men jeg tror, du kan bekræfte, at den grønne linje ved grænsen mellem mapchips med hitdetektion er forsvundet.

Jeg vil ikke have, at flisekortet bevæger sig, så jeg Rigidbody 2D lader komponentkropstypen være "statisk".

Kør nu spillet og prøv at få det til at bevæge sig. Jeg tror, at selvom du bevæger dig diagonalt langs væggen, bliver den ikke fanget, og du kan bevæge dig glat uden ujævn bevægelse.

Fjern karakterskub tilbage fra vægge

Du kan se, at hvis du flytter karakteren for at skubbe væggen og derefter stoppe med at bevæge dig, vil den opføre sig lidt som hoppet tilbage fra væggen.

For at løse dette skalRigidbody 2D du vælge tegnobjektet og ændre "Kollisionsdetektering" til "Kontinuerlig" fra komponenten.

Forskellen mellem "diskontinuerlig" og "kontinuerlig" er som følger.

Diskontinuerlig

Kollisionsdetektion er en mekanisme, der tænker efter bevægelse. Det er en form, der udfører kollisionsdetektion fra den tilstand, hvor den flyttes og indlejres i væggen. Det er let at forstå, hvis du forbinder det med trampoliner og gummi, men jo mere det er indlejret, jo mere afstødende vil kraften stige, og hoppet bliver stærkere. I stedet udføres beregningen efter flytning, så behandlingsomkostningerne er lave.

Kontinuerlig

Det behandles, mens det bestemmes, hvad der er på vej. Bestem, om der er en væg mellem positionen før og efter flytningen, Hvis der er en mur, vil den dømme kollisionen der og stoppe, så der er praktisk talt ingen afstødning. I stedet stiger behandlingsomkostningerne lidt, fordi beregningen er inkluderet midt i bevægelsen.

Fanget i hjørnet af et kortobjekt

Afhængigt af programmet og placeringen fanges nogle, og nogle er ikke, og årsagen har ikke ændret sig meget. Forresten sker det med kantede hjørner som Box Collider 2D, og ikke med afrundede cirkler.

Selvom et sådant mystisk fænomen opstår, er det godt at have afrundede hjørner af collideren for at undgå snags. Det er begrænset til Box Collider 2D, men for at gøre det rundt har karakterobjektets Box Collider 2D-komponent en "kantradius", og du sætter en værdi der. Hvis du indtaster 1 som en numerisk enhed, foretages der afrunding for objektstørrelsen. Det afhænger af størrelsen, men det er godt at sætte omkring 0,1.

Forresten øges hitdommen kun med rundhedens størrelse, så juster den, hvis den er stor. Box Collider 2D har en Collider Edit-knap, der giver dig mulighed for at ændre størrelsen direkte i visningen ved at klikke på knappen. Da den ydre grønne linje er den faktiske hitdetektion, skal du indstille størrelsen, så den ikke er unaturlig.

Kør derefter spillet for at sikre, at det ikke bliver ridset og foretag justeringer.