Fizyka za Raycastingiem w Unity

Raycasting w Unity umożliwia wykrywanie przecięć pomiędzy promieniem a obiektami w grze w scenie. Jest to istotna technika, często używana do wyznaczania pola widzenia postaci, mechaniki strzelania lub wykrywania obiektów. Silnik Unity umożliwia przesyłanie promieni 2D i 3D za pośrednictwem systemu fizyki. W tym samouczku omówiono podstawowe aspekty rzutowania promieni w obu wymiarach wraz ze zwięzłymi przykładami kodu ilustrującymi te koncepcje.

1. Podstawy Raycastingu

  • promień w kontekście Unity jest zdefiniowany przez punkt początkowy i kierunek. Kiedy ten promień jest rzucony, „podróżuje” w swoim kierunku, wykrywając wszystkie obiekty, które przecina.

2D Przesyłanie promieni:

Vector2 rayOrigin = new Vector2(1, 1);
Vector2 rayDirection = new Vector2(1, 0);
float rayLength = 10f;

RaycastHit2D hitInfo = Physics2D.Raycast(rayOrigin, rayDirection, rayLength);

if (hitInfo.collider != null)
{
    Debug.Log("Hit: " + hitInfo.collider.name);
}

3D Przesyłanie promieni:

Vector3 rayOrigin = new Vector3(1, 1, 1);
Vector3 rayDirection = new Vector3(1, 0, 0);
float rayLength = 10f;

RaycastHit hitInfo;
bool hasHit = Physics.Raycast(rayOrigin, rayDirection, out hitInfo, rayLength);

if (hasHit)
{
    Debug.Log("Hit: " + hitInfo.collider.name);
}

2. Nurkowanie głębiej: struktura 'RaycastHit'

  • Kiedy raycast pomyślnie wykryje obiekt, zwróci informację w strukturze. Dla 2D jest to 'RaycastHit2D', a dla 3D jest to 'RaycastHit'.

Wspólne właściwości obejmują:

  • 'collider': Zderzacz, w który uderzył promień.
  • 'point': Punkt na świecie, w którym promień uderzył w powierzchnię zderzacza.
  • 'distance': Odległość od źródła promienia do punktu trafienia.

3. Maski warstw: filtrowanie wyników Raycast

  • Często konieczne staje się ograniczenie obiektów, w które może uderzyć promień. Unity oferuje do tego celu maski warstw.

2Implementacja:

int layerMask = 1 << 8;  // Assuming objects to be hit are on layer 8
RaycastHit2D hitInfo = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, layerMask);

3Implementacja:

int layerMask = 1 << 8;  // Assuming objects to be hit are on layer 8
bool hasHit = Physics.Raycast(rayOrigin, rayDirection, out hitInfo, rayLength, layerMask);

Pytania do rozwiązania:

  1. Jaka jest różnica pomiędzy raycastingiem 2D i 3D w Unity?: Chociaż podstawowa koncepcja pozostaje taka sama, raycasting 2D zwraca strukturę 'RaycastHit2D' i wykorzystuje 'Physics2D', podczas gdy 3D raycasting zwraca strukturę 'RaycastHit' i wykorzystuje klasę 'Physics'.
  2. Dlaczego warto używać masek warstw przy raycastingu?: Maski warstw umożliwiają filtrowanie wyników raycastu. Dzięki temu promień oddziałuje tylko z określonymi warstwami, zapewniając precyzyjną kontrolę nad tym, co promień może wykryć.
  3. W jaki sposób można dynamicznie określić punkt początkowy promienia?: Często początek promienia pokrywa się z pozycją kamery lub postaci. To dynamiczne przypisanie można osiągnąć za pomocą 'Camera.main.transform.position' dla pozycji kamery lub 'gameObject.transform.position' dla pozycji obiektu gry.

Wniosek

Rozumiejąc raycasting w Unity, można skutecznie wdrożyć mechanikę gry, taką jak wykrywanie obiektów, strzelanie i linia wzroku. Pamiętaj, aby rozsądnie używać masek warstw, aby dostroić interakcje promieni i zawsze mieć świadomość kontekstu wymiarowego (2D i 3D) podczas pracy w Unity Engine.

Sugerowane artykuły
Dodanie fizyki odbijającej się piłki w Unity
Tworzenie gry wyścigowej opartej na fizyce w Unity
Implementacja haka do chwytania 2D w Unity
Tworzenie symulacji flagi w Unity
Implementacja mechaniki górnictwa w grze Unity
Jak sprawdzić, czy gracz ze sztywnym ciałem jest uziemiony w jedności
DestroyIt - System zniszczenia - Recenzja pakietu Unity Asset Store