Törmäyskäsittely standardifysiikalla (2D)

Sivu päivitetty :
Sivun luontipäivämäärä :

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 2DBox 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.