unity3d
Raycast
Buscar..
Parámetros
Parámetro | Detalles |
---|---|
origen | El punto de partida del rayo en coordenadas mundiales. |
dirección | La dirección del rayo. |
distancia maxima | La distancia máxima que el rayo debe verificar para detectar colisiones. |
máscara de capa | Una máscara de capa que se usa para ignorar selectivamente los colisionadores al lanzar un rayo. |
queryTriggerInteraction | Especifica donde esta consulta debe golpear Triggers. |
Física Raycast
Esta función proyecta un rayo desde el origin
del punto en la direction
de la longitud maxDistance
contra todos los colisionadores en la escena.
La función toma la direction
origin
maxDistance
y calcula si hay un colisionador frente al GameObject.
Physics.Raycast(origin, direction, maxDistance);
Por ejemplo, esta función imprimirá Hello World
en la consola si hay algo dentro de las 10 unidades del GameObject
adjunto:
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
Puedes usar raycasts para verificar si un ai puede caminar sin caerse del borde de un nivel.
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
}
}
}
En este ejemplo, la dirección es correcta. La variable raycastRightPart es la parte correcta del personaje, por lo que el raycast ocurrirá en la parte derecha del personaje. La distancia es de 0,6 veces la altura del personaje, por lo que el raycast no dará un impacto cuando toque el suelo que está muy por debajo del suelo en el que se encuentra en este momento. Asegúrese de que Layermask esté configurado solo en el suelo, de lo contrario también detectará otros tipos de objetos.
RaycastHit2D en sí mismo es una estructura y no una clase, por lo que el hit no puede ser nulo; esto significa que debe verificar el colisionador de una variable RaycastHit2D.
Encapsulando llamadas Raycast
Hacer que sus scripts llamen a Raycast
directamente puede ocasionar problemas si necesita cambiar las matrices de colisión en el futuro, ya que tendrá que rastrear cada campo de LayerMask
para adaptarse a los cambios. Dependiendo del tamaño de su proyecto, esto puede convertirse en una gran empresa.
Encapsular Raycast
llamadas de Raycast
puede hacer que tu vida sea más fácil en el futuro.
Mirándolo desde un principio de SoC , un objeto de juego realmente no debería saber o preocuparse por LayerMasks. Solo necesita un método para escanear sus alrededores. Si el resultado de raycast devuelve esto o eso no debería importar al objeto de juego. Solo debe actuar sobre la información que recibe y no hacer suposiciones sobre el entorno en el que existe.
Una forma de abordar esto es mover el valor de LayerMask a las instancias de ScriptableObject y usarlas como una forma de servicios de raycast que inyecta en sus scripts.
// 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);
}
}
Esto le permite realizar una serie de servicios de emisión de rayos, todos con diferentes combinaciones de LayerMask para diferentes situaciones. Podría tener uno que golpee solo colisionadores de tierra, y otro que golpee colisionadores de tierra y plataformas unidireccionales.
Si alguna vez necesita realizar cambios drásticos en sus configuraciones de LayerMask, solo necesita actualizar estos activos RaycastService.