Ugotovite, ali predmeti trčejo med seboj (2D)
Okolje za preverjanje
- Windows
-
- Windows 11
- Urejevalnik enotnosti
-
- 2021.3.3f1
- Paket vhodnega sistema
-
- 1.3.0
Predpogoji za to konico
Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.
Sprva
Ta namig pojasnjuje, kako ugotoviti, ali sta dva predmeta v stiku. Premaknite en predmet s tipkovnico.
Pripravka
Po izdelavi projekta pripravite dve sliki sprita, ki bosta predmet. Če vas je težko pripraviti, lahko postavite dva enaka sprita, tokrat pa jih bomo ločili zaradi jasnosti. Imena so »UnityTips« oziroma »UnityTips_2«.
Dodajte dve slikovni datoteki tako, da jih spustite v pogled.
Dodajte skript, da premaknete levi predmet s tipkovnico. Ime skripta je Player
.
Vsebina skripta je podobna nasvetom v programu Premakni, zasukaj in razmahni 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);
}
}
}
Priložite k predmetu, na katerem želite zagnati skript.
Zaženite igro in preverite, ali deluje s tipkami kazalca na tipkovnici.
Končno postavite besedilni predmet, da prikažete stanje zaznavanja trkov.
Ime predmeta je TextState
.
Nastavitve za ravnanje s trčenjem
Od tod lahko konfigurirate nastavitve, povezane s trke.
Najprej izberite predmet, ki ga želite premakniti, »UnityTips« in od inšpektorja kliknite »Dodaj komponento«.
Izberite s Physics 2D
seznama. Physics
je 3D predmet, zato ne naredite napake.
Physics 2D
Box Collider 2D
Izberite iz . Ker je ta sprite pravokolen, je box izbran, če pa je kroga oblike, na primer izberite druge oblike, kot je Krog.
Box Collider 2D
Ker bo komponenta dodana, preverite "Naj sproži" iz parametrov.
To vam bo omogočilo, da boste dobili informacije samo o "ali ste zadeli ali ne".
Rigidbody 2D
Nato dodajte komponente programa . Lahko ga dodate iz "Fizika 2D -> Rigidbody 2D".
Rigidbody
daje fizikiCollider
informacije predmetu in lahko določi tudi trke s predmeti, ki imajo .
Rigidbody
Če pa imate komponento, bo vsebovala tudi podatke o gravitaciji v smeri -Y, tako da če jo boste izvršili, bo padla navzdol.
Torej nastavite "Gravitacijsko lestvico" na 0 iz parametrov.
Mimogrede, če gre za stransko pomikanje akcijske igre, je morda priročno uporabiti gravitacijsko lestvico v smislu, da je prost padec navzdol.
Podobno dodajte komponento Box Collider 2D
drugemu predmetu "UnityTips_2".
To je tokrat prizadeta stran, zato vam ni treba spreminjati nastavitev.
Player
Odprite skript in dodajte vsako polje in metodo na naslednji način:
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}";
}
}
Ker želimo prikazati informacije o tem, ali je bil zadet ali ne, jih bomo omogočili, da jih prikažemo v besedilnem objektu na naslednji način.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Postopek zaznavanja trkov je opisan na naslednji način.
<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
Vsak od zgoraj navedenih dogodkov se zgodi, ko predmet, ki je trk z drugim predmetom Collider 2D
, ki ima .
To vam bo omogočilo, da določite in obdelate, ali je pravilno ali ne.
Obstajajo trije dogodki, od katerih se vsak imenuje ob naslednjem času.
OnTriggerEnter2D | Ko se predmeti med seboj zadenejo |
OnTriggerStay2D | Medtem ko se predmeti udarjajo med seboj |
OnTriggerExit2D | Ko predmeti zapustijo stanje trka |
V obeh primerih nasprotnikov predmet prejme nasprotnikov predmet kot argument, Collider2D
Collider2D.gameObject
tako da lahko dobiš nasprotnikov predmet tako, da iščeš vrsto tarče, ki jo zadene (sovražnik, Collider2D.tag
element itd.).
Od zgoraj navedenih OnTriggerEnter2D
treh dogodkov, OnTriggerExit2D
in se imenujejo enkrat na trk.
OnTriggerStay2D
se imenuje vsak okvir med trčenjem, vendar dogodek ni več poklican, potem ko je minilo določeno obdobje, odkar sta se oba predmeta ustavila.
To je zato, ker se šteje, da je vstopil v stanje spanja, in se šteje za odpadke predelave za izračun trkov vsak okvir z nečim, kar se ne premika.
Če ne želite Rigidbody 2D
spati, spremenite način spanja parametra v »Ne spi«.
Ko spremenite kodo, nastavite besedilo za prikaz informacij.
Zaženite igro in premaknite predmet s tipkovnico, da se dotaknete drugega šprica. Vidite lahko, da so za vsako poklicane tri funkcije.
Mimogrede, če se dotaknete predmeta in se nato prenehate premikati, OnTriggerStay2D
bo metoda poklicana za kratek čas.
Videti morate, da OnTriggerStay2D
metoda ni več poklicana po določenem času.
To pomeni, da ste vnesli stanje spanja, vendar če želite spremeniti čas, dokler ne vnesete tega spanja, ga lahko spremenite tako, da izberete »2D Physics« iz nastavitev projekta in določite parameter »Čas mirovanja« v nekaj sekundah.
Ni ga mogoče nastaviti na 0, OnTriggerStay2D
če pa je nastavljena na neskončno majhno, sama metoda ne bo imenovana.