Manevrabilitatea în caz de coliziune cu fizica standard (2D)

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2021.3.3F1
Pachet sistem de intrare
  • 1.3.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

La început

Acest sfat plasează două obiecte, astfel încât să puteți implementa comportamentul de manipulare a unui obiect și de a folosi fizica standard a Unity pentru a-l împinge pe celălalt atunci când intră în contact cu celălalt.

Apropo, majoritatea setărilor sunt aceleași cu procedura descrisă în articolul anterior "Determinarea dacă obiectele se ciocnesc între ele (2D)".

Pregătire

Procedura de aici este aproape aceeași cu sfaturile anterioare , așa că haideți să o curgem fără probleme.

După crearea proiectului, pregătiți două imagini sprite care vor fi obiecte și adăugați-le. Numele sunt "UnityTips" și, respectiv, "UnityTips_2".

Adăugați două fișiere imagine plasându-le în vizualizare.

Adăugați un script pentru a muta obiectul din stânga cu tastatura. Numele Player scriptului este .

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);
    }
  }
}

Atașați la obiectul pe care doriți să executați scriptul.

Rulați jocul și verificați dacă funcționează cu tastele cursorului de pe tastatură.

În cele din urmă, plasați un obiect text pentru a afișa starea de detectare a coliziunii. Numele TextState obiectului este .

Setări de gestionare în caz de coliziune

De aici, puteți configura setările legate de coliziuni.

Mai întâi, selectați obiectul pe care doriți să îl mutați, "UnityTips", și faceți clic pe "Adăugați componentă" din inspector. Selectați din Physics 2D listă. Physics este un obiect 3D, deci nu vă înșelați.

Physics 2DBox Collider 2D Selectați din . Deoarece acest personaj este dreptunghiular, este selectată opțiunea Casetă, dar dacă este în formă de cerc, de exemplu, selectați alte forme, cum ar fi Cerc.

Data trecută, am vrut să obțin informații doar dacă l-am lovit sau nu, așa că am bifat "Make it trigger", dar de data aceasta nu o voi face. Acest lucru permite manipularea coliziunilor în fizică.

Rigidbody 2D Apoi adăugați componentele . Îl puteți adăuga din "Physics 2D -> Rigidbody 2D". Rigidbody oferă informațiiCollider fizice obiectului și poate determina, de asemenea, coliziuni cu obiecte care au .

Setați scara gravitațională la 0 pentru a preveni căderea liberă dedesubt.

În mod similar, adăugați o componentă la celălalt obiect "UnityTips_2" pentru a marca Box Collider 2D accesările.

În plus, de data aceasta este necesar să vă deplasați cu forța adversarului,Rigidbody 2D deci adăugați . Scara gravitațională ar trebui să fie 0.

Asta e tot ce există. Nu este necesar niciun program în acest moment. Rulați jocul și încercați să atingeți un alt obiect.

Cred că puteți confirma că, dacă împingeți adversarul în acest fel, adversarul se va comporta ca și cum ar fi împins. Este foarte ușor să utilizați fizica funcției standard, deoarece nu este necesar niciun program.

Împiedicarea rotirii obiectelor

Puteți vedea când îl atingeți, dar dacă punctul de lovire se schimbă chiar și ușor, fiecare obiect se va roti. Ca joc, devine adesea nefiresc, deci trebuie să-l setați astfel încât să nu se rotească.

Rigidbody 2D Componenta are un element numit "Rotație fixă" în "Constrângeri", deci verificați Z. Acum puteți lucra astfel încât să nu se rotească. Încercați să-l setați la două obiecte și să rulați jocul pentru a-l verifica.

Cred că poți fi sigur că nu se rotește indiferent din ce unghi îl împingi.

Faceți ceva atunci când obiectele se lovesc reciproc

De exemplu, poate doriți să implementați un glonț care lovește un inamic în timp ce împinge adversarul, reducând în același timp sănătatea inamicului. Acest lucru este la fel ca sfaturile anterioare , deoarece evenimentul va avea loc, astfel încât să puteți face față acestuia.

Player Deschideți scriptul și adăugați fiecare câmp și metodă utilizând după cum urmează:

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}";
  }
}

Deoarece dorim să afișăm informații dacă a fost sau nu lovit, vom face posibilă afișarea acestuia într-un obiect text după cum urmează.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

Procesul de detectare a coliziunilor este descris după cum urmează.

/// <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 cu sfaturile anterioare------, dar numele metodei este acum "OnCollision------2D" în loc de "OnTrigger2D".

Rigidbody 2D Fiecare dintre evenimentele de mai sus apare atunci când un obiect care s-a ciocnit cu un alt obiect Collider 2D care are . Acest lucru vă va permite să determinați și să procesați dacă este corect sau nu.

Există trei evenimente, fiecare dintre ele fiind convocat la următoarea oră.

OnCollisionEnter2D Când obiectele se lovesc reciproc
OnCollisionStay2D În timp ce obiectele se lovesc reciproc
OnCollisionExit2D Când obiectele părăsesc starea de coliziune

În ambele cazuri, obiectul adversarului primește obiectul adversarului ca argument, astfel încât să puteți obține obiectul adversarului Collision2D căutând Collider2D.gameObject tipul de țintă lovit de (inamic, Collider2D.collider.tag obiect etc.).

Dintre cele trei evenimente de OnCollisionEnter2D mai sus, și OnCollisionExit2D sunt apelate o dată pe coliziune.

OnCollisionStay2D este numit fiecare cadru în timpul coliziunii, dar evenimentul nu mai este apelat după ce a trecut o anumită perioadă de timp de când ambele obiecte s-au oprit. Acest lucru se datorează faptului că se consideră că a intrat într-o stare de somn și este considerat o risipă de procesare pentru a calcula coliziunile fiecărui cadru cu ceva care nu se mișcă.

Dacă nu doriți Rigidbody 2D să doarmă, schimbați modul de repaus al parametrului la "Nu dormi".

După modificarea codului, setați textul pentru afișarea informațiilor.

Rulați jocul și mutați obiectul cu tastatura pentru a atinge un alt spirit. Puteți vedea că sunt necesare trei funcții pentru fiecare.

Apropo, dacă atingeți un obiect și apoi opriți mișcarea, metoda va fi apelată pentru OnCollisionStay2D o perioadă scurtă de timp. Ar trebui să puteți vedea că metoda nu mai este apelată după OnCollisionStay2D o anumită perioadă de timp.

Aceasta indică faptul că ați introdus o stare de repaus, dar dacă doriți să modificați timpul până când intrați în acest somn, îl puteți schimba selectând "Fizică 2D" din setările proiectului și specificând parametrul "Timp de somn" în secunde. Nu poate fi setat la 0, dar dacă OnCollisionStay2D este setat la infinit de mic, metoda însăși nu va fi numită.