Obsługa kolizji ze standardową fizyką (2D)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacji

Windows
  • Okna 11
Edytor Unity
  • 2021.3.3f1
Pakiet systemu wejściowego
  • 1.3.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.

Na początku

Ta wskazówka umieszcza dwa obiekty, dzięki czemu można zaimplementować zachowanie polegające na manipulowaniu jednym obiektem i użyciu standardowej fizyki Unity, aby popchnąć drugi, gdy wejdzie w kontakt z drugim.

Nawiasem mówiąc, większość ustawień jest taka sama jak procedura opisana w poprzednim artykule "Określanie, czy obiekty zderzają się ze sobą (2D)".

Preparat

Procedura tutaj jest prawie taka sama jak poprzednie wskazówki , więc przepłynnijmy ją płynnie.

Po utworzeniu projektu przygotuj dwa obrazy duszków, które będą obiektami i dodaj je. Nazwy to odpowiednio "UnityTips" i "UnityTips_2".

Dodaj dwa pliki obrazów, upuszczając je w widoku.

Dodaj skrypt, aby przesunąć lewy obiekt za pomocą klawiatury. Nazwa skryptu Player to .

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

Dołącz do obiektu, na którym chcesz uruchomić skrypt.

Uruchom grę i sprawdź, czy działa z kursora na klawiaturze.

Na koniec umieść obiekt tekstowy, aby wyświetlić stan wykrycia kolizji. Nazwa obiektu TextState to .

Ustawienia obsługi kolizji

W tym miejscu możesz skonfigurować ustawienia związane z kolizjami.

Najpierw wybierz obiekt, który chcesz przenieść, "UnityTips" i kliknij "Dodaj komponent" od inspektora. Wybierz z Physics 2D listy. Physics jest obiektem 3D, więc nie popełnij błędu.

Physics 2DBox Collider 2D Wybierz z . Ponieważ ten duszek jest prostokątny, pole jest zaznaczone, ale jeśli na przykład ma kształt koła, zaznacz inne kształty, takie jak Okrąg.

Ostatnim razem chciałem uzyskać informacje tylko o tym, czy go trafiłem, więc zaznaczyłem "Make it trigger", ale tym razem nie będę. Umożliwia to radzenie sobie z kolizjami w fizyce.

Rigidbody 2D Następnie dodaj składniki . Możesz go dodać z "Physics 2D -> Rigidbody 2D". Rigidbody Daje informacjeCollider fizyczne do obiektu, a także może określać kolizje z obiektami, które mają .

Ustaw skalę grawitacyjną na 0, aby zapobiec swobodnemu spadkowi poniżej.

Podobnie, dodaj komponent do innego obiektu "UnityTips_2", aby oznaczyć Box Collider 2D trafienia.

Ponadto tym razem konieczne jest poruszanie się z siłą przeciwnika,Rigidbody 2D więc dodaj . Skala grawitacji powinna wynosić 0.

To wszystko. W tej chwili nie jest wymagany żaden program. Uruchom grę i spróbuj dotknąć innego obiektu.

Myślę, że możesz potwierdzić, że jeśli wepchniesz przeciwnika w ten sposób, przeciwnik będzie zachowywał się tak, jakby został popchnięty. Bardzo łatwo jest użyć fizyki standardowej funkcji, ponieważ nie jest wymagany żaden program.

Zapobieganie obracaniu się obiektów

Możesz zobaczyć, kiedy go dotkniesz, ale jeśli punkt wytrzymałości przesunie się nawet nieznacznie, każdy obiekt się obróci. Jako gra często staje się nienaturalna, więc musisz ustawić ją tak, aby się nie obracała.

Rigidbody 2D Komponent ma element o nazwie "Stały obrót" w "Ograniczeniach", więc zaznacz Z. Teraz możesz pracować tak, aby się nie obracał. Spróbuj ustawić go na dwa obiekty i uruchomić grę, aby to sprawdzić.

Myślę, że możesz być pewien, że nie obraca się bez względu na to, pod jakim kątem go popchniesz.

Zrób coś, gdy obiekty uderzą o siebie

Na przykład możesz zaimplementować pocisk, który trafia wroga, jednocześnie popychając przeciwnika, jednocześnie zmniejszając jego zdrowie. Jest to to samo, co poprzednie wskazówki , ponieważ zdarzenie nastąpi, więc możesz sobie z tym poradzić.

Player Otwórz skrypt i dodaj każde pole i metodę, korzystając z następujących czynności:

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

Ponieważ chcemy wyświetlić informacje o tym, czy został trafiony, umożliwimy wyświetlenie go w obiekcie tekstowym w następujący sposób.

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

Proces wykrywania kolizji jest opisany w następujący sposób.

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

Podobnie jak w poprzednich wskazówkach------, ale nazwa metody to teraz "OnCollision------2D" zamiast "OnTrigger2D".

Rigidbody 2D Każde z powyższych zdarzeń występuje, gdy obiekt, który ma koliduje z innym obiektem Collider 2D , który ma . Pozwoli to określić i przetworzyć, czy jest poprawny, czy nie.

Istnieją trzy wydarzenia, z których każde jest zwoływane w następującym czasie.

OnCollisionEnter2D Gdy obiekty uderzają o siebie
OnCollisionStay2D Podczas gdy obiekty uderzają o siebie
OnCollisionExit2D Gdy obiekty opuszczają stan kolizji

W obu przypadkach obiekt przeciwnika otrzymuje obiekt przeciwnika jako argument, dzięki czemu możesz uzyskać obiekt przeciwnikaCollision2D, wyszukując Collider2D.gameObject typ trafionego celu (wróg, Collider2D.collider.tag przedmiot itp.).

Z OnCollisionEnter2D powyższych trzech zdarzeń i OnCollisionExit2D są wywoływane raz na kolizję.

OnCollisionStay2D jest wywoływana jako każda klatka podczas kolizji, ale zdarzenie nie jest już wywoływane po upływie określonego czasu od zatrzymania obu obiektów. Dzieje się tak dlatego, że uważa się, że wszedł w stan uśpienia, a obliczanie kolizji każdej klatki z czymś, co się nie porusza, jest uważane za marnotrawstwo przetwarzania.

Jeśli nie Rigidbody 2D chcesz, aby spał, zmień tryb uśpienia parametru na "Nie śpij".

Po zmianie kodu ustaw tekst do wyświetlania informacji.

Uruchom grę i przesuń obiekt za pomocą klawiatury, aby dotknąć innego duszka. Widać, że dla każdej z nich wywoływane są trzy funkcje.

Nawiasem mówiąc, jeśli dotkniesz obiektu, a następnie przestaniesz się poruszać, metoda zostanie wywołana na OnCollisionStay2D krótki czas. Powinieneś być w stanie zobaczyć, że metoda nie jest już wywoływana po OnCollisionStay2D pewnym czasie.

Oznacza to, że wszedłeś w stan uśpienia, ale jeśli chcesz zmienić czas do wejścia w ten sen, możesz go zmienić, wybierając "Fizyka 2D" z ustawień projektu i określając parametr "Czas uśpienia" w sekundach. Nie można go ustawić na 0, ale jeśli jest OnCollisionStay2D ustawiony na nieskończenie mały, sama metoda nie zostanie wywołana.