Unity【RaycastHit】- Acerca del uso del vector normal en la información de colisión de raycast

        Cuando detectamos una colisión usando raycasting, podemos obtener la información devuelta por raycasting de RaycastHit, donde la variable normal representa el vector normal a la superficie del objeto en colisión:

using UnityEngine;

public class Example : MonoBehaviour
{
    private void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        bool flag = Physics.Raycast(ray, out RaycastHit hit);
        if (flag)
        {
            //法线信息 
            Debug.Log(hit.normal);
        }
    }
}

Introducción en el Códice de la Unidad:

        Por ejemplo, cuando una bala golpea un objeto, se generará un orificio de bala en la superficie del objeto. La dirección del orificio de bala se puede establecer mediante el vector normal normal. De manera similar, la dirección del efecto de partículas chispeantes generado al golpear el objeto también debe basarse en la información normal para establecer.

        Simulamos el efecto anterior haciendo clic con el mouse y enviamos un rayo desde la posición del mouse para su detección. Cuando se hace clic con el mouse, se generan un agujero de bala y efectos de partículas chisporroteantes en el punto de colisión. El código es el siguiente:

using UnityEngine;
using UnityEditor;

public class Example : MonoBehaviour
{
    [SerializeField] private GameObject decal;
    [SerializeField] private GameObject effect;
    private bool flag;
    private RaycastHit hit;

    private void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        flag = Physics.Raycast(ray, out hit);
        if (flag)
        {
            if (Input.GetMouseButtonDown(0))
            {
                var decalInstance = Instantiate(decal);
                decalInstance.transform.position = hit.point + hit.normal * .02f;
                decalInstance.transform.forward = hit.normal;
                var effectInstance = Instantiate(effect);
                effectInstance.transform.position = hit.point + hit.normal * .02f;
                effectInstance.transform.forward = hit.normal;
            }
        }
    }
    private void OnDrawGizmos()
    {
        Handles.color = Color.cyan;
        if (flag)
        {
            Handles.DrawLine(hit.point, hit.point + hit.normal);
        }   
    }
}

  Bienvenidos a la cuenta pública "Programador Salvaje Contemporáneo"

Supongo que te gusta

Origin blog.csdn.net/qq_42139931/article/details/123292510
Recomendado
Clasificación