Ricerca…


Parametri

Parametro Dettagli
origine Il punto di partenza del raggio nelle coordinate del mondo
direzione La direzione del raggio
maxDistance La distanza massima che il raggio dovrebbe controllare per le collisioni
layerMask Una maschera di livello che viene utilizzata per ignorare selettivamente i Collider durante il casting di un raggio.
queryTriggerInteraction Specifica dove questa query deve colpire i trigger.

Raggio di fisica

Questa funzione lancia un raggio dal punto origin in direzione direction della lunghezza maxDistance contro tutti acceleratori nella scena.

La funzione prende la direction origin maxDistance e calcola se c'è un collisore di fronte al GameObject.

Physics.Raycast(origin, direction, maxDistance);

Ad esempio, questa funzione stamperà Hello World sulla console se c'è qualcosa all'interno di 10 unità del GameObject collegato ad esso:

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

È possibile utilizzare i raycast per verificare se un AI può camminare senza cadere dal bordo di un livello.

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

In questo esempio la direzione è giusta. La variabile raycastRightPart è la parte giusta del personaggio, quindi il raycast avverrà nella parte destra del personaggio. La distanza è 0,6f volte l'altezza del personaggio in modo che il raycast non dia un colpo quando colpisce il terreno che è molto più basso del terreno su cui si trova in quel momento. Assicurati che LayMask sia impostato a terra, altrimenti rileverà anche altri tipi di oggetti.

RaycastHit2D stesso è una struttura e non una classe, quindi hit non può essere nullo; questo significa che devi controllare il collider di una variabile RaycastHit2D.

Incapsulare chiamate Raycast

Avere gli script in modo che chiamino Raycast direttamente può portare a problemi se è necessario cambiare le matrici di collisione in futuro, poiché dovrai tenere traccia di ogni campo di LayerMask per sistemare le modifiche. A seconda delle dimensioni del tuo progetto, questo potrebbe diventare un'impresa enorme.

Incapsulare le chiamate a Raycast può semplificarti la vita.

Guardandolo da un principio SoC , un oggetto di gioco non dovrebbe davvero conoscere o preoccuparsi di LayerMasks. Ha solo bisogno di un metodo per scansionare ciò che lo circonda. Se il risultato di Raycast restituisce questo o quello non dovrebbe importare nell'oggetto di gioco. Dovrebbe agire solo sulle informazioni che riceve e non fare ipotesi sull'ambiente in cui esiste.

Un modo per avvicinarsi a questo è spostare il valore LayerMask in istanze ScriptableObject e utilizzarli come una forma di servizi raycast da iniettare negli script.

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

Ciò consente di creare numerosi servizi raycast, tutti con combinazioni LayerMask diverse per situazioni diverse. Potresti averne uno che colpisce solo i collisori di terra, e un altro che colpisce collisori di terra e piattaforme a senso unico.

Se è necessario apportare modifiche drastiche alle impostazioni di LayerMask, è sufficiente aggiornare queste risorse RaycastService.

Ulteriori letture



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow