2d unity 多物体 射线_Unity3D 之射线检测

本文详细介绍了Unity3D中2D射线检测的多种方法,包括Physics.Linecast、Physics.Raycast、Physics.RaycastAll以及Physics.OverlapSphere。这些工具常用于检测跳跃、射击命中等场景,通过实例代码展示了如何获取碰撞信息和控制碰撞层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

主要用到的工具类是:

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, outhit);//可控制投射距离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

{

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 incol)

{

zhuangbei.gameObject.GetComponent().material.color =Color.red;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值