Objektide üksteisega kokkupõrke kindlakstegemine (2D)
Kontrollimise keskkond
- Windows
-
- Windows 11
- Ühtsuse toimetaja
-
- 2021.3.3f1
- Sisendsüsteemi pakett
-
- 1.3.0
Selle näpunäite eeltingimused
Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.
Alguses
See näpunäide selgitab, kuidas teha kindlaks, kas kaks objekti on kontaktis. Ühe objekti teisaldamine klaviatuuri abil
Ettevalmistus
Pärast projekti loomist valmistage ette kaks pilti spraidist, mis on objekt. Kui teil on tülikas valmistada, võite paigutada kaks identset spraiti, kuid seekord eraldame need selguse huvides. Nimed on vastavalt "UnityTips" ja "UnityTips_2".
Lisage kaks pildifaili, kukutades need vaatesse.
Lisage skript, et liigutada vasakut objekti klaviatuuriga. Skripti nimi Player
on .
Skripti sisu on sarnane spraidi teisaldamise, pööramise ja skaleerimise näpunäidetega.
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);
}
}
}
Manustage objektile, millel soovite skripti käivitada.
Käivitage mäng ja kontrollige, kas see töötab klaviatuuri kursoriklahvidega.
Lõpuks asetage kokkupõrke tuvastamise oleku kuvamiseks tekstiobjekt.
Objekti nimi TextState
on .
Kokkupõrke käsitsemise seaded
Siit saate konfigureerida kokkupõrgetega seotud seadeid.
Esiteks valige objekt, mida soovite liigutada, "UnityTips" ja klõpsake inspektorilt "Lisa komponent".
Valige loendist Physics 2D
. Physics
on 3D-objekt, nii et ärge tehke viga.
Physics 2D
Box Collider 2D
Valige . Kuna see sprait on ristkülikukujuline, on ruut valitud, kuid kui see on näiteks ringikujuline, valige muud kujundid, näiteks Ring.
Box Collider 2D
Kuna komponent lisatakse, kontrollige parameetritest "Tee see päästikuks".
See võimaldab teil saada teavet ainult selle kohta, kas sa tabasid või mitte.
Rigidbody 2D
Seejärel lisage komponendid . Saate selle lisada jaotisest "Physics 2D -> Rigidbody 2D".
Rigidbody
annab objektile füüsikateavetCollider
ja võib määrata ka kokkupõrkeid objektidega, millel on .
Rigidbody
Kui teil on aga komponent, sisaldab see ka gravitatsiooniteavet Y-suunas, nii et kui te seda täidate, langeb see alla.
Nii et seadke parameetritest "Gravitatsiooni skaala" väärtusele 0.
Muide, kui see on külglibisev põnevusmäng, võib olla mugav kasutada gravitatsiooniskaalat selles mõttes, et see on vaba kukkumine.
Samamoodi lisage komponent teisele objektile Box Collider 2D
"UnityTips_2".
See on seekord mõjutatud pool, nii et te ei pea seadeid muutma.
Player
Avage skript ja lisage iga väli ja meetod, kasutades järgmist:
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}";
}
}
Kuna tahame kuvada teavet selle kohta, kas see tabas või mitte, võimaldame seda tekstiobjektis kuvada järgmiselt.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Kokkupõrke tuvastamise protsessi kirjeldatakse järgmiselt.
<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
Kõik ülaltoodud sündmused toimuvad siis, kui objekt, mis on kokku põrganud teise objektiga Collider 2D
, millel on .
See võimaldab teil kindlaks teha ja töödelda, kas see on õige või mitte.
On kolm sündmust, millest igaüks kutsutakse järgmisel ajal.
OnTriggerEnter2D | Kui objektid üksteist tabavad |
OnTriggerStay2D | Samal ajal kui objektid üksteist löövad |
OnTriggerExit2D | Kui objektid lahkuvad kokkupõrke olekust |
Mõlemal juhul saab vastase objekt argumendina vastase objekti, nii et saate vastase objekti, Collider2D
otsides üles Collider2D.gameObject
tabatud sihtmärgi tüübi (vaenlane, Collider2D.tag
ese jne).
Ülaltoodud kolmest sündmusest OnTriggerEnter2D
ja OnTriggerExit2D
neid nimetatakse üks kord kokkupõrke kohta.
OnTriggerStay2D
nimetatakse kokkupõrke ajal igaks kaadriks, kuid sündmust ei kutsuta enam pärast teatud aja möödumist mõlema objekti peatumisest.
Seda seetõttu, et seda peetakse uneseisundisse sisenenuks ja seda peetakse töötlemise raiskamiseks, et arvutada iga kaadri kokkupõrked millegagi, mis ei liigu.
Kui te Rigidbody 2D
ei soovi, et see magaks, muutke parameetri unerežiim "Ära maga".
Pärast koodi muutmist määrake teabe kuvamiseks tekst.
Käivitage mäng ja liigutage objekti klaviatuuriga, et puudutada teist spraiti. Näete, et igaühe jaoks on vaja kolme funktsiooni.
Muide, kui puudutate objekti ja seejärel lõpetate liikumise, kutsutakse meetod lühikeseks OnTriggerStay2D
ajaks.
Teil peaks olema võimalik näha, et meetodit teatud aja pärast OnTriggerStay2D
enam ei kutsuta.
See näitab, et olete sisenenud uneolekusse, kuid kui soovite muuta aega, kuni sisestate selle une, saate seda muuta, valides projekti seadetest "2D füüsika" ja määrates parameetri "Uneaeg" sekundites.
Seda ei saa seada väärtusele 0, kuid kui see OnTriggerStay2D
on seatud lõpmata väikeseks, siis meetodit ise ei kutsuta.