Obsługa kolizji ze standardową fizyką (2D)
Ś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 2D
Box 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.