Find ud af, om objekter kolliderer med hinanden (2D)
Miljø til bekræftelse
- Windows
-
- Windows 11
- Enhedslistens redaktør
-
- 2021.3.3f1
- Input System Pakke
-
- 1.3.0
Forudsætninger for dette tip
Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.
Først
Dette tip forklarer, hvordan du finder ud af, om to objekter er i kontakt. Flyt et objekt med tastaturet.
Præparation
Når du har oprettet projektet, skal du forberede to billeder af sprite, der vil være objektet. Hvis du er besværlig at forberede, kan du placere to identiske sprites, men denne gang adskiller vi dem for klarhedens skyld. Navnene er henholdsvis "UnityTips" og "UnityTips_2".
Tilføj to billedfiler ved at slippe dem i visningen.
Tilføj et script for at flytte det venstre objekt med tastaturet. Scriptnavnet Player
er .
Scriptindholdet ligner tippene i Flyt, roter og skaler en 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);
}
}
}
Vedhæft til det objekt, som du vil køre scriptet på.
Kør spillet og kontroller, om det fungerer med piletasterne på dit tastatur.
Til sidst skal du placere et tekstobjekt for at få vist status for kollisionsregistrering.
Objektets navn TextState
er .
Indstillinger for kollisionshåndtering
Herfra kan du konfigurere indstillingerne relateret til kollisioner.
Vælg først det objekt, du vil flytte, "UnityTips", og klik på "Tilføj komponent" fra inspektøren.
Vælg på Physics 2D
listen. Physics
er et 3D-objekt, så tag ikke fejl.
Physics 2D
Box Collider 2D
Vælg mellem . Da denne sprite er rektangulær, vælges Boks, men hvis den f.eks. er cirkelformet, skal du vælge andre figurer, f.eks. Cirkel.
Box Collider 2D
Da komponenten tilføjes, skal du kontrollere "Gør det udløser" fra parametrene.
Dette giver dig mulighed for kun at få oplysninger om "om du rammer eller ej".
Rigidbody 2D
Tilføj derefter komponenterne i . Du kan tilføje det fra "Fysik 2D -> Rigidbody 2D".
Rigidbody
giver fysikinformationCollider
til objektet og kan også bestemme kollisioner med objekter, der har .
Rigidbody
Men hvis du har en komponent, vil den også indeholde tyngdekraftsinformation i -Y-retningen, så hvis du udfører den, falder den ned.
Så indstil "Gravity Scale" til 0 fra parametrene.
Forresten, hvis det er et siderullende actionspil, kan det være praktisk at bruge tyngdekraftsskalaen i den forstand, at den er frit fald ned.
På samme måde skal du tilføje en komponent til det Box Collider 2D
andet objekt "UnityTips_2".
Dette er den berørte side denne gang, så du behøver ikke ændre nogen indstillinger.
Player
Åbn scriptet, og tilføj hvert felt og metode ved hjælp af følgende:
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}";
}
}
Da vi ønsker at vise oplysninger om, hvorvidt det blev ramt eller ej, vil vi gøre det muligt at vise det i et tekstobjekt som følger.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Kollisionsdetekteringsprocessen beskrives som følger.
<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
Hver af ovenstående begivenheder opstår, når et objekt, der har, kolliderer med et andet objekt Collider 2D
, der har .
Dette giver dig mulighed for at bestemme og behandle, om det er korrekt eller ej.
Der er tre begivenheder, som hver kaldes på følgende tidspunkt.
OnTriggerEnter2D | Når objekter rammer hinanden |
OnTriggerStay2D | Mens objekter rammer hinanden |
OnTriggerExit2D | Når objekter forlader kollisionstilstanden |
I begge tilfælde modtager modstanderobjektet modstanderens objekt som et argument, så du kan få modstanderens Collider2D
objekt ved at slå den type mål opCollider2D.gameObject
, der rammes af (fjende, Collider2D.tag
genstand osv.).
Af de OnTriggerEnter2D
ovennævnte tre begivenheder, og OnTriggerExit2D
kaldes en gang pr. Kollision.
OnTriggerStay2D
kaldes hver ramme under kollisionen, men begivenheden kaldes ikke længere, når der er gået en vis tid, siden begge objekter stoppede.
Dette skyldes, at det anses for at være gået i dvaletilstand, og det betragtes som spild af forarbejdning at beregne kollisioner hver ramme med noget, der ikke bevæger sig.
Hvis du ikke vil have den til at sove, skal du Rigidbody 2D
ændre parameterens dvaletilstand til "Sov ikke".
Når du har ændret koden, skal du indstille teksten til visning af information.
Kør spillet og flyt objektet med tastaturet for at røre ved en anden sprite. Du kan se, at der kræves tre funktioner for hver.
Forresten, hvis du rører ved et objekt og derefter holder op med at bevæge dig, vil metoden blive kaldt i OnTriggerStay2D
kort tid.
Du skal kunne se, at metoden ikke længere kaldes efter OnTriggerStay2D
en vis tid.
Dette indikerer, at du har indtastet en dvaletilstand, men hvis du vil ændre tiden, indtil du indtaster denne søvn, kan du ændre den ved at vælge "2D Physics" fra projektindstillingerne og angive parameteren "Sleep time" i sekunder.
Det kan ikke indstilles til 0, men hvis det OnTriggerStay2D
er indstillet til uendeligt lille, vil selve metoden ikke blive kaldt.