point1 | 胶囊起始 位置的球体的中心。 |
point2 | 胶囊结束 位置的球体的中心。 |
radius | 胶囊的半径。 |
direction | 扫描胶囊的方向。 |
maxDistance | 扫描的最大长度。 |
layermask | 用于在投射胶囊时选择性地忽略碰撞器的图层蒙版。 |
queryTriggerInteraction | 指定此查询是否应命中触发器。 |
RaycastHit[] 扫描中命中的所有碰撞器的数组。
与Physics.CapsuleCast类似,但此函数将返回胶囊扫描与之相交的所有命中。
将胶囊投射到场景中的所有碰撞器上,并返回有关每个被击中碰撞器的详细信息。胶囊由围绕point1
和point2
的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; } } } }