Obravnavanje trkov s standardno fiziko (2D)

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik enotnosti
  • 2021.3.3f1
Paket vhodnega sistema
  • 1.3.0

Predpogoji za to konico

Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.

Sprva

Ta namig postavi dva predmeta, tako da lahko izvajate vedenje manipuliranja z enim predmetom in uporabo Unityjine standardne fizike, da potisnete drugega, ko pride v stik z drugim.

Mimogrede, večina nastavitev je enaka postopku, opisanem v prejšnjem članku "Ugotavljanje, ali predmeti trčejo med seboj (2D)".

Pripravka

Tukajšnja procedura je skoraj enaka prejšnjim nasvetom , zato ga tekoče pretočimo.

Po izdelavi projekta pripravite dve sprite sliki, ki bosta predmeti in jih dodajte. Imena so »UnityTips« oziroma »UnityTips_2«.

Dodajte dve slikovni datoteki tako, da jih spustite v pogled.

Dodajte skript, da premaknete levi predmet s tipkovnico. Ime skripta je Player .

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

Priložite k predmetu, na katerem želite zagnati skript.

Zaženite igro in preverite, ali deluje s tipkami kazalca na tipkovnici.

Končno postavite besedilni predmet, da prikažete stanje zaznavanja trkov. Ime predmeta je TextState .

Nastavitve za ravnanje s trčenjem

Od tod lahko konfigurirate nastavitve, povezane s trke.

Najprej izberite predmet, ki ga želite premakniti, »UnityTips« in od inšpektorja kliknite »Dodaj komponento«. Izberite s Physics 2D seznama. Physics je 3D predmet, zato ne naredite napake.

Physics 2DBox Collider 2D Izberite iz . Ker je ta sprite pravokolen, je box izbran, če pa je kroga oblike, na primer izberite druge oblike, kot je Krog.

Zadnjič sem hotel dobiti informacije samo o tem, ali sem ga zadel ali ne, zato sem preveril "Naj bo sprožilec", tokrat pa ne bom. To omogoča ravnanje s trkom v fiziki.

Rigidbody 2D Nato dodajte komponente programa . Lahko ga dodate iz "Fizika 2D -> Rigidbody 2D". Rigidbody daje fizikiCollider informacije predmetu in lahko določi tudi trke s predmeti, ki imajo .

Nastavite gravitacijsko lestvico na 0, da preprečite prosti padec spodaj.

Podobno dodajte komponento drugemu predmetu "UnityTips_2" Box Collider 2D za označevanje zadetkov.

Poleg tega je tokrat potrebno premikati s silo nasprotnika,Rigidbody 2D zato dodajte . Gravitacijska lestvica bi morala biti 0.

To je vse, kar je tu. Trenutno ni potreben noben program. Zaženite igro in se poskusite dotakniti drugega predmeta.

Mislim, da lahko potrdiš, da se bo nasprotnik, če boš tako potisnil nasprotnika, obnašal, kot da je porinjena. Zelo enostavno je uporabiti fiziko standardne funkcije, ker ni potreben noben program.

Preprečevanje vrtenja predmetov

Ko se ga dotaknete, lahko vidite, a če se točka zadetka celo nekoliko premakne, se bo vsak predmet zavrtel. Kot igra pogosto postane nenaravna, zato jo morate nastaviti tako, da se ne vrti.

Rigidbody 2D Komponenta ima element z imenom »Fiksno vrtenje« v »Omejitve«, zato preverite Z. Zdaj lahko delaš tako, da se ne vrti. Poskusite ga nastavite na dva predmeta in zagon igre, da jo preverite.

Mislim, da si lahko prepričan, da se ne vrti ne glede na to, iz kakšnega kota ga potisneš.

Naredite nekaj, ko se predmeti zadenejo med seboj

Na primer, boste morda želeli izvajati kroglo, ki zadene sovražnika, medtem ko potiska nasprotnika, medtem ko zmanjšuje zdravje sovražnika. To je enako kot prejšnji nasveti, saj se bo dogodek zgodilo, tako da se lahko ukvarjate z njim.

Player Odprite skript in dodajte vsako polje in metodo na naslednji način:

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

Ker želimo prikazati informacije o tem, ali je bil zadet ali ne, jih bomo omogočili, da jih prikažemo v besedilnem objektu na naslednji način.

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

Postopek zaznavanja trkov je opisan na naslednji način.

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

Podobno kot prejšnji nasveti------, vendar je ime metode zdaj "OnCollision------2D" namesto "OnTrigger2D".

Rigidbody 2D Vsak od zgoraj navedenih dogodkov se zgodi, ko predmet, ki je trk z drugim predmetom Collider 2D , ki ima . To vam bo omogočilo, da določite in obdelate, ali je pravilno ali ne.

Obstajajo trije dogodki, od katerih se vsak imenuje ob naslednjem času.

OnCollisionEnter2D Ko se predmeti med seboj zadenejo
OnCollisionStay2D Medtem ko se predmeti udarjajo med seboj
OnCollisionExit2D Ko predmeti zapustijo stanje trka

V obeh primerih nasprotnikov predmet prejme nasprotnikov predmet kot argument, Collision2D Collider2D.gameObject tako da lahko dobiš nasprotnikov predmet tako, da iščeš vrsto tarče, ki jo zadene (sovražnik, Collider2D.collider.tag element itd.).

Od zgoraj navedenih OnCollisionEnter2D treh dogodkov, OnCollisionExit2D in se imenujejo enkrat na trk.

OnCollisionStay2D se imenuje vsak okvir med trčenjem, vendar dogodek ni več poklican, potem ko je minilo določeno obdobje, odkar sta se oba predmeta ustavila. To je zato, ker se šteje, da je vstopil v stanje spanja, in se šteje za odpadke predelave za izračun trkov vsak okvir z nečim, kar se ne premika.

Če ne želite Rigidbody 2D spati, spremenite način spanja parametra v »Ne spi«.

Ko spremenite kodo, nastavite besedilo za prikaz informacij.

Zaženite igro in premaknite predmet s tipkovnico, da se dotaknete drugega šprica. Vidite lahko, da so za vsako poklicane tri funkcije.

Mimogrede, če se dotaknete predmeta in se nato prenehate premikati, OnCollisionStay2D bo metoda poklicana za kratek čas. Videti morate, da OnCollisionStay2D metoda ni več poklicana po določenem času.

To pomeni, da ste vnesli stanje spanja, vendar če želite spremeniti čas, dokler ne vnesete tega spanja, ga lahko spremenite tako, da izberete »2D Physics« iz nastavitev projekta in določite parameter »Čas mirovanja« v nekaj sekundah. Ni ga mogoče nastaviti na 0, OnCollisionStay2D če pa je nastavljena na neskončno majhno, sama metoda ne bo imenovana.