Kokkupõrke käsitlemine standardfüüsikaga (2D)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2021.3.3f1
Sisendsüsteemi pakett
  • 1.3.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Alguses

See näpunäide asetab kaks objekti, et saaksite rakendada ühe objektiga manipuleerimise käitumist ja kasutada Unity standardset füüsikat, et suruda teist, kui see puutub kokku teisega.

Muide, enamik seadeid on samad, mida on kirjeldatud eelmises artiklis "Objektide üksteisega kokkupõrke (2D) kindlaksmääramine".

Ettevalmistus

Siinne protseduur on peaaegu sama, mis eelmised nõuanded , nii et lähme sujuvalt.

Pärast projekti loomist valmistage ette kaks spraidipilti, mis on objektid, ja lisage need. Nimed on vastavalt "UnityTips" ja "UnityTips_2".

Lisage kaks pildifaili, kukutades need vaatesse.

Lisage skript, et liigutada vasakut objekti klaviatuuriga. Skripti 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);
    }
  }
}

Manustage objektile, millel soovite skripti käivitada.

Käivitage mäng ja kontrollige, kas see töötab klaviatuuri kursoriklahvidega.

Lõpuks asetage kokkupõrke tuvastamise oleku kuvamiseks tekstiobjekt. Objekti nimi TextState on .

Kokkupõrke käsitsemise seaded

Siit saate konfigureerida kokkupõrgetega seotud seadeid.

Esiteks valige objekt, mida soovite liigutada, "UnityTips" ja klõpsake inspektorilt "Lisa komponent". Valige loendist Physics 2D . Physics on 3D-objekt, nii et ärge tehke viga.

Physics 2DBox Collider 2D Valige . Kuna see sprait on ristkülikukujuline, on ruut valitud, kuid kui see on näiteks ringikujuline, valige muud kujundid, näiteks Ring.

Eelmisel korral tahtsin saada teavet ainult selle kohta, kas ma seda tabasin või mitte, nii et kontrollisin nuppu "Tee see päästikuks", kuid seekord ma seda ei tee. See võimaldab füüsikas kokkupõrke käsitlemist.

Rigidbody 2D Seejärel lisage komponendid . Saate selle lisada jaotisest "Physics 2D -> Rigidbody 2D". Rigidbody annab objektile füüsikateavetCollider ja võib määrata ka kokkupõrkeid objektidega, millel on .

Seadke gravitatsiooniskaala väärtuseks 0, et vältida vaba langemist allapoole.

Samamoodi lisage teisele objektile komponent "UnityTips_2", et märkida Box Collider 2D tabamusi.

Lisaks on seekord vaja liikuda vastase jõuga,Rigidbody 2D nii et lisage . Gravitatsiooniskaala peaks olema 0.

See on kõik, mis seal on. Praegu pole programmi vaja. Käivitage mäng ja proovige puudutada teist objekti.

Ma arvan, et võite kinnitada, et kui surute vastast niimoodi sisse, käitub vastane nii, nagu oleks teda surutud. Standardfunktsiooni füüsikat on väga lihtne kasutada, kuna programmi pole vaja.

Objektide pöörlemise takistamine

Näete, kui seda puudutate, kuid kui löögipunkt nihkub isegi veidi, pöörleb iga objekt. Mänguna muutub see sageli ebaloomulikuks, nii et peate selle seadistama nii, et see ei pöörleks.

Rigidbody 2D Komponendil on üksus nimega "Fikseeritud pööramine" jaotises "Piirangud", seega kontrollige Z. Nüüd saate töötada nii, et see ei pöörleks. Proovige seada see kahele objektile ja käivitada mäng selle kontrollimiseks.

Ma arvan, et võite olla kindel, et see ei pöörle, olenemata sellest, millise nurga alt te seda lükkate.

Tehke midagi, kui objektid üksteist tabavad

Näiteks võite soovida rakendada kuuli, mis tabab vaenlast, lükates samal ajal vastast, vähendades samal ajal vaenlase tervist. See on sama, mis eelmised näpunäited , kuna sündmus toimub, nii et saate sellega toime tulla.

Player Avage skript ja lisage iga väli ja meetod, kasutades järgmist:

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

Kuna tahame kuvada teavet selle kohta, kas see tabas või mitte, võimaldame seda tekstiobjektis kuvada järgmiselt.

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

Kokkupõrke tuvastamise protsessi kirjeldatakse järgmiselt.

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

Sarnaselt eelmistele näpunäidetele------, kuid meetodi nimi on nüüd "OnCollision------2D" asemel "OnTrigger2D".

Rigidbody 2D Kõik ülaltoodud sündmused toimuvad siis, kui objekt, mis on kokku põrganud teise objektiga Collider 2D , millel on . See võimaldab teil kindlaks teha ja töödelda, kas see on õige või mitte.

On kolm sündmust, millest igaüks kutsutakse järgmisel ajal.

OnCollisionEnter2D Kui objektid üksteist tabavad
OnCollisionStay2D Samal ajal kui objektid üksteist löövad
OnCollisionExit2D Kui objektid lahkuvad kokkupõrke olekust

Mõlemal juhul saab vastase objekt argumendina vastase objekti, nii et saate vastase objekti, Collision2D otsides üles Collider2D.gameObject tabatud sihtmärgi tüübi (vaenlane, Collider2D.collider.tag ese jne).

Ülaltoodud kolmest sündmusest OnCollisionEnter2D ja OnCollisionExit2D neid nimetatakse üks kord kokkupõrke kohta.

OnCollisionStay2D nimetatakse kokkupõrke ajal igaks kaadriks, kuid sündmust ei kutsuta enam pärast teatud aja möödumist mõlema objekti peatumisest. Seda seetõttu, et seda peetakse uneseisundisse sisenenuks ja seda peetakse töötlemise raiskamiseks, et arvutada iga kaadri kokkupõrked millegagi, mis ei liigu.

Kui te Rigidbody 2D ei soovi, et see magaks, muutke parameetri unerežiim "Ära maga".

Pärast koodi muutmist määrake teabe kuvamiseks tekst.

Käivitage mäng ja liigutage objekti klaviatuuriga, et puudutada teist spraiti. Näete, et igaühe jaoks on vaja kolme funktsiooni.

Muide, kui puudutate objekti ja seejärel lõpetate liikumise, kutsutakse meetod lühikeseks OnCollisionStay2D ajaks. Teil peaks olema võimalik näha, et meetodit teatud aja pärast OnCollisionStay2D enam ei kutsuta.

See näitab, et olete sisenenud uneolekusse, kuid kui soovite muuta aega, kuni sisestate selle une, saate seda muuta, valides projekti seadetest "2D füüsika" ja määrates parameetri "Uneaeg" sekundites. Seda ei saa seada väärtusele 0, kuid kui see OnCollisionStay2D on seatud lõpmata väikeseks, siis meetodit ise ei kutsuta.