Annak megállapítása, hogy az objektumok ütköznek-e egymással (2D)

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2021.3.3f1
Bemeneti rendszercsomag
  • 1.3.0

A tipp előfeltételei

A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.

Először

Ez a tipp bemutatja, hogyan állapítható meg, hogy két objektum érintkezik-e. Mozgasson egy objektumot a billentyűzettel.

Előkészítés

A projekt létrehozása után készítsen két képet a sprite-ról, amely az objektum lesz. Ha nehéz előkészíteni, két azonos sprite-ot helyezhet el, de ezúttal elválasztjuk őket az egyértelműség érdekében. A nevek "UnityTips" és "UnityTips_2".

Adjon hozzá két képfájlt úgy, hogy a nézetbe húzza őket.

Adjon hozzá egy szkriptet a bal oldali objektum billentyűzettel való mozgatásához. A szkript neve Player . A szkript tartalma hasonló a Sprite áthelyezése, elforgatása és méretezése tippjeihez.

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

Csatolja ahhoz az objektumhoz, amelyen futtatni szeretné a parancsfájlt.

Futtassa a játékot, és ellenőrizze, hogy működik-e a billentyűzet kurzorbillentyűivel.

Végül helyezzen el egy szöveges objektumot az ütközésészlelés állapotának megjelenítéséhez. Az objektum neve TextState .

Ütközéskezelési beállítások

Itt konfigurálhatja az ütközésekkel kapcsolatos beállításokat.

Először válassza ki az áthelyezni kívánt objektumot, a "UnityTips" -t, majd kattintson az "Összetevő hozzáadása" gombra az ellenőrből. Physics 2D Válasszon a listából. Physics egy 3D-s objektum, ezért félreértés ne essék.

Physics 2DBox Collider 2D Válasszon a közül. Mivel ez a sprite téglalap alakú, a program kijelöli a Doboz elemet, de ha például kör alakú, jelöljön ki más alakzatokat, például a Kör alakzatot.

Box Collider 2D Mivel az összetevő hozzáadásra kerül, jelölje be a paraméterek közül a "Make it trigger" lehetőséget. Ez lehetővé teszi, hogy csak arról kapjon információt, hogy "eltalálta-e vagy sem".

Rigidbody 2D Ezután adja hozzá a összetevőit. Hozzáadhatja a "Fizika 2D -> Rigidbody 2D" részből. Rigidbody fizikai információkatCollider ad az objektumnak, és meghatározhatja az ütközéseket olyan objektumokkal, amelyek .

Rigidbody Ha azonban van egy alkatrésze, akkor az -Y irányban gravitációs információkat is tartalmaz, így ha végrehajtja, akkor leesik. Tehát állítsa a "Gravitációs skálát" 0-ra a paraméterekből.

Egyébként, ha ez egy oldalsó görgetéses akciójáték, akkor kényelmes lehet a gravitációs skálát használni abban az értelemben, hogy szabadon esik.

Hasonlóképpen adjon hozzá egy összetevőt a Box Collider 2D másik "UnityTips_2" objektumhoz. Ezúttal ez az érintett oldal, így nem kell módosítania a beállításokat.

Player Nyissa meg a szkriptet, és adja hozzá az egyes mezőket és metódusokat az alábbiak szerint:

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

Mivel információt szeretnénk megjeleníteni arról, hogy eltalálták-e vagy sem, lehetővé tesszük annak megjelenítését szöveges objektumban az alábbiak szerint.

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

Az ütközésérzékelési folyamat leírása a következő.

/// <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 A fenti események mindegyike akkor fordul elő, ha egy objektum ütközik egy másik Collider 2D , . Ez lehetővé teszi, hogy meghatározza és feldolgozza, hogy helyes-e vagy sem.

Három esemény van, amelyek mindegyikét a következő időzítéssel hívják meg.

OnTriggerEnter2D Amikor a tárgyak egymásnak ütköznek
OnTriggerStay2D Miközben a tárgyak egymásnak ütköznek
OnTriggerExit2D Amikor az objektumok elhagyják az ütközési állapotot

Mindkét esetben az ellenfél tárgya argumentumként fogadja az ellenfél objektumát, így az ellenfél objektumát Collider2D úgy kaphatod meg, hogy megkeresed Collider2D.gameObject az eltalált célpont típusát (ellenség, Collider2D.tag tárgy stb.).

A fenti három esemény közül OnTriggerEnter2D , és OnTriggerExit2D ütközésenként egyszer hívják őket.

OnTriggerStay2D az ütközés során minden képkockát meghívnak, de az eseményt már nem hívják meg, miután egy bizonyos idő eltelt azóta, hogy mindkét objektum megállt. Ez azért van, mert úgy tekintik, hogy alvó állapotba lépett, és feldolgozási pazarlásnak tekintik, ha minden képkockát ütközésnek számítanak valamivel, ami nem mozog.

Ha Rigidbody 2D nem szeretné, hogy alvó állapotba kerüljön, módosítsa a paraméter alvó üzemmódját "Ne aludjon" értékre.

A kód megváltoztatása után állítsa be az információk megjelenítésére szolgáló szöveget.

Futtassa a játékot, és mozgassa az objektumot a billentyűzettel, hogy megérintsen egy másik sprite-ot. Láthatja, hogy mindegyikhez három függvény van meghívva.

Egyébként, ha megérint egy tárgyat, majd abbahagyja a mozgást, a módszert rövid időre hívják OnTriggerStay2D . Látnia kell, hogy a metódust egy bizonyos idő elteltével OnTriggerStay2D már nem hívják meg.

Ez azt jelzi, hogy alvó állapotba lépett, de ha módosítani szeretné az alvásba való belépésig eltelt időt, megváltoztathatja azt a "2D fizika" kiválasztásával a projekt beállításaiból, és másodpercben megadva az "Alvási idő" paramétert. Nem állítható 0-ra, de ha OnTriggerStay2D végtelenül kicsire van állítva, maga a módszer nem kerül meghívásra.