Unity中Physics.Raycast 的使用

Physics.Raycast 简介    ▼

Physics.Raycast 官方文档中提供的参数如下  

 Physics.Raycast 从指定的位置发射一条射线,如果射线与物体发生碰撞返回true否则返回false

其中射线的起点,方向是不可以省略的,其他参数可以省略

案例▼

  • 第1,2个参数定义了一条射线的起点与方向
  • 第3个参数为RaycastHi用以从射线获取参数
    RaycastHit hit;
    void Update()
    {
        //如果检测到物体
        if (Physics.Raycast(transform.position, transform.forward, out hit))
        {
             Debug.Log(hit.collider);//命中的 Collider。
            //打印一条从物体到碰撞点的红色射线,hit.point世界空间中射线命中碰撞体的撞击点
            Debug.DrawLine(transform.position, hit.point, Color.red);
        }
        else //没有检测到物体
        {
            //打印一条从物体出发的黄色射线
            Debug.DrawRay(transform.position, transform.position + transform.forward * 100, Color.yellow);
        }
    }

运行效果如下 可以看到射线与其他物体碰撞变成红色 ▼ 

也可以直接定义一条射线ray替换1,2条参数。下面的代码与上面的代码功能相同

    Ray ray;
    RaycastHit hit;
    void Update()
    {
        ray = new Ray(transform.position, transform.forward);
        //如果检测到物体
        if (Physics.Raycast(ray, out hit))
        {
             Debug.Log(hit.collider);//输出命中的 Collider。
            //打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
             Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
        }
        else //没有检测到物体
        {
            Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
        }
    }

给射线设置一个检测距离之后,射线距离之外的物体不会发生碰撞

 Physics.Raycast(ray, out hit,3)(可以看到射线碰撞到第一个方块之后变为红色,碰撞到第二个方块后没有改变,这是因为第二个方块超出了射线检测范围)▼

 给Physics.Raycast设置一个遮罩参数之后可以有选择的忽略碰撞体。

(Physics.Raycast(ray, out hit, 10, mask)

这里我们给正方体Layer设置为Default,球形Layer设置为Sphere。之后选定Mask为Sphere

    Ray ray;
    RaycastHit hit;
    public LayerMask mask;
    void Update()
    {
        ray = new Ray(transform.position, transform.forward);
        //如果检测到物体 
        if (Physics.Raycast(ray, out hit, 10, mask))
        {
            Debug.Log(hit.collider);//输出命中的 Collider。
            //打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
            Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
        }
        else //没有检测到物体
        {Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
        }
    }

 运行效果如下,射线在接触到正方体是没有发生改变,接触到球形时变为红色▼

为Physics.Raycast设置一个QueryTriggerInteraction.Ignore参数之后,射线不在检测触发器

 ▼操作如下▼

为红色方块选择Is Triggr属性。蓝色方块不选。

  •  QueryTriggerInteraction.Collide 检测触发器
  •  QueryTriggerInteraction.Ignore 不检测触发器
     Ray ray;
    RaycastHit hit;
    public LayerMask mask;
    void Update()
    {
        ray = new Ray(transform.position, transform.forward);
        //如果检测到物体  
        //QueryTriggerInteraction.Collide 检测触发器
        //QueryTriggerInteraction.Ignore 不检测触发器
        if (Physics.Raycast(ray, out hit, 10, mask, QueryTriggerInteraction.Ignore))
        {
            Debug.Log(hit.collider);//输出命中的 Collider。
            //打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
            Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
        }
        else //没有检测到物体
        {
            Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
        }
    }

运行效果如下▼ (射线碰撞到红色方块时没有发生改变,碰撞到蓝色方块变为红色)

Physics.Raycast 的使用   ▼

  • 配合寻路导航系统,做移动到鼠标点击位置功能

---Unity中寻路导航的基本使用

        using UnityEngine;
        using UnityEngine.AI;
    
        public class MoveToClickPoint : MonoBehaviour {
            NavMeshAgent agent;
        
            void Start() {
                agent = GetComponent<NavMeshAgent>();
            }
        
            void Update() {
                if (Input.GetMouseButtonDown(0)) {
                    RaycastHit hit;
                
                    if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
                        agent.destination = hit.point;
                    }
                }
            }
        } 
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cxy15978

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值