Určenie zrážky objektov (2D)
Prostredie overovania
- Windows
-
- Windows 11
- Editor jednoty
-
- 2021.3.3f1
- Vstupný systémový balík
-
- 1.3.0
Predpoklady pre tento tip
Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.
Najskôr
Tento tip vysvetľuje, ako zistiť, či sú dva objekty v kontakte. Presun o jeden objekt pomocou klávesnice.
Príprava
Po vytvorení projektu pripravte dva obrázky spritu, ktorý bude objektom. Ak máte problémy s prípravou, môžete umiestniť dva rovnaké sprity, ale tentoraz ich kvôli prehľadnosti oddelíme. Názvy sú "UnityTips" a "UnityTips_2".
Pridajte dva súbory s obrázkami tak, že ich vložíte do zobrazenia.
Pridajte skript na presun ľavého objektu pomocou klávesnice. Názov Player
skriptu je .
Obsah skriptu je podobný tipom v témach Presúvanie, otáčanie a mierka zloženého písma.
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);
}
}
}
Priložte k objektu, na ktorom chcete spustiť skript.
Spustite hru a skontrolujte, či funguje s kurzorovými klávesmi na klávesnici.
Nakoniec umiestnite textový objekt, aby sa zobrazil stav detekcie kolízie.
Názov TextState
objektu je .
Nastavenia riešenia kolízií
Odtiaľto môžete nakonfigurovať nastavenia týkajúce sa kolízií.
Najprv vyberte objekt, ktorý chcete presunúť, "UnityTips" a kliknite na "Pridať komponent" od inšpektora.
Vyberte zo Physics 2D
zoznamu. Physics
je 3D objekt, takže sa nenechajte pomýliť.
Physics 2D
Box Collider 2D
Vyberte si z . Keďže tento sprit je obdĺžnikový, vyberie sa položka Box, ale ak má napríklad tvar kruhu, vyberte iné tvary, napríklad Kruh.
Box Collider 2D
Pretože komponent bude pridaný, začiarknite v parametroch "Make it trigger".
To vám umožní získať informácie len o tom, "či ste zasiahli alebo nie".
Rigidbody 2D
Potom pridajte komponenty súboru . Môžete ho pridať z "Fyzika 2D -> Rigidbody 2D".
Rigidbody
poskytuje objektu fyzikálne informácieCollider
a môže tiež určiť kolízie s objektmi, ktoré majú .
Rigidbody
Ak však máte komponent, bude obsahovať aj informácie o gravitácii v smere -Y, takže ak ho vykonáte, spadne.
Nastavte teda "Gravitačnú stupnicu" na 0 z parametrov.
Mimochodom, ak ide o akčnú hru s bočným posúvaním, môže byť vhodné použiť gravitačnú stupnicu v tom zmysle, že je to voľný pád nadol.
Podobne pridajte komponent k inému objektu Box Collider 2D
"UnityTips_2".
Toto je tentoraz postihnutá strana, takže nemusíte meniť žiadne nastavenia.
Player
Otvorte skript a pridajte každé pole a metódu nasledujúcim spôsobom:
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}";
}
}
Keďže chceme zobraziť informácie o tom, či bol alebo nebol zasiahnutý, umožníme ho zobraziť v textovom objekte nasledovne.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Proces detekcie kolízie je opísaný nasledovne.
<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 vyššie uvedených udalostí nastane, keď sa objekt, ktorý sa zrazí s iným objektom Collider 2D
, ktorý má .
To vám umožní určiť a spracovať, či je to správne alebo nie.
Existujú tri udalosti, z ktorých každá sa nazýva v nasledujúcom čase.
OnTriggerEnter2D | Keď do seba objekty narazia |
OnTriggerStay2D | Zatiaľ čo objekty do seba narážajú |
OnTriggerExit2D | Keď objekty opustia kolízny stav |
V oboch prípadoch objekt súpera dostane objekt súpera ako argument, takže objekt súpera Collider2D
môžete získať vyhľadaním Collider2D.gameObject
typu zasiahnutého cieľa (nepriateľ, Collider2D.tag
predmet atď.).
Z OnTriggerEnter2D
vyššie uvedených troch udalostí a OnTriggerExit2D
nazývajú sa raz za kolíziu.
OnTriggerStay2D
sa nazýva každý rám počas kolízie, ale udalosť sa už nevolá po uplynutí určitého času, pretože oba objekty sa zastavili.
Je to preto, že sa považuje za vstup do stavu spánku a výpočet kolízií každého rámu s niečím, čo sa nepohybuje, sa považuje za plytvanie spracovaním.
Ak nechcete, aby spal, zmeňte Rigidbody 2D
režim spánku parametra na "Nespať".
Po zmene kódu nastavte text na zobrazovanie informácií.
Spustite hru a presuňte objekt pomocou klávesnice, aby ste sa dotkli iného sprite. Môžete vidieť, že pre každú z nich sú potrebné tri funkcie.
Mimochodom, ak sa dotknete objektu a potom sa prestanete pohybovať, metóda sa na krátky čas vyvolá OnTriggerStay2D
.
Mali by ste byť schopní vidieť, že metóda sa po určitom čase už nenazýva OnTriggerStay2D
.
Znamená to, že ste vstúpili do stavu spánku, ale ak chcete zmeniť čas, kým nevstúpite do tohto spánku, môžete ho zmeniť výberom položky "2D fyzika" z nastavení projektu a zadaním parametra "Čas spánku" v sekundách.
Nedá sa nastaviť na 0, ale ak OnTriggerStay2D
je nastavená na nekonečne malú, samotná metóda sa nebude volať.