Unity3D 之射线检测

这里来记录下射线检测的相关内容:

射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真。

射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候可以跳起。

        射击游戏中可以通过定长射线去判断目标物体是否被击中,等

主要用到的工具类是:

Physics

RaycastHit 光线投射碰撞

Ray 射线

第一种是:

Physics.Linecast 线性投射

从开始位置到结束位置做一个光线投射,如果与碰撞体交互,返回真。

        Debug.DrawLine(transform.position, Line_floor.position, Color.red, 1f);
        bool grounded  = Physics.Linecast(transform.position, Line_floor.position, 1 << LayerMask.NameToLayer("Ground"));

复制代码

        if (grounded)
        {
            Debug.LogError("发生了碰撞");   
  
        }
        else {
            Debug.LogError("碰撞结束");
        }

复制代码

第二种:

在场景中投下可与所有碰撞器碰撞的一条光线。可控制投射方向和投射长度

 Vector3 fwd = transform.TransformDirection(-Vector3.up);
  bool grounded =  Physics.Raycast(transform.position,fwd, 10 );

复制代码

        if (grounded)
        {
            Debug.LogError("发生了碰撞");   
  
        }
        else {
            Debug.LogError("碰撞结束");
        }

复制代码

第三种:

在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息。

复制代码

    RaycastHit hit;
         bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit);
         // 可控制投射距离bool grounded = Physics.Raycast(transform.position, -Vector3.up, out hit,100.0);
        if (grounded)
        {
            Debug.LogError("发生了碰撞");
            Debug.LogError("距离是:" + hit.distance);
            Debug.LogError("被碰撞的物体是:" + hit.collider.gameObject.name);
  
        }
        else {
            Debug.LogError("碰撞结束");
        }

复制代码

注意,这里返回的碰撞器的信息是依次的,先返回第一个碰撞的,第一个碰撞结束后才返回第二个。

第四种:

Physics.RaycastAll 所有光线投射

投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

复制代码

        RaycastHit[] hits;
        hits = Physics.RaycastAll(transform.position, -Vector3.up, 100.0F);
        int i = 0;

        while (i < hits.Length)
        {
            Debug.LogError("发生了碰撞");
            RaycastHit hit = hits[i];
            Debug.LogError("被碰撞的物体是:" + hit.collider.gameObject.name);
            i++;
        }

复制代码

 第五种:

控制碰撞的层,可以设置射线的长度,并且用debug查看射线的长度。

使用层的时候,要注意,要给别的对象也附上层的名字,不能用缺省,会出问题。

复制代码

          RaycastHit hit;
         // Debug.DrawLine()
          bool grounded = Physics.Raycast(transform.position, transform.up, out hit, 10000f, 1 << LayerMask.NameToLayer("Diren"));
          Debug.DrawRay(transform.position, transform.up * 10000f, Color.red);
          if (grounded)
         {
             Debug.LogError("发生了碰撞");
             Debug.LogError("距离是:" + hit.distance);
             Debug.LogError("被碰撞的物体是:" + hit.collider.gameObject.name);
  
         }
         else {
             Debug.LogError("碰撞结束");
         } 

复制代码

第五种:

Physics.OverlapSphere 相交球

返回球型半径之内(包括半径)的所有碰撞体 collider[]。可用于拾取物品用。

复制代码

   Collider[] col =  Physics.OverlapSphere(transform.position,1f, 1 << LayerMask.NameToLayer("zhuangbei"));
        if (col.Length > 0)
        {
            foreach (Collider zhuangbei in col)
            {
                zhuangbei.gameObject.GetComponent<Renderer>().material.color = Color.red;
            }
        }

复制代码

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值