我做了一个函数来预测与 CapsuleCast 的碰撞,因为我的角色正在快速移动并且很多碰撞都没有被 unity 检测到:private bool CheckForwardCollision(Vector3 direction){ RaycastHit hitInfo; float maxDistance = m_DefaultSpeed * Time.deltaTime + m_Capsule.radius; int layer = 1 << LayerMask.NameToLayer("Default"); // Debug CapsuleCast DebugExtension.DebugCapsule(transform.position + (direction * maxDistance), transform.position + (direction * maxDistance) + (Vector3.up * m_Capsule.height), new Color(1, 0, 0), m_Capsule.radius); // Draw last collision point DebugExtension.DrawPoint(debug_hitpoint, Color.cyan); // Get collision with a capsule cast which is in front of character if (Physics.CapsuleCast(transform.position, transform.position + (Vector3.up * m_Capsule.height), m_Capsule.radius, direction, out hitInfo, maxDistance, layer, QueryTriggerInteraction.Ignore)) { debug_hitpoint = hitInfo.point; return true; } return false;}但它会与高于胶囊高度的物体发生碰撞。这是一个示例:您可以看到高于胶囊的生命值。怎么了?谢谢
1 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
经过数小时的研究,我找到了解决方案: Physics.CapsuleCast(point1, point2, ...)并且DebugExtension.DebugCapsule(point1, point2, ...)不是以相同的方式制作的。在 DebugCapsule 上,point1 和 point2 是指向胶囊末端的点,而在 CapsuleCast 上,这些点是曲线部分的起点。所以解决方案是从点 1 和点 2 移除胶囊的半径!
Vector3 point1 = transform.position + Vector3.up * m_Capsule.radius;
Vector3 point2 = transform.position - Vector3.up * m_Capsule.radius + (Vector3.up * m_Capsule.height);
Physics.CapsuleCast(point1, point2, m_Capsule.radius, move, out hitInfo, maxDistance, layer, QueryTriggerInteraction.Ignore)
- 1 回答
- 0 关注
- 76 浏览
添加回答
举报
0/150
提交
取消