unity3d
raycast
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.