Determinar si els objectes xoquen entre si (2D)
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 2D
Box 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à.