射线检测

public class L15 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //射线检测
        //鼠标选择场景上的某一物体
        //FPS射击游戏(无弹道,不产生实际的子弹进行移动)

        //射线对象
        //3D世界中的射线
        //假设有一条起点坐标为(1,0,0),方向为直接坐标Z轴正方向的射线
        //参数一 起点
        //参数二 方向

        //申明一个射线对象
        Ray r = new Ray(Vector3.right,Vector3.forward);
        //Ray中的参数
        print(r.origin);//起点
        print(r.direction);//方向

        //摄像机发射出的射线
        //得到一条从屏幕位置作为起点,以摄像机视角方向为方向的射线
        Ray r2 = Camera.main.ScreenPointToRay(Input.mousePosition);

        //射线碰撞检测函数
        //射线检测也是瞬时的,执行代码时进行一次射线检测

        //最原始的射线检测
        Ray r3 = new Ray(Vector3.zero,Vector3.forward);
        //参数一 射线
        //参数二 检测的最大距离,超过这个距离不检测
        //参数三 检测指定层级
        //参数四 是否忽略触发器
        //返回值 bool,如果碰撞到对象返回true,如果没有返回false
        if(Physics.Raycast(r3, 1000,1<< LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal))
        {
            print("hit");
        }
        //有一种重载不用直接传入射线,而是传入射线的起点和方向
        if (Physics.Raycast(Vector3.zero, Vector3.forward, 1000, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal))
        {
            print("hit");
        }

        //获取相交的单个物体信息
        RaycastHit hitInfo;
        //RaycastHit是结构体,是值类型,Unity会通过out在函数内部处理过后得到碰撞信息返回到该参数中
        if(Physics.Raycast(r3,out hitInfo,1000, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal))
        {
            //碰撞器信息
            print(hitInfo.collider.gameObject.name);
            //碰撞到的点
            print(hitInfo.point);
            //法线信息
            print(hitInfo.normal);
            //得到碰撞到的对象的位置
            print(hitInfo.transform.position);
            //得到碰撞到的对象距离自己的距离
            print(hitInfo.distance);
        }

        //获取相交的多个对象
        //可以得到碰撞到的多个对象,如果没有碰撞到就是容量为0的数组
        RaycastHit[] hits = Physics.RaycastAll(r3,1000,1<<LayerMask.NameToLayer("Default"),QueryTriggerInteraction.UseGlobal);

        //还有一种返回值是碰撞的数量 通过out得到数据
        if(Physics.RaycastNonAlloc(r3, hits, 1000, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal)>0)
        {

        }
        
    }
}
posted @ 2025-03-22 15:23  cannedmint  阅读(45)  评论(0)    收藏  举报