unity3d
Raycast
Szukaj…
Parametry
Parametr | Detale |
---|---|
pochodzenie | Punkt początkowy promienia we współrzędnych światowych |
kierunek | Kierunek promienia |
maxDistance | Maksymalna odległość, jaką promień powinien sprawdzić pod kątem kolizji |
layerMask | Maska warstwy używana do selektywnego ignorowania zderzaczy podczas rzucania promienia. |
queryTriggerInteraction | Określa, gdzie to zapytanie powinno trafić Wyzwalacze. |
Fizyka Raycast
Funkcja ta rzuca promień od punktu origin
w kierunku direction
o długości maxDistance
przeciwko wszystkim zderzaczy na scenie.
Funkcja przyjmuje na origin
direction
maxDistance
i obliczyć, czy jest zderzacz przed GameObject.
Physics.Raycast(origin, direction, maxDistance);
Na przykład ta funkcja wydrukuje Hello World
na konsoli, jeśli jest do GameObject
dołączone coś w obrębie 10 jednostek GameObject
:
using UnityEngine;
public class TestPhysicsRaycast: MonoBehaviour
{
void FixedUpdate()
{
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, 10))
print("Hello World");
}
}
Physics2D Raycast2D
Możesz użyć raycastów, aby sprawdzić, czy ai może chodzić bez spadania z krawędzi poziomu.
using UnityEngine;
public class Physics2dRaycast: MonoBehaviour
{
public LayerMask LineOfSightMask;
void FixedUpdate()
{
RaycastHit2D hit = Physics2D.Raycast(raycastRightPart, Vector2.down, 0.6f * heightCharacter, LineOfSightMask);
if(hit.collider != null)
{
//code when the ai can walk
}
else
{
//code when the ai cannot walk
}
}
}
W tym przykładzie kierunek jest właściwy. Zmienna raycastRightPart jest prawą częścią znaku, więc raycast nastąpi w prawej części znaku. Odległość wynosi 0,6f wysokości postaci, więc raycast nie da ciosu, gdy uderzy w ziemię, która jest znacznie niższa niż ziemia, na której aktualnie stoi. Upewnij się, że maska Layermask jest ustawiona tylko na ziemię, w przeciwnym razie wykryje również inne rodzaje obiektów.
Sam RaycastHit2D jest strukturą, a nie klasą, więc hit nie może mieć wartości zerowej; oznacza to, że musisz sprawdzić zderzacz zmiennej RaycastHit2D.
Hermetyzowanie połączeń Raycast
Skrypty wywołujące Raycast
bezpośrednio mogą powodować problemy, jeśli będziesz musiał zmienić macierze kolizji w przyszłości, ponieważ będziesz musiał wyśledzić każde pole LayerMask
aby uwzględnić zmiany. W zależności od wielkości twojego projektu może to stać się ogromnym przedsięwzięciem.
Hermetyzowanie połączeń Raycast
może ułatwić Ci życie.
Patrząc na to z zasady SoC , obiekt gry naprawdę nie powinien wiedzieć ani obchodzić się z LayerMasks. Potrzebuje tylko metody skanowania otoczenia. To, czy wynik raycast zwróci to, czy nie, nie powinno mieć znaczenia dla obiektu gry. Powinien działać wyłącznie na podstawie otrzymanych informacji i nie przyjmować żadnych założeń dotyczących środowiska, w którym istnieje.
Jednym ze sposobów podejścia do tego jest przeniesienie wartości LayerMask do instancji ScriptableObject i użycie ich jako formy usług raycast wprowadzanych do skryptów.
// RaycastService.cs
using UnityEngine;
[CreateAssetMenu(menuName = "StackOverflow")]
public class RaycastService : ScriptableObject
{
[SerializeField]
LayerMask layerMask;
public RaycastHit2D Raycast2D(Vector2 origin, Vector2 direction, float distance)
{
return Physics2D.Raycast(origin, direction, distance, layerMask.value);
}
// Add more methods as needed
}
// MyScript.cs
using UnityEngine;
public class MyScript : MonoBehaviour
{
[SerializeField]
RaycastService raycastService;
void FixedUpdate()
{
RaycastHit2D hit = raycastService.Raycast2D(Vector2.zero, Vector2.down, 1f);
}
}
Umożliwia to wykonanie szeregu usług raycast, wszystkie z różnymi kombinacjami LayerMask dla różnych sytuacji. Możesz mieć taki, który uderza tylko w zderzaki naziemne, a drugi w zderzaki naziemne i platformy jednokierunkowe.
Jeśli kiedykolwiek będziesz musiał wprowadzić drastyczne zmiany w ustawieniach LayerMask, musisz tylko zaktualizować te zasoby RaycastService.