point1 | 胶囊体在 start 处的球体中心。 |
point2 | 胶囊体在 end 处的球体中心。 |
radius | 胶囊体的半径。 |
direction | 扫描胶囊体的方向。 |
maxDistance | 扫描的最大长度。 |
layermask | 层遮罩,用于在投射胶囊体时有选择地忽略碰撞体。 |
queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
RaycastHit[] 扫描中命中的所有碰撞体的数组。
与 Physics.CapsuleCast 类似,但该函数将返回胶囊体扫描相交的所有命中对象。
向场景中的所有碰撞体投射胶囊体,并返回有关命中的每个碰撞体的详细信息。
胶囊体由中心位于 point1
和 radius
、半径为 radius
的两个球体界定,两个球体构成胶囊体的两个末端。
返回当胶囊体沿 direction
移动时会与其发生碰撞的所有碰撞体。
当射线投射未提供足够的精度时,这很有用。
例如,您可能只想知道某个具有特定大小的对象,比如某个角色,能否在沿途不与任何对象发生碰撞的情况下到达某个地方。
注意:对于在扫描开始时与胶囊体重叠的碰撞体,将 RaycastHit.normal 设置为与扫描方向相反,RaycastHit.distance 设置为零,并在 RaycastHit.point 中返回零向量。您应该检查您的特定查询是否遇到这种情况,并执行其他查询来优化结果。传递零作为半径会导致未定义的输出,其行为并不总是与 Physics.Raycast 相同。
另请参阅:Physics.SphereCast、Physics.CapsuleCast、Physics.Raycast、Rigidbody.SweepTest。
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { void Update() { RaycastHit[] hits; CharacterController charCtrl = GetComponent<CharacterController>(); Vector3 p1 = transform.position + charCtrl.center + Vector3.up * -charCtrl.height * 0.5F; Vector3 p2 = p1 + Vector3.up * charCtrl.height;
// Cast character controller shape 10 meters forward, to see if it is about to hit anything hits = Physics.CapsuleCastAll(p1, p2, charCtrl.radius, transform.forward, 10);
// Change the material of all hit colliders // to use a transparent Shader for (int i = 0; i < hits.Length; i++) { RaycastHit hit = hits[i]; Renderer rend = hit.transform.GetComponent<Renderer>();
if (rend) { rend.material.shader = Shader.Find("Transparent/Diffuse"); Color tempColor = rend.material.color; tempColor.a = 0.3F; rend.material.color = tempColor; } } } }