Bepalen of objecten met elkaar botsen (2D)
Verificatieomgeving
- Ramen
-
- Voor Windows 11
- Unity Editor
-
- 2021.3.3f1
- Input systeem pakket
-
- 1.3.0
Vereisten voor deze tip
De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.
Eerst
In deze tip wordt uitgelegd hoe u kunt bepalen of twee objecten met elkaar in contact zijn. Eén object verplaatsen met het toetsenbord.
Voorbereiding
Nadat u het project hebt gemaakt, bereidt u twee afbeeldingen voor van de sprite die het object zal zijn. Als je lastig te bereiden bent, kun je twee identieke sprites plaatsen, maar deze keer zullen we ze voor de duidelijkheid scheiden. De namen zijn respectievelijk "UnityTips" en "UnityTips_2".
Voeg twee afbeeldingsbestanden toe door ze in de weergave neer te zetten.
Voeg een script toe om het linkerobject met het toetsenbord te verplaatsen. De scriptnaam Player
is .
De scriptinhoud is vergelijkbaar met de tips in Een sprite verplaatsen, roteren en schalen.
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);
}
}
}
Koppel aan het object waarop u het script wilt uitvoeren.
Voer het spel uit en controleer of het werkt met de cursortoetsen op uw toetsenbord.
Plaats ten slotte een tekstobject om de botsingsdetectiestatus weer te geven.
De objectnaam TextState
is .
Instellingen voor botsingsafhandeling
Vanaf hier kunt u de instellingen met betrekking tot botsingen configureren.
Selecteer eerst het object dat u wilt verplaatsen, "UnityTips", en klik op "Component toevoegen" in de inspecteur.
Maak een keuze uit Physics 2D
de lijst. Physics
is een 3D-object, dus vergis je niet.
Physics 2D
Box Collider 2D
Kies uit . Aangezien deze sprite rechthoekig is, is Box geselecteerd, maar als deze bijvoorbeeld cirkelvormig is, selecteert u andere vormen zoals Cirkel.
Box Collider 2D
Aangezien de component wordt toegevoegd, vinkt u "Make it trigger" aan in de parameters.
Hiermee kunt u alleen informatie krijgen over "of u raakt of niet".
Rigidbody 2D
Voeg vervolgens de componenten van . Je kunt het toevoegen vanuit "Physics 2D -> Rigidbody 2D".
Rigidbody
geeft natuurkundige informatieCollider
aan het object en kan ook botsingen bepalen met objecten die .
Rigidbody
Als je echter een component hebt, bevat deze ook zwaartekrachtinformatie in de -Y-richting, dus als je het uitvoert, valt het naar beneden.
Dus stel de "Gravity Scale" in op 0 van de parameters.
Trouwens, als het een side-scrolling actiespel is, kan het handig zijn om de zwaartekrachtschaal te gebruiken in de zin dat het een vrije val naar beneden is.
Voeg op dezelfde manier een component toe aan het Box Collider 2D
andere object "UnityTips_2".
Dit is deze keer de getroffen kant, dus u hoeft geen instellingen te wijzigen.
Player
Open het script en voeg elk veld en elke methode als volgt toe:
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}";
}
}
Omdat we informatie willen weergeven over het al dan niet raken ervan, maken we het mogelijk om het als volgt in een tekstobject weer te geven.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Het botsingsdetectieproces wordt als volgt beschreven.
<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
Elk van de bovenstaande gebeurtenissen treedt op wanneer een object dat is gebotst met een ander object Collider 2D
dat .
Hiermee kunt u bepalen en verwerken of het correct is of niet.
Er zijn drie gebeurtenissen, die elk op het volgende tijdstip worden aangeroepen.
OnTriggerEnter2D | Wanneer objecten elkaar raken |
OnTriggerStay2D | Terwijl objecten elkaar raken |
OnTriggerExit2D | Wanneer objecten de botsingsstatus verlaten |
In beide gevallen ontvangt het object van de tegenstander het object van de tegenstander als argument, zodat je het object van Collider2D
de tegenstander kunt krijgen door het type doel op Collider2D.gameObject
te zoeken dat door wordt geraakt (vijand, item, Collider2D.tag
enz.).
Van de OnTriggerEnter2D
bovenstaande drie gebeurtenissen, en OnTriggerExit2D
worden één keer per botsing genoemd.
OnTriggerStay2D
wordt tijdens de botsing elk frame aangeroepen, maar de gebeurtenis wordt niet meer aangeroepen nadat er een bepaalde tijd is verstreken sinds beide objecten zijn gestopt.
Dit komt omdat het wordt beschouwd als in een slaaptoestand en het wordt beschouwd als een verspilling van verwerking om botsingen elk frame te berekenen met iets dat niet beweegt.
Als u niet wilt dat het slaapt, wijzigt u Rigidbody 2D
de slaapmodus van de parameter in "Niet slapen".
Nadat u de code hebt gewijzigd, stelt u de tekst in voor het weergeven van informatie.
Voer het spel uit en verplaats het object met het toetsenbord om een andere sprite aan te raken. Je kunt zien dat er voor elk drie functies worden aangeroepen.
Trouwens, als u een object aanraakt en vervolgens stopt met bewegen, wordt de methode voor OnTriggerStay2D
een korte tijd aangeroepen.
Je zou moeten kunnen zien dat de methode na OnTriggerStay2D
een bepaalde tijd niet meer wordt aangeroepen.
Dit geeft aan dat u een slaapstand hebt ingevoerd, maar als u de tijd wilt wijzigen totdat u deze slaapstand invoert, kunt u deze wijzigen door "2D-fysica" te selecteren in de projectinstellingen en de parameter "Slaaptijd" in seconden op te geven.
Het kan niet worden ingesteld op 0, maar als het OnTriggerStay2D
is ingesteld op oneindig klein, wordt de methode zelf niet aangeroepen.