Nustatymas, ar objektai susiduria vienas su kitu (2D)
Tikrinimo aplinka
- Windows
-
- Langai 11
- "Unity" redaktorius
-
- 2021.3.3F1
- Įvesties sistemos paketas
-
- 1.3.0
Būtinos šio patarimo sąlygos
Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.
Iš pradžių
Šiame patarime paaiškinama, kaip nustatyti, ar du objektai liečiasi. Perkelkite vieną objektą klaviatūra.
Paruošimas
Sukūrę projektą, paruošite du sprite vaizdus, kurie bus objektas. Jei jums sunku pasiruošti, galite įdėti du identiškus spritus, tačiau šį kartą aiškumo dėlei juos atskirsime. Pavadinimai yra atitinkamai "UnityTips" ir "UnityTips_2".
Pridėkite du vaizdo failus numesdami juos į rodinį.
Pridėkite scenarijų, kad klaviatūra perkeltumėte kairįjį objektą. Scenarijaus pavadinimas Player
yra .
Scenarijaus turinys yra panašus į patarimus, pateiktus "Sprite" perkėlimas, pasukimas ir mastelio keitimas.
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);
}
}
}
Pridėkite prie objekto, kuriame norite paleisti scenarijų.
Paleiskite žaidimą ir patikrinkite, ar jis veikia su klaviatūros žymeklio klavišais.
Galiausiai įdėkite tekstinį objektą, kad būtų rodoma susidūrimo aptikimo būsena.
Objekto pavadinimas TextState
yra .
Susidūrimo valdymo nustatymai
Čia galite konfigūruoti su susidūrimais susijusius nustatymus.
Pirmiausia pasirinkite objektą, kurį norite perkelti, "UnityTips" ir iš inspektoriaus spustelėkite "Pridėti komponentą".
Pasirinkite iš Physics 2D
sąrašo. Physics
yra 3D objektas, todėl nesuklyskite.
Physics 2D
Box Collider 2D
Pasirinkite iš . Kadangi šis sprite yra stačiakampis, pasirenkamas langelis, bet jei jis yra apskritimo formos, pavyzdžiui, pasirinkite kitas figūras, pvz., Apskritimas.
Box Collider 2D
Kadangi komponentas bus pridėtas, iš parametrų pažymėkite "Padaryti jį suaktyvinti".
Tai leis jums gauti informaciją tik apie "ar pataikėte, ar ne".
Rigidbody 2D
Tada pridėkite komponentus . Jį galite pridėti iš "Physics 2D -> Rigidbody 2D".
Rigidbody
suteikia objektui fizikos informacijąCollider
ir taip pat gali nustatyti susidūrimus su objektais, kurie turi .
Rigidbody
Tačiau jei turite komponentą, jame taip pat bus gravitacijos informacijos -Y kryptimi, taigi, jei jį vykdysite, jis nukris žemyn.
Taigi iš parametrų nustatykite "Gravitacijos skalę" į 0.
Beje, jei tai yra šoninio slinkimo veiksmo žaidimas, gali būti patogu naudoti gravitacijos skalę ta prasme, kad ji yra laisvas kritimas žemyn.
Panašiai pridėkite komponentą prie Box Collider 2D
kito objekto "UnityTips_2".
Šį kartą tai yra paveikta pusė, todėl jums nereikia keisti jokių nustatymų.
Player
Atidarykite scenarijų ir pridėkite kiekvieną lauką bei metodą taip:
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}";
}
}
Kadangi norime rodyti informaciją apie tai, ar jis nukentėjo, ar ne, suteiksime galimybę jį rodyti teksto objekte taip.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Susidūrimo aptikimo procesas aprašomas taip:
<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
Kiekvienas iš pirmiau minėtų įvykių įvyksta, kai objektas, susidūręs su kitu objektu Collider 2D
, turinčiu .
Tai leis jums nustatyti ir apdoroti, ar jis teisingas, ar ne.
Yra trys įvykiai, kurių kiekvienas vadinamas tokiu laiku.
OnTriggerEnter2D | Kai objektai atsitrenkia vienas į kitą |
OnTriggerStay2D | Kol objektai atsitrenkia vienas į kitą |
OnTriggerExit2D | Kai objektai palieka susidūrimo būseną |
Abiem atvejais priešininko objektas gauna priešininko objektą kaip argumentą, todėl priešininko Collider2D
objektą galite gauti ieškodami Collider2D.gameObject
taikinio tipo (priešas, Collider2D.tag
daiktas ir kt.).
Iš OnTriggerEnter2D
minėtų trijų įvykių ir OnTriggerExit2D
yra iškviečiami vieną kartą per susidūrimą.
OnTriggerStay2D
susidūrimo metu vadinamas kiekvienas kadras, tačiau įvykis nebevadinamas praėjus tam tikram laikui nuo tada, kai abu objektai sustojo.
Taip yra todėl, kad manoma, kad jis pateko į miego būseną, ir tai laikoma apdorojimo švaistymu, norint apskaičiuoti kiekvieno kadro susidūrimą su kažkuo, kas nejuda.
Rigidbody 2D
Jei nenorite, kad jis miegotų, pakeiskite parametro miego režimą į "Nemiegoti".
Pakeitę kodą, nustatykite informacijos rodymo tekstą.
Paleiskite žaidimą ir perkelkite objektą klaviatūra, kad paliestumėte kitą sprite. Matote, kad kiekvienai iš jų reikalingos trys funkcijos.
Beje, jei paliesite objektą ir nustosite judėti, metodas bus iškviestas OnTriggerStay2D
trumpą laiką.
Turėtumėte matyti, kad po tam tikro laiko metodas nebėra vadinamas OnTriggerStay2D
.
Tai rodo, kad įvedėte miego būseną, bet jei norite pakeisti laiką, kol įvesite šį miegą, galite jį pakeisti projekto nustatymuose pasirinkę "2D fizika" ir sekundėmis nurodydami parametrą "Miego laikas".
Jis negali būti nustatytas į 0, bet jei jis OnTriggerStay2D
yra be galo mažas, pats metodas nebus vadinamas.