Find ud af, om objekter kolliderer med hinanden (2D)

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.

Først

Dette tip forklarer, hvordan du finder ud af, om to objekter er i kontakt. Flyt et objekt med tastaturet.

Præparation

Når du har oprettet projektet, skal du forberede to billeder af sprite, der vil være objektet. Hvis du er besværlig at forberede, kan du placere to identiske sprites, men denne gang adskiller vi dem for klarhedens skyld. Navnene er henholdsvis "UnityTips" og "UnityTips_2".

Tilføj to billedfiler ved at slippe dem i visningen.

Tilføj et script for at flytte det venstre objekt med tastaturet. Scriptnavnet Player er . Scriptindholdet ligner tippene i Flyt, roter og skaler en sprite.

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    // スプライトの移動処理
    // Translate メソッドでスプライトの位置が移動します
    // Space.World を指定すると回転の影響をうけません
    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);
    }
  }
}

Vedhæft til det objekt, som du vil køre scriptet på.

Kør spillet og kontroller, om det fungerer med piletasterne på dit tastatur.

Til sidst skal du placere et tekstobjekt for at få vist status for kollisionsregistrering. Objektets navn TextState er .

Indstillinger for kollisionshåndtering

Herfra kan du konfigurere indstillingerne relateret til kollisioner.

Vælg først det objekt, du vil flytte, "UnityTips", og klik på "Tilføj komponent" fra inspektøren. Vælg på Physics 2D listen. Physics er et 3D-objekt, så tag ikke fejl.

Physics 2DBox Collider 2D Vælg mellem . Da denne sprite er rektangulær, vælges Boks, men hvis den f.eks. er cirkelformet, skal du vælge andre figurer, f.eks. Cirkel.

Box Collider 2D Da komponenten tilføjes, skal du kontrollere "Gør det udløser" fra parametrene. Dette giver dig mulighed for kun at få oplysninger om "om du rammer eller ej".

Rigidbody 2D Tilføj derefter komponenterne i . Du kan tilføje det fra "Fysik 2D -> Rigidbody 2D". Rigidbody giver fysikinformationCollider til objektet og kan også bestemme kollisioner med objekter, der har .

Rigidbody Men hvis du har en komponent, vil den også indeholde tyngdekraftsinformation i -Y-retningen, så hvis du udfører den, falder den ned. Så indstil "Gravity Scale" til 0 fra parametrene.

Forresten, hvis det er et siderullende actionspil, kan det være praktisk at bruge tyngdekraftsskalaen i den forstand, at den er frit fald ned.

På samme måde skal du tilføje en komponent til det Box Collider 2D andet objekt "UnityTips_2". Dette er den berørte side denne gang, så du behøver ikke ændre nogen indstillinger.

Player Åbn scriptet, og tilføj hvert felt og metode ved hjælp af følgende:

using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class Player : MonoBehaviour
{
  /// <summary>状態表示用テキストオブジェクト。</summary>
  [SerializeField] private Text TextState;

  // 中略

  /// <summary>衝突した瞬間に呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerEnter2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerStay2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerExit2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }
}

Da vi ønsker at vise oplysninger om, hvorvidt det blev ramt eller ej, vil vi gøre det muligt at vise det i et tekstobjekt som følger.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

Kollisionsdetekteringsprocessen beskrives som følger.

/// <summary>衝突した瞬間に呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerEnter2D(Collider2D partner)
{
  TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
  TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
  TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Rigidbody 2D Hver af ovenstående begivenheder opstår, når et objekt, der har, kolliderer med et andet objekt Collider 2D , der har . Dette giver dig mulighed for at bestemme og behandle, om det er korrekt eller ej.

Der er tre begivenheder, som hver kaldes på følgende tidspunkt.

OnTriggerEnter2D Når objekter rammer hinanden
OnTriggerStay2D Mens objekter rammer hinanden
OnTriggerExit2D Når objekter forlader kollisionstilstanden

I begge tilfælde modtager modstanderobjektet modstanderens objekt som et argument, så du kan få modstanderens Collider2D objekt ved at slå den type mål opCollider2D.gameObject, der rammes af (fjende, Collider2D.tag genstand osv.).

Af de OnTriggerEnter2D ovennævnte tre begivenheder, og OnTriggerExit2D kaldes en gang pr. Kollision.

OnTriggerStay2D kaldes hver ramme under kollisionen, men begivenheden kaldes ikke længere, når der er gået en vis tid, siden begge objekter stoppede. Dette skyldes, at det anses for at være gået i dvaletilstand, og det betragtes som spild af forarbejdning at beregne kollisioner hver ramme med noget, der ikke bevæger sig.

Hvis du ikke vil have den til at sove, skal du Rigidbody 2D ændre parameterens dvaletilstand til "Sov ikke".

Når du har ændret koden, skal du indstille teksten til visning af information.

Kør spillet og flyt objektet med tastaturet for at røre ved en anden sprite. Du kan se, at der kræves tre funktioner for hver.

Forresten, hvis du rører ved et objekt og derefter holder op med at bevæge dig, vil metoden blive kaldt i OnTriggerStay2D kort tid. Du skal kunne se, at metoden ikke længere kaldes efter OnTriggerStay2D en vis tid.

Dette indikerer, at du har indtastet en dvaletilstand, men hvis du vil ændre tiden, indtil du indtaster denne søvn, kan du ændre den ved at vælge "2D Physics" fra projektindstillingerne og angive parameteren "Sleep time" i sekunder. Det kan ikke indstilles til 0, men hvis det OnTriggerStay2D er indstillet til uendeligt lille, vil selve metoden ikke blive kaldt.