Unity碰撞检测:射线与胶囊体投射/Layer(层)、LayerMask(遮罩层)
一、Physics
碰撞检测
1.Physics.Raycast
射线投射
Physics.Raycast
是 Unity 中用于执行射线检测(Raycasting)的方法。它允许你从一个点沿特定方向发射一条无形的“射线”,并检查这条射线是否与场景中的任何碰撞体相交。这个功能非常有用,可以用来检测玩家前方是否有障碍物、确定点击位置的对象等。
使用场景:用于检测射线是否与场景中的物体发生碰撞
触发条件:通过发射一条射线来检测碰撞
参数:参数包括射线的起点、方向、最大距离、层掩码等
bool hit = Physics.Raycast(transform.position, transform.forward, out RaycastHit hitInfo, 100f);
if (hit) {Debug.Log("Ray hit: " + hitInfo.collider.gameObject.name);
}
2.Physics.
CapsuleCast胶囊体投射
Physics.CapsuleCast
是 Unity 中用于执行胶囊体投射(Capsule Cast)的方法。与 Raycast
类似,但它基于胶囊形状而非直线,这使得它非常适合用于检测具有类似胶囊形状的对象(如大多数游戏角色使用的碰撞体)在移动时是否会遇到障碍物。
使用场景: 用于检测一个胶囊体形状的射线是否与场景中的物体发生碰撞
触发条件: 通过发射一个胶囊体形状的射线来检测碰撞
参数: 参数包括起点、方向、胶囊体的半径、高度、最大距离、层掩码等
bool hit = Physics.CapsuleCast(transform.position, transform.position + Vector3.up * 2f, 1f, transform.forward, out RaycastHit hitInfo, 100f);
if (hit) {Debug.Log("CapsuleCast hit: " + hitInfo.collider.gameObject.name);
}
二、Layer(层)、LayerMask(遮罩层)
Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些collder或Collision使用
Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)
在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!
1,layer层查看与创建
任意选择场景中的一个GameObject即可查看该GameObject所在的层
点击 Add Layer...(前面的序号是所在层序号)
在可以编辑的地方取个一个层名即可
新建的 layer 就会显示在层中
2.LayerMask 的介绍和使用
LayerMask 实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。
Unity 中的使用:
LayerMask mask = 1 << 3;表示开启Layer3。
LayerMask mask = 0 << 8;表示关闭Layer8。
LayerMask mask = 1<<1|1<<9;表示开启Layer1和Layer9。
LayerMask mask = 0<<4|0<<5;表示关闭Layer4和Layer5。
LayerMask mask = ~(1 << 0) 打开所有的层。
LayerMask mask = ~(1 << 9) 打开除了第9之外的层。
//LayerMask 的使用(Physics.Raycast)[SerializeField] private LayerMask ClearCounterLayerMask;float interactDictance = 2.0f;if (Physics.Raycast(transform.position, lastInteractDir, out RaycastHit raycastHit, interactDictance, ClearCounterLayerMask))
{if (raycastHit.transform.TryGetComponent(out ClearCounter clearCounter)){clearCounter.Interact();}
}