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.

Dalsza lektura



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow