Určení, zda objekty kolidují (2D)

Stránky aktualizovány :
Datum vytvoření stránky :

Ověřovací prostředí

Windows
  • Systém Windows 11
Editor jednoty
  • 2021.3.3f1
Vstupní systémový balíček
  • 1.3.0

Předpoklady pro tento tip

Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.

Nejprve

Tento tip vysvětluje, jak zjistit, zda jsou dva objekty v kontaktu. Přesunutí jednoho objektu pomocí klávesnice

Příprava

Po vytvoření projektu připravte dva obrázky pohyblivého symbolu, který bude objektem. Pokud máte potíže s přípravou, můžete umístit dva identické skřítky, ale tentokrát je oddělíme pro přehlednost. Názvy jsou "UnityTips" a "UnityTips_2".

Přidejte dva obrazové soubory tak, že je přetáhnete do zobrazení.

Přidejte skript pro přesunutí levého objektu pomocí klávesnice. Název skriptu Player je . Obsah skriptu je podobný tipům v části Přesunutí, otočení a změna měřítka pohyblivého symbolu.

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

Připojte se k objektu, na kterém chcete skript spustit.

Spusťte hru a zkontrolujte, zda funguje s kurzorovými klávesami na klávesnici.

Nakonec umístěte textový objekt, který zobrazí stav detekce kolizí. Název objektu TextState je .

Nastavení řešení kolizí

Zde můžete konfigurovat nastavení související s kolizemi.

Nejprve vyberte objekt, který chcete přesunout, "UnityTips", a v inspektoru klikněte na "Přidat komponentu". Vyberte ze Physics 2D seznamu. Physics je 3D objekt, takže se nenechte zmýlit.

Physics 2DBox Collider 2D Vyberte z . Protože je tento pohyblivý symbol obdélníkový, je vybrán Rámeček, ale pokud má například tvar kruhu, vyberte jiné tvary, například Kruh.

Box Collider 2D Vzhledem k tomu, že komponenta bude přidána, zaškrtněte v parametrech "Make it trigger". To vám umožní získat informace pouze o tom, "zda jste zasáhli nebo ne".

Rigidbody 2D Pak přidejte komponenty . Můžete jej přidat z "Physics 2D -> Rigidbody 2D". Rigidbody poskytuje fyzikální informaceCollider objektu a může také určit kolize s objekty, které mají .

Rigidbody Pokud však máte komponentu, bude také obsahovat gravitační informaci ve směru -Y, takže pokud ji spustíte, spadne. Nastavte tedy "Gravitační stupnici" na 0 z parametrů.

Mimochodem, pokud se jedná o akční hru s bočním posunem, může být vhodné použít stupnici gravitace v tom smyslu, že se jedná o volný pád dolů.

Podobně přidejte komponentu k druhému Box Collider 2D objektu "UnityTips_2". Toto je tentokrát dotčená strana, takže nemusíte měnit žádná nastavení.

Player Otevřete skript a přidejte každé pole a metodu následujícím způsobem:

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

Protože chceme zobrazit informace o tom, zda byl nebo nebyl zasažen, umožníme jej zobrazit v textovém objektu následujícím způsobem.

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

Proces detekce kolizí je popsán následovně.

/// <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 Každá z výše uvedených událostí nastane, když objekt, který má kolize s jiným objektem Collider 2D , který má . To vám umožní určit a zpracovat, zda je to správné nebo ne.

Existují tři události, z nichž každá je vyvolána v následujícím čase.

OnTriggerEnter2D Když do sebe objekty narazí
OnTriggerStay2D Zatímco objekty do sebe narážejí
OnTriggerExit2D Když objekty opustí kolizní stav

V obou případech soupeřův objekt obdrží soupeřův objekt jako argument, takže můžete získat soupeřův Collider2D objekt vyhledáním Collider2D.gameObject typu zasaženého cíle (nepřítel, Collider2D.tag předmět atd.).

Z OnTriggerEnter2D výše uvedených tří událostí, a OnTriggerExit2D jsou volány jednou za kolizi.

OnTriggerStay2D je volán každý snímek během kolize, ale událost již není volána po uplynutí určité doby od zastavení obou objektů. Je to proto, že se má za to, že vstoupil do stavu spánku, a je považováno za plýtvání zpracováním výpočtu kolizí každého snímku s něčím, co se nehýbe.

Pokud nechcete Rigidbody 2D , aby byl režim spánku, změňte režim spánku parametru na "Nespí".

Po změně kódu nastavte text pro zobrazení informací.

Spusťte hru a pohybujte objektem pomocí klávesnice, abyste se dotkli jiného sprite. Vidíte, že pro každou z nich jsou volány tři funkce.

Mimochodem, pokud se dotknete objektu a pak se přestanete pohybovat, metoda bude volána na OnTriggerStay2D krátkou dobu. Měli byste vidět, že metoda již není volána po OnTriggerStay2D určité době.

To znamená, že jste vstoupili do stavu spánku, ale pokud chcete změnit čas do tohoto spánku, můžete jej změnit výběrem "2D fyziky" v nastavení projektu a zadáním parametru "Doba spánku" v sekundách. Nemůže být nastavena na 0, ale pokud OnTriggerStay2D je nastavena na nekonečně malou, samotná metoda nebude volána.