Määritä, törmäävätkö esineet toisiinsa (2D)

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2021.3.3F1
Syöttöjärjestelmän paketti
  • 1.3.0

Tämän vinkin edellytykset

Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.

Alun perin

Tässä vihjeessä kerrotaan, miten voit määrittää, ovatko kaksi kohdetta kosketuksissa. Siirrä yhtä objektia näppäimistöllä.

Valmistelu

Kun olet luonut projektin, valmistele kaksi kuvaa sprite-kuvasta, joka on objekti. Jos olet hankala valmistautua, voit sijoittaa kaksi identtistä spritea, mutta tällä kertaa erotamme ne selkeyden vuoksi. Nimet ovat "UnityTips" ja "UnityTips_2".

Lisää kaksi kuvatiedostoa pudottamalla ne näkymään.

Lisää komentosarja siirtääksesi vasenta objektia näppäimistöllä. Komentosarjan nimi Player on . Komentosarjan sisältö on samanlainen kuin hahmon siirtäminen, kiertäminen ja skaalaaminen -kohdan vihjeissä.

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

Liitä objektiin, jolle haluat suorittaa komentosarjan.

Suorita peli ja tarkista, toimiiko se näppäimistön nuolinäppäimillä.

Aseta lopuksi tekstiobjekti näyttämään törmäystunnistuksen tila. Objektin nimi TextState on .

Törmäyskäsittelyn asetukset

Täältä voit määrittää törmäyksiin liittyvät asetukset.

Valitse ensin siirrettävä objekti, "UnityTips" ja napsauta tarkastajasta "Lisää komponentti". Physics 2D Valitse luettelosta. Physics on 3D-objekti, joten älä erehdy.

Physics 2DBox Collider 2D Valitse . Koska tämä hahmo on suorakaiteen muotoinen, Laatikko on valittuna, mutta jos se on esimerkiksi ympyrän muotoinen, valitse muita muotoja, kuten Ympyrä.

Box Collider 2D Koska komponentti lisätään, tarkista parametreista "Tee se laukaisijaksi". Tämän avulla voit saada tietoja vain siitä, "osutko vai et".

Rigidbody 2D Lisää sitten . Voit lisätä sen kohdasta "Physics 2D -> Rigidbody 2D". Rigidbody antaa fysiikan tietoaCollider kappaleelle ja voi myös määrittää törmäykset kohteisiin, joilla on .

Rigidbody Jos sinulla on kuitenkin komponentti, se sisältää myös painovoimatietoja -Y-suunnassa, joten jos suoritat sen, se putoaa alas. Aseta siis "painovoima-asteikko" arvoon 0 parametreista.

Muuten, jos kyseessä on sivuttain vieritettävä toimintapeli, voi olla kätevää käyttää painovoima-asteikkoa siinä mielessä, että se on vapaa pudotus alas.

Samoin lisää komponentti toiseen objektiin Box Collider 2D "UnityTips_2". Tämä on tällä kertaa vaikutuspuoli, joten sinun ei tarvitse muuttaa mitään asetuksia.

Player Avaa komentosarja ja lisää kukin kenttä ja menetelmä seuraavasti:

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

Koska haluamme näyttää tietoja siitä, osuiko se vai ei, mahdollistamme sen näyttämisen tekstiobjektissa seuraavasti.

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

Törmäyksen havaitsemisprosessi kuvataan seuraavasti.

/// <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 Jokainen edellä mainituista tapahtumista tapahtuu, kun objekti, jolla on törmäys, toiseen objektiin Collider 2D , jolla on . Näin voit määrittää ja käsitellä, onko se oikea vai ei.

Tapahtumia on kolme, joista jokainen kutsutaan seuraavalla ajoituksella.

OnTriggerEnter2D Kun esineet osuvat toisiinsa
OnTriggerStay2D Kun esineet osuvat toisiinsa
OnTriggerExit2D Kun esineet poistuvat törmäystilasta

Molemmissa tapauksissa vastustajaobjekti vastaanottaa vastustajan objektin argumenttina, joten voit saada vastustajan objektin Collider2D etsimällä Collider2D.gameObject kohteen tyypin (vihollinen, Collider2D.tag esine jne.).

Edellä mainituista kolmesta tapahtumasta OnTriggerEnter2D , ja OnTriggerExit2D niitä kutsutaan kerran törmäystä kohti.

OnTriggerStay2D kutsutaan jokaisessa kehyksessä törmäyksen aikana, mutta tapahtumaa ei enää kutsuta, kun on kulunut tietty aika siitä, kun molemmat esineet pysähtyivät. Tämä johtuu siitä, että sen katsotaan siirtyneen lepotilaan, ja käsittelyn tuhlauksena pidetään jokaisen kehyksen törmäysten laskemista johonkin, joka ei liiku.

Jos et Rigidbody 2D halua sen nukkuvan, vaihda parametrin lepotilaksi "Älä nuku".

Kun olet vaihtanut koodin, aseta teksti tietojen näyttämistä varten.

Suorita peli ja kosketa toista hahmoa siirtämällä objektia näppäimistöllä. Voit nähdä, että kullekin tarvitaan kolme toimintoa.

Muuten, jos kosketat esinettä ja lopetat liikkumisen, menetelmää kutsutaan lyhyeksi OnTriggerStay2D ajaksi. Sinun pitäisi pystyä näkemään, että menetelmää ei enää kutsuta tietyn ajan kuluttua OnTriggerStay2D .

Tämä osoittaa, että olet siirtynyt lepotilaan, mutta jos haluat muuttaa aikaa, kunnes siirryt tähän uneen, voit muuttaa sitä valitsemalla projektin asetuksista "2D-fysiikka" ja määrittämällä "Uniaika" -parametrin sekunneissa. Sitä ei voi asettaa arvoon 0, mutta jos se OnTriggerStay2D on asetettu äärettömän pieneksi, itse menetelmää ei kutsuta.