Ugotovite, ali predmeti trčejo med seboj (2D)

Stran posodobljena :
Datum ustvarjanja strani :

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 2DBox 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.