Määritä, törmäävätkö esineet toisiinsa (2D)
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 2D
Box 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.