Determinar si els objectes xoquen entre si (2D)

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 2021.3.3f1
Paquet del sistema d'entrada
  • 1.3.0

Requisits previs per a aquest consell

La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.

Al principi

Aquest consell explica com determinar si dos objectes estan en contacte. Mou un objecte amb el teclat.

Preparació

Després de crear el projecte, prepareu dues imatges del personatge que serà l'objecte. Si teniu problemes per preparar-vos, podeu col·locar dos personatges idèntics, però aquesta vegada els separarem per obtenir més claredat. Els noms són "UnityTips" i "UnityTips_2" respectivament.

Afegiu dos fitxers d'imatge deixant-los anar a la vista.

Afegeix un script per moure l'objecte esquerre amb el teclat. El nom Player del guió és . El contingut de l'script és similar als consells de Moure, girar i escalar un personatge.

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

Adjunteu-lo a l'objecte sobre el qual voleu executar l'script.

Executeu el joc i comproveu si funciona amb les tecles del cursor del teclat.

Finalment, col·loqueu un objecte de text per mostrar l'estat de detecció de col·lisions. El nom de l'objecte TextState és .

Configuració de la gestió de col·lisions

Des d'aquí, podeu configurar els paràmetres relacionats amb les col·lisions.

Primer, seleccioneu l'objecte que voleu moure, "UnityTips", i feu clic a "Afegeix component" de l'inspector. Seleccioneu de Physics 2D la llista. Physics és un objecte 3D, així que no us enganyeu.

Physics 2DBox Collider 2D Seleccioneu entre . Com que aquest personatge és rectangular, se selecciona Box, però si té forma de cercle, per exemple, seleccioneu altres formes, com ara Cercle.

Box Collider 2D Com que s'afegirà el component, marqueu "Make it trigger" dels paràmetres. Això us permetrà obtenir informació només sobre "si heu encertat o no".

Rigidbody 2D A continuació, afegiu els components de . Pots afegir-lo des de "Física 2D -> Rigidbody 2D". Rigidbody dóna informacióCollider física a l'objecte i també pot determinar col·lisions amb objectes que tenen .

Rigidbody Tanmateix, si teniu un component, també contindrà informació de gravetat en la direcció -Y, de manera que si l'executeu, caurà. Per tant, establiu l'"escala de gravetat" a 0 dels paràmetres.

Per cert, si es tracta d'un joc d'acció de desplaçament lateral, pot ser convenient utilitzar l'escala de gravetat en el sentit que és caiguda lliure.

De la mateixa manera, afegiu un component a l'altre Box Collider 2D objecte "UnityTips_2". Aquesta vegada és el costat afectat, de manera que no cal que canvieu cap configuració.

Player Obriu l'script i afegiu cada camp i mètode mitjançant el següent:

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

Com que volem mostrar informació sobre si ha estat colpejat o no, farem possible mostrar-la en un objecte de text de la següent manera.

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

El procés de detecció de col·lisions es descriu de la següent manera.

/// <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 Cadascun dels esdeveniments anteriors es produeix quan un objecte que ha xocat amb un altre objecte Collider 2D que té . Això et permetrà determinar i processar si és correcte o no.

Hi ha tres esdeveniments, cadascun dels quals s'anomena en el següent moment.

OnTriggerEnter2D Quan els objectes es colpegen entre si
OnTriggerStay2D Mentre els objectes es colpegen entre si
OnTriggerExit2D Quan els objectes surten de l'estat de col·lisió

En ambdós casos, l'objecte adversari rep l'objecte de l'oponent com a argument, de manera que podeu obtenir l'objecte de l'oponent buscant el Collider2D.gameObject tipus d'objectiu Collider2D colpejat per (enemic, element, Collider2D.tag etc.).

Dels OnTriggerEnter2D tres esdeveniments anteriors, i OnTriggerExit2D es convoquen una vegada per col·lisió.

OnTriggerStay2D s'anomena cada fotograma durant la col·lisió, però l'esdeveniment ja no es crida després d'haver passat un cert temps des que els dos objectes es van aturar. Això es deu al fet que es considera que ha entrat en un estat de son, i es considera un malbaratament de processament calcular col·lisions cada fotograma amb alguna cosa que no està en moviment.

Si no voleu Rigidbody 2D que dormi, canvieu el mode de repòs del paràmetre a "No dormir".

Després de canviar el codi, configureu el text per mostrar informació.

Executeu el joc i moveu l'objecte amb el teclat per tocar un altre personatge. Podeu veure que s'anomenen tres funcions per a cadascuna.

Per cert, si toqueu un objecte i després deixeu de moure's, el mètode es demanarà durant OnTriggerStay2D poc temps. Hauríeu de poder veure que el mètode ja no es crida després OnTriggerStay2D d'un cert temps.

Això indica que heu introduït un estat de repòs, però si voleu canviar el temps fins que entreu en aquest son, podeu canviar-lo seleccionant "Física 2D" a la configuració del projecte i especificant el paràmetre "Temps de son" en segons. No es pot establir a 0, però si s'estableix OnTriggerStay2D a infinitament petit, el mètode en si no es cridarà.