Physics.SphereCast() 会发射一种球体射线,
返回Bool值,目的用于检测碰撞。
返回true表示有碰撞,否则没有。
因为Physics.SphereCast()多达11个重载,这里只挑选一个案例讲解:
ThirdPersonCharacter.cs:
void PreventStandingInLowHeadroom()
{
// prevent standing up in crouch-only zones
if (!m_Crouching)
{
Ray crouchRay = new Ray(m_Rigidbody.position + Vector3.up * m_Capsule.radius * k_Half, Vector3.up);
float crouchRayLength = m_CapsuleHeight - m_Capsule.radius * k_Half;
if (Physics.SphereCast(crouchRay, m_Capsule.radius * k_Half, crouchRayLength, Physics.AllLayers, QueryTriggerInteraction.Ignore))
{
m_Crouching = true;
}
}
}
crouchRay 的起点位置,大概是GameObject的胶囊体位置底部高一点的地方,射线方向向上。
crouchRayLength 的大小,是(胶囊体的高度-胶囊体位置底部高一点);
这么一来,就有一个射线从胶囊体的底部高一点的位置,正好射到胶囊体顶部。
Physics.SphereCast(射线, 小球半径, 射线长度, Physics.AllLayers, QueryTriggerInteraction.Ignore)
Physics.DefaultRaycastLayers:除了Ignore Raycast之外的所有层级,这是使用Physics.Raycast时的默认值。
Physics.IgnoreRaycastLayer:Ignore Raycast层。
Physics.AllLayers:所有层级,当在Physics.Raycast中使用这个值时,所有的层包括Ignore Raycast也可以接收射线碰撞
如果射线的起点在碰撞器的内部,则Physics.Raycast会返回false。
QueryTriggerInteraction.Ignore会忽视开启了Is Trigger属性的物体, 而QueryTriggerInteraction.Collide则不会。
补充2点:
(1)RayCast默认是可以Cast到Trigger的,如果要屏蔽掉Trigger,设置最后一个参数为: QueryTriggerInteraction.Ignore
(2)官方给了一个Notes:“Raycasts will not detect Colliders for which the Raycast origin is inside the Collider.”也就是说,如果射线从Collider内部发出,
那么这个Collider会被Ignore掉。
参考文档:
[2] Unity官方文档 - Physics.SphereCast