Botsingsafhandeling met standaardfysica (2D)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2021.3.3f1
Input systeem pakket
  • 1.3.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

Eerst

Deze tip plaatst twee objecten zodat je het gedrag van het manipuleren van het ene object kunt implementeren en de standaardfysica van Unity kunt gebruiken om het andere te duwen wanneer het in contact komt met het andere.

Overigens zijn de meeste instellingen hetzelfde als de procedure die is beschreven in het vorige artikel "Bepalen of objecten met elkaar botsen (2D)".

Voorbereiding

De procedure hier is bijna hetzelfde als de vorige tips , dus laten we het soepel laten verlopen.

Nadat u het project hebt gemaakt, bereidt u twee sprite-afbeeldingen voor die objecten zullen zijn en voegt u deze toe. De namen zijn respectievelijk "UnityTips" en "UnityTips_2".

Voeg twee afbeeldingsbestanden toe door ze in de weergave neer te zetten.

Voeg een script toe om het linkerobject met het toetsenbord te verplaatsen. De scriptnaam Player is .

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

Koppel aan het object waarop u het script wilt uitvoeren.

Voer het spel uit en controleer of het werkt met de cursortoetsen op uw toetsenbord.

Plaats ten slotte een tekstobject om de botsingsdetectiestatus weer te geven. De objectnaam TextState is .

Instellingen voor botsingsafhandeling

Vanaf hier kunt u de instellingen met betrekking tot botsingen configureren.

Selecteer eerst het object dat u wilt verplaatsen, "UnityTips", en klik op "Component toevoegen" in de inspecteur. Maak een keuze uit Physics 2D de lijst. Physics is een 3D-object, dus vergis je niet.

Physics 2DBox Collider 2D Kies uit . Aangezien deze sprite rechthoekig is, is Box geselecteerd, maar als deze bijvoorbeeld cirkelvormig is, selecteert u andere vormen zoals Cirkel.

De vorige keer wilde ik alleen informatie krijgen over of ik het wel of niet raak, dus ik heb "Make it trigger" aangevinkt, maar deze keer doe ik dat niet. Dit maakt botsingsafhandeling in de natuurkunde mogelijk.

Rigidbody 2D Voeg vervolgens de componenten van . Je kunt het toevoegen vanuit "Physics 2D -> Rigidbody 2D". Rigidbody geeft natuurkundige informatieCollider aan het object en kan ook botsingen bepalen met objecten die .

Stel de zwaartekrachtschaal in op 0 om een vrije val eronder te voorkomen.

Voeg op dezelfde manier een component toe aan het andere object "UnityTips_2" om treffers te markeren Box Collider 2D .

Bovendien is het deze keer noodzakelijk om met de kracht van de tegenstander te bewegen,Rigidbody 2D dus voeg toe . De zwaartekrachtschaal moet 0 zijn.

Dat is alles. Er is op dit moment geen programma vereist. Voer het spel uit en probeer een ander object aan te raken.

Ik denk dat je kunt bevestigen dat als je de tegenstander zo naar binnen duwt, de tegenstander zich zal gedragen alsof hij wordt geduwd. Het is heel gemakkelijk om de fysica van de standaardfunctie te gebruiken omdat er geen programma nodig is.

Voorkomen dat objecten roteren

Je kunt het zien wanneer je het aanraakt, maar als het raakpunt zelfs maar een beetje verschuift, zal elk object roteren. Als spel wordt het vaak onnatuurlijk, dus je moet het zo instellen dat het niet roteert.

Rigidbody 2D De component heeft een item genaamd "Fixed rotation" in "Constraints", dus controleer Z. Nu kunt u zo werken dat het niet roteert. Probeer het in te stellen op twee objecten en voer het spel uit om het te controleren.

Ik denk dat je er zeker van kunt zijn dat het niet draait, ongeacht vanuit welke hoek je het duwt.

Doe iets als voorwerpen elkaar raken

Je kunt bijvoorbeeld een kogel implementeren die een vijand raakt terwijl je de tegenstander duwt terwijl je de gezondheid van de vijand vermindert. Dit is hetzelfde als de vorige tips , omdat de gebeurtenis zal plaatsvinden, zodat je ermee om kunt gaan.

Player Open het script en voeg elk veld en elke methode als volgt toe:

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

Omdat we informatie willen weergeven over het al dan niet raken ervan, maken we het mogelijk om het als volgt in een tekstobject weer te geven.

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

Het botsingsdetectieproces wordt als volgt beschreven.

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

Vergelijkbaar met de vorige tips------, maar de methodenaam is nu "OnCollision------2D" in plaats van "OnTrigger2D".

Rigidbody 2D Elk van de bovenstaande gebeurtenissen treedt op wanneer een object dat is gebotst met een ander object Collider 2D dat . Hiermee kunt u bepalen en verwerken of het correct is of niet.

Er zijn drie gebeurtenissen, die elk op het volgende tijdstip worden aangeroepen.

OnCollisionEnter2D Wanneer objecten elkaar raken
OnCollisionStay2D Terwijl objecten elkaar raken
OnCollisionExit2D Wanneer objecten de botsingsstatus verlaten

In beide gevallen ontvangt het object van de tegenstander het object van de tegenstander als argument, zodat je het object van Collision2D de tegenstander kunt krijgen door het type doel op Collider2D.gameObject te zoeken dat door wordt geraakt (vijand, item, Collider2D.collider.tag enz.).

Van de OnCollisionEnter2D bovenstaande drie gebeurtenissen, en OnCollisionExit2D worden één keer per botsing genoemd.

OnCollisionStay2D wordt tijdens de botsing elk frame aangeroepen, maar de gebeurtenis wordt niet meer aangeroepen nadat er een bepaalde tijd is verstreken sinds beide objecten zijn gestopt. Dit komt omdat het wordt beschouwd als in een slaaptoestand en het wordt beschouwd als een verspilling van verwerking om botsingen elk frame te berekenen met iets dat niet beweegt.

Als u niet wilt dat het slaapt, wijzigt u Rigidbody 2D de slaapmodus van de parameter in "Niet slapen".

Nadat u de code hebt gewijzigd, stelt u de tekst in voor het weergeven van informatie.

Voer het spel uit en verplaats het object met het toetsenbord om een andere sprite aan te raken. Je kunt zien dat er voor elk drie functies worden aangeroepen.

Trouwens, als u een object aanraakt en vervolgens stopt met bewegen, wordt de methode voor OnCollisionStay2D een korte tijd aangeroepen. Je zou moeten kunnen zien dat de methode na OnCollisionStay2D een bepaalde tijd niet meer wordt aangeroepen.

Dit geeft aan dat u een slaapstand hebt ingevoerd, maar als u de tijd wilt wijzigen totdat u deze slaapstand invoert, kunt u deze wijzigen door "2D-fysica" te selecteren in de projectinstellingen en de parameter "Slaaptijd" in seconden op te geven. Het kan niet worden ingesteld op 0, maar als het OnCollisionStay2D is ingesteld op oneindig klein, wordt de methode zelf niet aangeroepen.