Určenie zrážky objektov (2D)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2021.3.3f1
Vstupný systémový balík
  • 1.3.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

Najskôr

Tento tip vysvetľuje, ako zistiť, či sú dva objekty v kontakte. Presun o jeden objekt pomocou klávesnice.

Príprava

Po vytvorení projektu pripravte dva obrázky spritu, ktorý bude objektom. Ak máte problémy s prípravou, môžete umiestniť dva rovnaké sprity, ale tentoraz ich kvôli prehľadnosti oddelíme. Názvy sú "UnityTips" a "UnityTips_2".

Pridajte dva súbory s obrázkami tak, že ich vložíte do zobrazenia.

Pridajte skript na presun ľavého objektu pomocou klávesnice. Názov Player skriptu je . Obsah skriptu je podobný tipom v témach Presúvanie, otáčanie a mierka zloženého písma.

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žte k objektu, na ktorom chcete spustiť skript.

Spustite hru a skontrolujte, či funguje s kurzorovými klávesmi na klávesnici.

Nakoniec umiestnite textový objekt, aby sa zobrazil stav detekcie kolízie. Názov TextState objektu je .

Nastavenia riešenia kolízií

Odtiaľto môžete nakonfigurovať nastavenia týkajúce sa kolízií.

Najprv vyberte objekt, ktorý chcete presunúť, "UnityTips" a kliknite na "Pridať komponent" od inšpektora. Vyberte zo Physics 2D zoznamu. Physics je 3D objekt, takže sa nenechajte pomýliť.

Physics 2DBox Collider 2D Vyberte si z . Keďže tento sprit je obdĺžnikový, vyberie sa položka Box, ale ak má napríklad tvar kruhu, vyberte iné tvary, napríklad Kruh.

Box Collider 2D Pretože komponent bude pridaný, začiarknite v parametroch "Make it trigger". To vám umožní získať informácie len o tom, "či ste zasiahli alebo nie".

Rigidbody 2D Potom pridajte komponenty súboru . Môžete ho pridať z "Fyzika 2D -> Rigidbody 2D". Rigidbody poskytuje objektu fyzikálne informácieCollider a môže tiež určiť kolízie s objektmi, ktoré majú .

Rigidbody Ak však máte komponent, bude obsahovať aj informácie o gravitácii v smere -Y, takže ak ho vykonáte, spadne. Nastavte teda "Gravitačnú stupnicu" na 0 z parametrov.

Mimochodom, ak ide o akčnú hru s bočným posúvaním, môže byť vhodné použiť gravitačnú stupnicu v tom zmysle, že je to voľný pád nadol.

Podobne pridajte komponent k inému objektu Box Collider 2D "UnityTips_2". Toto je tentoraz postihnutá strana, takže nemusíte meniť žiadne nastavenia.

Player Otvorte skript a pridajte každé pole a metódu nasledujúcim spôsobom:

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}";
  }
}

Keďže chceme zobraziť informácie o tom, či bol alebo nebol zasiahnutý, umožníme ho zobraziť v textovom objekte nasledovne.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

Proces detekcie kolízie je opísaný nasledovne.

/// <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 Každá z vyššie uvedených udalostí nastane, keď sa objekt, ktorý sa zrazí s iným objektom Collider 2D , ktorý má . To vám umožní určiť a spracovať, či je to správne alebo nie.

Existujú tri udalosti, z ktorých každá sa nazýva v nasledujúcom čase.

OnTriggerEnter2D Keď do seba objekty narazia
OnTriggerStay2D Zatiaľ čo objekty do seba narážajú
OnTriggerExit2D Keď objekty opustia kolízny stav

V oboch prípadoch objekt súpera dostane objekt súpera ako argument, takže objekt súpera Collider2D môžete získať vyhľadaním Collider2D.gameObject typu zasiahnutého cieľa (nepriateľ, Collider2D.tag predmet atď.).

Z OnTriggerEnter2D vyššie uvedených troch udalostí a OnTriggerExit2D nazývajú sa raz za kolíziu.

OnTriggerStay2D sa nazýva každý rám počas kolízie, ale udalosť sa už nevolá po uplynutí určitého času, pretože oba objekty sa zastavili. Je to preto, že sa považuje za vstup do stavu spánku a výpočet kolízií každého rámu s niečím, čo sa nepohybuje, sa považuje za plytvanie spracovaním.

Ak nechcete, aby spal, zmeňte Rigidbody 2D režim spánku parametra na "Nespať".

Po zmene kódu nastavte text na zobrazovanie informácií.

Spustite hru a presuňte objekt pomocou klávesnice, aby ste sa dotkli iného sprite. Môžete vidieť, že pre každú z nich sú potrebné tri funkcie.

Mimochodom, ak sa dotknete objektu a potom sa prestanete pohybovať, metóda sa na krátky čas vyvolá OnTriggerStay2D . Mali by ste byť schopní vidieť, že metóda sa po určitom čase už nenazýva OnTriggerStay2D .

Znamená to, že ste vstúpili do stavu spánku, ale ak chcete zmeniť čas, kým nevstúpite do tohto spánku, môžete ho zmeniť výberom položky "2D fyzika" z nastavení projektu a zadaním parametra "Čas spánku" v sekundách. Nedá sa nastaviť na 0, ale ak OnTriggerStay2D je nastavená na nekonečne malú, samotná metóda sa nebude volať.