Törmäyskäsittely standardifysiikalla (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ämä vinkki sijoittaa kaksi esinettä, jotta voit toteuttaa käyttäytymisen manipuloimalla yhtä esinettä ja käyttämällä Unityn standardifysiikkaa työntämään toista, kun se joutuu kosketuksiin toisen kanssa.
Muuten, suurin osa asetuksista on sama kuin edellisessä artikkelissa "Sen määrittäminen, törmäävätkö esineet toisiinsa (2D)".
Valmistelu
Tässä menettely on melkein sama kuin edelliset vinkit , joten sujutetaan se sujuvasti.
Kun olet luonut projektin, valmistele kaksi sprite-kuvaa, jotka ovat objekteja, ja lisää ne. 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 .
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);
}
}
}
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ä.
Viime kerralla halusin saada tietoa vain siitä, osunko siihen vai en, joten tarkistin "Make it trigger", mutta tällä kertaa en. Tämä mahdollistaa törmäyskäsittelyn fysiikassa.
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 .
Aseta painovoima-asteikko arvoon 0 estääksesi vapaan pudotuksen alapuolelle.
Samoin lisää komponentti toiseen objektiin "UnityTips_2" osumien merkitsemiseksi Box Collider 2D
.
Lisäksi tällä kertaa on tarpeen liikkua vastustajan voimalla,Rigidbody 2D
joten lisää . Painovoima-asteikon tulisi olla 0.
Siinä kaikki. Mitään ohjelmaa ei tarvita tällä hetkellä. Suorita peli ja yritä koskettaa toista kohdetta.
Mielestäni voit vahvistaa, että jos työnnät vastustajan sisään tällä tavalla, vastustaja käyttäytyy ikään kuin häntä työnnetään. Vakiofunktion fysiikkaa on erittäin helppo käyttää, koska ohjelmaa ei tarvita.
Objektien pyörimisen estäminen
Voit nähdä, kun kosketat sitä, mutta jos osumapiste siirtyy edes hieman, jokainen esine pyörii. Pelinä siitä tulee usein luonnotonta, joten sinun on asetettava se niin, että se ei pyöri.
Rigidbody 2D
Komponentilla on kohde nimeltä "Kiinteä kierto" kohdassa "Rajoitukset", joten tarkista Z.
Nyt voit työskennellä niin, että se ei pyöri. Yritä asettaa se kahteen objektiin ja tarkistaa se suorittamalla peli.
Mielestäni voit olla varma, että se ei pyöri riippumatta siitä, mistä kulmasta painat sitä.
Tee jotain, kun esineet osuvat toisiinsa
Voit esimerkiksi haluta toteuttaa luodin, joka osuu viholliseen työntäen vastustajaa heikentäen samalla vihollisen terveyttä. Tämä on sama kuin edelliset vinkit , koska tapahtuma tapahtuu, joten voit käsitellä sitä.
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 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}";
}
}
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 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}";
}
Samanlainen kuin edelliset vinkit------, mutta menetelmän nimi on nyt "OnCollision------2D" eikä "OnTrigger2D".
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.
OnCollisionEnter2D | Kun esineet osuvat toisiinsa |
OnCollisionStay2D | Kun esineet osuvat toisiinsa |
OnCollisionExit2D | Kun esineet poistuvat törmäystilasta |
Molemmissa tapauksissa vastustajaobjekti vastaanottaa vastustajan objektin argumenttina, joten voit saada vastustajan objektin Collision2D
etsimällä Collider2D.gameObject
kohteen tyypin (vihollinen, Collider2D.collider.tag
esine jne.).
Edellä mainituista kolmesta tapahtumasta OnCollisionEnter2D
, ja OnCollisionExit2D
niitä kutsutaan kerran törmäystä kohti.
OnCollisionStay2D
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 OnCollisionStay2D
ajaksi.
Sinun pitäisi pystyä näkemään, että menetelmää ei enää kutsuta tietyn ajan kuluttua OnCollisionStay2D
.
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 OnCollisionStay2D
on asetettu äärettömän pieneksi, itse menetelmää ei kutsuta.