Určení, zda objekty kolidují (2D)
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 2D
Box 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.