Implementera träffidentifiering med panelkartor

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 11
Unity-redaktör
  • 2021.3.3F1
Paket för inmatningssystem
  • 1.3.0

Förutsättningar för det här tipset

Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.

Vilka är förutsättningarna för detta tips?

Om att låna kartmaterial

Vi behandlar lånade från följande platser.

Implementering av gående tecken

Implementera först en karta och ett tecken som utför träffdetektering. Detta tecken kan flyttas med markörknapparna på tangentbordet. Men om du genomför en ordentlig promenad kommer den att vara lång och långt ifrån kärnan i boktipsen, så den här gången flyttar jag bara en enkel enda bild.

Om du vill implementera gånganimationer, se följande tips:

När du har skapat projektet lägger du till en sprite-bild av objektet som du vill flytta till projektet.

Markera bilden och ställ in pixlar per enhet på 32 från granskaren. Detta beror på att storleken på en kvadrat på mapchip är 32 pixlar, så det passar det. När du har konfigurerat klickar du på knappen "Apply" nedan.

Placera sprite i vyn.

Skapa ett skript för att flytta sprite. Detta liknar följande tips:

Lämna skriptnamnet Player som .

Kod enligt följande:

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

Fäst vid spriten som du vill flytta.

Kör spelet och kontrollera om du vill flytta det med tangentbordet.

Förbereda karttips

Först och främst kommer vi att förbereda ett mapchip och skapa en karta. Den här proceduren liknar följande tips: Karttips med 2D Tilemap Extras kan också upptäcka kollisioner, men de kommer inte att användas i den här artikeln eftersom proceduren kommer att vara lång.

Förbered originalbilden av karttipset och lägg till den i projektet. För att göra operationen lättare att förstå, förbered en "gångbar plats" och en "icke-gångbar plats" för kartchipmaterialet.

Ställ in det för MapChips i granskaren och klicka på knappen Verkställ. När du har konfigurerat öppnar du Sprite-redigeraren.

Det är ett karttips på 32 pixlar, så jag delar upp det vid 32.

Välj fliken Panelpalett. Om inte, visa den med "Window > 2D -> Tile Palette" från menyn. Skapa en ny palett. Namnet är godtyckligt, men för närvarande kallar vi det "MapChipPalette".

Skapa en MapChipPalette-mapp i Scenes och ange den.

Lägg till ett karttips genom att dra det till paletten. Spara den i mappen MapChipPalette som du skapade tidigare.

Skapa en karta

Den här gången kommer kartträffbedömningen att utföras i enheter av "Tilemap". Därför skapar vi två Tilemaps, "Tilemap without hit detection" och "Tilemap with hit detection".

Skapa först två Tilemaps i hierarkin. Du kan skapa två i rutnätet. Namnen är "TilemapObeject" och "TilemapGround" för tydlighetens skull.

Skapa först en "TilemapGround". Eftersom det är ett rörligt intervall kan du helt enkelt lägga marken. Om det är på marken kan du ändra mönstret.

Förresten, om tecknet är dolt, välj teckenobjektet och ställ in lagerordningen för inspektören Sprite Renderer till 2. Ordningen på lagren är 0 som standard och Tilemap är 0, så om du ökar den över det här värdet visas den i förgrunden.

Välj sedan TilemapObject och placera karttipset som du vill göra orörligt. Ställ in lagerordningen till 1 först. Detta för att få det att visas framför marken.

Så här ser det ut om du gömmer marken.

Naturligtvis finns det för närvarande inga inställningar relaterade till kollisionsdetektering, så du kan åka på hög mark normalt. Efter detta ställer vi in kollisionsdetekteringen.

Inställningar för kollisionsdetektering

Låt oss först ställa in karaktären. Denna inställning är nästan densamma som tipsen nedan, så jag hoppar över detaljerna och förklarar kortfattat proceduren.

Markera ett teckenobjekt i hierarkin och välj Physics 2D -> Circle Collider 2D från Add Component. Om objektets form är rektangulär är "Box Collider 2D" bra.

Lägg på samma sätt till "Physics 2D -> Rigidbody 2D".

Ställ in tyngdkraftsskalan på 0 för att förhindra Rigidbody 2D automatiskt fall.

Markera Z under Begränsningar för att förhindra att spriten roterar när den kolliderar.

Välj sedan "TilemapObject" som du vill slå och välj "Tilemap -> Tilemap Collider 2D" från "Lägg till komponent".

Det är allt som finns i det. Du behöver inte ens någon programmering. Kör spelet och försök träffa föremålet som blir väggen. Jag tror att du kan se till att det stannar ordentligt.

Men när du faktiskt träffar det tror jag att det kommer att finnas orosmoment i beteendet. Här är några lösningar:

Obekvämt beteende för träffdetektering med kartan och lösningarna

När du träffar en vägg kan du hitta några saker som stör dig.

Om du rör dig mot väggen kommer du att fastna i mitten

Box Collider 2D Jag tror att det kommer att hända om du använder ett objekt.

Till exempel, från scenen nedan, när du trycker på knappen längst ner till vänster, vill du att den ska flytta till vänster längs väggen. Men efter några framsteg tror jag att det kommer att fastna i något och sluta.

Känn igen bucklor i väggar efter position

Circle Collider 2D Jag tror det är lätt att förstå om du bifogar. Väggen ska vara platt, men om du flyttar den mot väggen ser du att väggen rör sig som om den är ojämn.

Orsaker och lösningar på snags och stötar

Anledningen till att dessa inträffar verkar vara att "träffbestämning utförs på mapchip-basis". Faktum är att när du väljer TilemapObject visas en grön linje på den plats där träffidentifieringen finns, och du kan se att det här är en linje som ritas i MapTip-enheter.

Så om det rörliga objektet ligger på en linje som motsvarar exakt ett kartchip, kommer det att bedömas som en träff med ett kartchip. Om du kolliderar vid gränsen för kartchipsen kommer två kartmarker att träffas och bedömas, så studsens styrka ökar.

Jag tror att det bästa sättet att lösa detta problem är att kombinera träffdetekteringen med de bifogade mapchips. Så här gör du:

VäljTilemap Collider 2D "TilemapObject" med träffdetektering från inspektören och markera "Använd i komposit" från .

Som anges i varningen har detta ensam ingen effekt, så välj "Physics 2D -> Composite Collider 2D" från "Add Component".

Rigidbody 2D läggs till tillsammans med Composite Collider 2D.

Det är lite förvirrande, men jag tror att du kan bekräfta att den gröna linjen vid gränsen mellan mapchips med träffdetektering har försvunnit.

Jag vill inte att panelkartan ska flyttas, så jag Rigidbody 2D lämnar komponentens brödtexttyp som "statisk".

Kör nu spelet och försök att få det att röra sig. Jag tror att även om du rör dig diagonalt längs väggen kommer den inte att fastna och du kan röra dig smidigt utan ojämn rörelse.

Eliminera karaktärstryck tillbaka från väggar

Du kan se att om du flyttar karaktären för att trycka på väggen och sedan sluta röra dig, kommer den att bete sig lite som studsade tillbaka från väggen.

För att lösa detta,Rigidbody 2D välj teckenobjektet och ändra "Kollisionsdetektering" till "Kontinuerlig" från komponenten.

Skillnaden mellan "diskontinuerlig" och "kontinuerlig" är som följer.

Diskontinuerlig

Kollisionsdetektering är en mekanism som tänker efter att ha flyttat. Det är en form som utför kollisionsdetektering från det tillstånd där den flyttas och inbäddad i väggen. Det är lätt att förstå om du associerar det med studsmattor och gummi, men ju mer det är inbäddat, desto mer motbjudande kommer kraften att öka och studsen blir starkare. Istället utförs beräkningen efter flyttning, så bearbetningskostnaden är låg.

Kontinuerlig

Det bearbetas medan man bestämmer vad som är på väg. Bestäm om det finns en vägg mellan positionen före och efter flytten, Om det finns en vägg kommer den att bedöma kollisionen där och stanna, så det finns praktiskt taget ingen avstängning. Istället ökar bearbetningskostnaden lite eftersom beräkningen ingår mitt i rörelsen.

Fångad i hörnet av ett kartobjekt

Beroende på program och plats fångas vissa och andra inte, och orsaken har inte förändrats mycket. Förresten händer det med vinklade hörn som Box Collider 2D, och inte med rundade cirklar.

Även om ett sådant mystiskt fenomen inträffar är det bra att ha rundade hörn av kollideraren för att undvika snags. Det är begränsat till Box Collider 2D, men för att göra det runt har teckenobjektets Box Collider 2D-komponent en "kantradie" och du lägger till ett värde där. Om du anger 1 som en numerisk enhet sker avrundning för objektstorleken. Det beror på storleken, men det är bra att lägga ca 0,1.

Förresten, träffdomen ökar bara med storleken på rundheten, så justera den om den är stor. Box Collider 2D har en Collider Edit-knapp som låter dig ändra storlek på den direkt i vyn genom att klicka på knappen. Eftersom den yttre gröna linjen är den faktiska träffdetekteringen, ställ in storleken så att den inte är onaturlig.

Efter det, kör spelet för att se till att det inte repas och gör justeringar.