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.

Otras lecturas



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow