Implementeer hitdetectie met tilemaps

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2021.3.3f1
Input systeem pakket
  • 1.3.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

Wat zijn de voorwaarden voor deze tip?

Over het lenen van kaartmateriaal

We verwerken geleend van de volgende sites.

Implementatie van wandelende karakters

Implementeer eerst een kaart en een teken dat hitdetectie uitvoert. Dit teken kan worden verplaatst met de cursortoetsen op het toetsenbord. Als je echter een goede wandeling maakt, zal deze lang en ver van de essentie van de boektips zijn, dus deze keer zal ik alleen een eenvoudige enkele foto verplaatsen.

Als u wandelanimaties wilt implementeren, raadpleegt u de volgende tips:

Nadat u het project hebt gemaakt, voegt u een sprite-afbeelding toe van het object dat u naar het project wilt verplaatsen.

Selecteer de afbeelding en stel de pixels per eenheid in het infovenster in op 32. Dit komt omdat de grootte van één vierkant van de mapchip 32 pixels is, dus daar past het bij. Eenmaal geconfigureerd, klikt u op de knop "Toepassen" hieronder.

Plaats de sprite in de weergave.

Maak een script om de sprite te verplaatsen. Dit is vergelijkbaar met de volgende tips:

Laat de scriptnaam Player staan als .

Code als volgt:

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

Bevestig aan de sprite die u wilt verplaatsen.

Voer het spel uit en controleer of je het met het toetsenbord wilt verplaatsen.

Kaartinfo voorbereiden

Allereerst zullen we een mapchip voorbereiden en een kaart maken. Deze procedure is vergelijkbaar met de volgende tips: MapTips met 2D Tilemap Extra's zijn ook in staat tot botsingsdetectie, maar ze zullen niet worden gebruikt in dit artikel omdat de procedure lang zal zijn.

Bereid de originele afbeelding van de kaartinfo voor en voeg deze toe aan uw project. Om de operatie begrijpelijker te maken, bereidt u een "beloopbare plaats" en een "niet-beloopbare plaats" voor op het kaartchipmateriaal.

Stel het in voor MapChips in het infovenster en klik op de knop Toepassen. Eenmaal geconfigureerd, opent u de Sprite Editor.

Het is een 32-pixel maptip, dus ik splits het op 32.

Selecteer het tabblad Tegelpalet. Zo niet, geef het dan weer met "Window > 2D -> Tile Palette" in het menu. Maak een nieuw palet. De naam is arbitrair, maar voor nu zullen we het "MapChipPalette" noemen.

Maak een map MapChipPalette in Scènes en geef deze op.

Voeg een kaartinfo toe door deze naar het palet te slepen. Sla het op in de map MapChipPalette die u eerder hebt gemaakt.

Een kaart maken

Deze keer zal het kaarthitoordeel worden uitgevoerd in eenheden van "Tilemap". Daarom zullen we twee Tilemaps maken, "Tilemap zonder hitdetectie" en "Tilemap met hitdetectie".

Maak eerst twee Tilemaps in de hiërarchie. U kunt er twee maken in het raster. De namen zijn "TilemapObeject" en "TilemapGround" voor de duidelijkheid.

Maak eerst een "TilemapGround". Omdat het een beweegbaar bereik is, kunt u eenvoudig de grond leggen. Als het op de grond ligt, kunt u het patroon wijzigen.

Trouwens, als het teken verborgen is, selecteert u het tekenobject en stelt u de laagvolgorde van de Sprite Renderer inspecteur in op 2. De volgorde van de lagen is standaard 0 en de Tilemap is 0, dus als u deze boven deze waarde verhoogt, wordt deze op de voorgrond weergegeven.

Selecteer vervolgens TilemapObject en plaats de kaartinfo die u onbeweeglijk wilt maken. Stel de laagvolgorde eerst in op 1. Dit om het voor de grond te laten verschijnen.

Zo ziet het eruit als je de grond verbergt.

Natuurlijk zijn er op dit moment geen instellingen met betrekking tot botsingsdetectie, zodat u normaal op hoog terrein kunt rijden. Hierna stellen we de aanrijdingsdetectie in.

Instellingen voor botsingsdetectie

Laten we eerst het personage instellen. Deze instelling is bijna hetzelfde als de onderstaande tips, dus ik zal de details overslaan en de procedure kort uitleggen.

Selecteer een tekenobject in de hiërarchie en selecteer Physics 2D -> Circle Collider 2D in Add Component. Als de vorm van het object rechthoekig is, is "Box Collider 2D" prima.

Voeg op dezelfde manier "Physics 2D -> Rigidbody 2D" toe.

Stel de zwaartekrachtschaal in op 0 om automatisch vallen te voorkomen Rigidbody 2D .

Controleer Z onder Beperkingen om te voorkomen dat de sprite roteert tijdens een botsing.

Selecteer vervolgens "TilemapObject" dat u wilt raken en selecteer "Tilemap -> Tilemap Collider 2D" van "Component toevoegen".

Dat is alles. Je hebt niet eens een programmering nodig. Voer het spel uit en probeer het object te raken dat de muur wordt. Ik denk dat je ervoor kunt zorgen dat het goed stopt.

Wanneer je het echter daadwerkelijk raakt, denk ik dat er punten van zorg zullen zijn in het gedrag. Hier zijn enkele oplossingen:

Onhandig gedrag van hitdetectie met de kaart en oplossingen

Wanneer je een muur raakt, kun je een paar dingen vinden die je storen.

Als je tegen de muur beweegt, kom je in het midden te zitten

Box Collider 2D Ik denk dat het zal gebeuren als je een object gebruikt.

Als u bijvoorbeeld in de onderstaande scène op de toets linksonder drukt, wilt u dat deze langs de muur naar links beweegt. Na enige vooruitgang denk ik echter dat het ergens in vast komt te zitten en stopt.

Herken deuken in muren op positie

Circle Collider 2D Ik denk dat het gemakkelijk te begrijpen is als je . De muur moet vlak zijn, maar als je hem tegen de muur beweegt, zul je zien dat de muur beweegt alsof hij ongelijk is.

Oorzaken en oplossingen voor haken en ogen

De reden waarom deze optreden lijkt te zijn dat "hitbepaling wordt uitgevoerd op basis van mapchip". Wanneer u TilemapObject selecteert, verschijnt er een groene lijn op de plaats waar de hitdetectie zich bevindt en kunt u zien dat dit een lijn is die is getekend in MapTip-eenheden.

Dus als het bewegende object zich op een lijn bevindt die gelijk is aan precies één kaartchip, wordt het beoordeeld als een hit met één kaartchip. Als je botst op de grens van de kaartchips, worden twee kaartchips geraakt en beoordeeld, zodat de sterkte van de bounce toeneemt.

Ik denk dat de beste manier om dit probleem op te lossen is om de hitdetectie te combineren met de bijgevoegde mapchips. Hier is hoe het te doen:

SelecteerTilemap Collider 2D "TilemapObject" met hitdetectie in de inspecteur en vink "Gebruik in composiet" aan in .

Zoals vermeld in de waarschuwing, heeft dit alleen geen effect, dus selecteer "Physics 2D -> Composite Collider 2D" uit "Add Component".

Rigidbody 2D wordt toegevoegd samen met Composite Collider 2D.

Het is een beetje verwarrend, maar ik denk dat je kunt bevestigen dat de groene lijn op de grens tussen mapchips met hitdetectie is verdwenen.

Ik wil niet dat de tilemap beweegt, dus ik laat Rigidbody 2D het type componentlichaam als "statisch" staan.

Voer nu het spel uit en probeer het in beweging te krijgen. Ik denk dat zelfs als je diagonaal langs de muur beweegt, het niet vast komt te zitten en je soepel kunt bewegen zonder hobbelige bewegingen.

Elimineer karakterverschuivingen van muren

Je kunt zien dat als je het personage beweegt om de muur te duwen en vervolgens stopt met bewegen, het zich een beetje zal gedragen alsof het van de muur wordt teruggekaatst.

Om dit op te lossen,Rigidbody 2D selecteert u het tekenobject en wijzigt u "Botsingsdetectie" in "Continu" van de component.

Het verschil tussen "discontinu" en "continu" is als volgt.

Discontinue

Botsingsdetectie is een mechanisme dat denkt na het bewegen. Het is een vorm die botsingsdetectie uitvoert vanuit de toestand waarin het wordt verplaatst en ingebed in de muur. Het is gemakkelijk te begrijpen als je het associeert met trampolines en rubber, maar hoe meer het is ingebed, hoe afstotender de kracht zal toenemen en de stuit sterker zal zijn. In plaats daarvan wordt de berekening uitgevoerd na het verplaatsen, zodat de verwerkingskosten laag zijn.

Continu

Het wordt verwerkt terwijl wordt bepaald wat er onderweg is. Bepaal of er een muur is tussen de positie voor en na de verhuizing, Als er een muur is, zal deze de botsing daar beoordelen en stoppen, dus er is praktisch geen afstoting. In plaats daarvan stijgen de verwerkingskosten een beetje omdat de berekening in het midden van de beweging wordt opgenomen.

Gevangen in de hoek van een kaartobject

Afhankelijk van het programma en de locatie worden sommigen betrapt en sommige niet, en de oorzaak is niet veel veranderd. Het gebeurt trouwens met hoekige hoeken zoals Box Collider 2D, en niet met afgeronde cirkels.

Zelfs als zo'n mysterieus fenomeen zich voordoet, is het goed om afgeronde hoeken van de collider te hebben om haken en ogen te voorkomen. Het is beperkt tot Box Collider 2D, maar om het rond te maken, heeft de Box Collider 2D-component van het personageobject een "randradius" en je plaatst daar een waarde. Als u 1 invoert als een numerieke eenheid, vindt afronding plaats voor de objectgrootte. Het hangt af van de grootte, maar het is goed om ongeveer 0,1 te zetten.

Overigens neemt het hitoordeel alleen toe met de grootte van de ronding, dus pas het aan als het groot is. Box Collider 2D heeft een Collider Edit-knop waarmee u het formaat rechtstreeks in de weergave kunt wijzigen door op de knop te klikken. Aangezien de buitenste groene lijn de werkelijke hitdetectie is, stelt u de grootte zo in dat deze niet onnatuurlijk is.

Voer daarna het spel uit om ervoor te zorgen dat het geen krassen krijgt en breng aanpassingen aan.