Version: 2021.1

Physics.CapsuleCastAll

切换到手册
public static RaycastHit[] CapsuleCastAll (Vector3 point1, Vector3 point2, float radius, Vector3 direction, float maxDistance= Mathf.Infinity, int layerMask= DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction= QueryTriggerInteraction.UseGlobal);

参数

point1 胶囊体在 start 处的球体中心。
point2 胶囊体在 end 处的球体中心。
radius 胶囊体的半径。
direction 扫描胶囊体的方向。
maxDistance 扫描的最大长度。
layermask 层遮罩,用于在投射胶囊体时有选择地忽略碰撞体。
queryTriggerInteraction 指定该查询是否应该命中触发器。

返回

RaycastHit[] 扫描中命中的所有碰撞体的数组。

描述

Physics.CapsuleCast 类似,但该函数将返回胶囊体扫描相交的所有命中对象。

向场景中的所有碰撞体投射胶囊体,并返回有关命中的每个碰撞体的详细信息。 胶囊体由中心位于 point1radius、半径为 radius 的两个球体界定,两个球体构成胶囊体的两个末端。 返回当胶囊体沿 direction 移动时会与其发生碰撞的所有碰撞体。 当射线投射未提供足够的精度时,这很有用。 例如,您可能只想知道某个具有特定大小的对象,比如某个角色,能否在沿途不与任何对象发生碰撞的情况下到达某个地方。

注意:对于在扫描开始时与胶囊体重叠的碰撞体,将 RaycastHit.normal 设置为与扫描方向相反,RaycastHit.distance 设置为零,并在 RaycastHit.point 中返回零向量。您应该检查您的特定查询是否遇到这种情况,并执行其他查询来优化结果。传递零作为半径会导致未定义的输出,其行为并不总是与 Physics.Raycast 相同。

另请参阅:Physics.SphereCastPhysics.CapsuleCastPhysics.RaycastRigidbody.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; } } } }