EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

[Unity]Physics.SphereCast相关问题汇总

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掉。

 

 

参考文档:

[1] SphereCast和SphereCastAll

[2] Unity官方文档 - Physics.SphereCast

[3] Physics.SphereCast 球体投射

[4] Unity官方文档 - Physics.AllLayers

[5] Unity 射线碰撞

[6] Unity RayCast容易忽视的地方

This article was last edited at 2020-04-08 10:50:34

* *