Maneig de col·lisions amb física estàndard (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 col·loca dos objectes de manera que pugueu implementar el comportament de manipular un objecte i utilitzar la física estàndard d'Unity per empènyer l'altre quan entra en contacte amb l'altre.

Per cert, la majoria dels paràmetres són els mateixos que el procediment descrit a l'article anterior "Determinar si els objectes xoquen entre si (2D)".

Preparació

El procediment aquí és gairebé el mateix que els consells anteriors , així que anem a fluir sense problemes.

Després de crear el projecte, prepareu dues imatges de personatges que seran objectes i afegiu-les. 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 .

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    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.

L'última vegada, volia obtenir informació només sobre si l'he encertat o no, així que vaig marcar "Fes que sigui disparador", però aquesta vegada no ho faré. Això permet el maneig de col·lisions en física.

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 .

Establiu l'escala de gravetat a 0 per evitar la caiguda lliure per sota.

De la mateixa manera, afegiu un component a l'altre objecte "UnityTips_2" per marcar Box Collider 2D els cops.

A més, aquesta vegada cal moure's amb la força de l'adversari,Rigidbody 2D així que suma . L'escala de gravetat ha de ser 0.

Això és tot el que hi ha. No es requereix cap programa en aquest moment. Executeu el joc i intenteu tocar un altre objecte.

Crec que es pot confirmar que si empenyeu l'adversari així, l'adversari es comportarà com si l'empenyessin. És molt fàcil utilitzar la física de la funció estàndard perquè no es requereix cap programa.

Impedir que els objectes girin

Podeu veure quan el toqueu, però si el punt de cop canvia encara lleugerament, cada objecte girarà. Com a joc, sovint es torna antinatural, per la qual cosa cal configurar-lo de manera que no giri.

Rigidbody 2D El component té un element anomenat "Rotació fixa" a "Restriccions", així que comproveu Z. Ara podeu treballar perquè no giri. Proveu de configurar-lo a dos objectes i executeu el joc per comprovar-ho.

Crec que pots estar segur que no gira sense importar des de quin angle l'empenyis.

Fer alguna cosa quan els objectes es colpegin entre si

Per exemple, és possible que vulgueu implementar una bala que impacti contra un enemic mentre empenyeu l'oponent mentre reduïu la salut de l'enemic. Això és el mateix que els consells anteriors , ja que es produirà l'esdeveniment, de manera que podeu afrontar-lo.

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 OnCollisionEnter2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnCollisionStay2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnCollisionExit2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionExit2D : {partner.collider.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 OnCollisionEnter2D(Collision2D partner)
{
  TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
  TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
  TextState.text = $"OnCollisionExit2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Similar als consells anteriors------, però el nom del mètode ara és "OnCollision------2D" en lloc de "OnTrigger2D".

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.

OnCollisionEnter2D Quan els objectes es colpegen entre si
OnCollisionStay2D Mentre els objectes es colpegen entre si
OnCollisionExit2D 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 Collision2D colpejat per (enemic, element, Collider2D.collider.tag etc.).

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

OnCollisionStay2D 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 OnCollisionStay2D poc temps. Hauríeu de poder veure que el mètode ja no es crida després OnCollisionStay2D 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 OnCollisionStay2D a infinitament petit, el mètode en si no es cridarà.