【发布时间】:2020-08-01 17:09:35
【问题描述】:
我想使用 OverlapBox 在车辆前面创建一个框,并能够按需检查碰撞。 我使用 draw gizmo 能够看到框的大小和位置,以确认大小和位置是否正确。
这是我的代码:
public class TestCollision : MonoBehaviour
{
[Header("Collision")]
public Vector3 m_DetectorOffset = Vector3.zero;
public Vector3 m_DetectorSize = Vector3.zero;
private LayerMask m_LayerMask;
private Renderer m_Renderer = null;
void Start()
{
m_LayerMask = (1 << LayerMask.NameToLayer("Pedestrian")) | (1 << LayerMask.NameToLayer("Vehicle"));
m_Renderer = GetComponent<Renderer>();
m_Renderer.material.color = Color.green;
}
private void FixedUpdate()
{
if (CheckForCollisions())
m_Renderer.material.color = Color.red;
else
m_Renderer.material.color = Color.green;
}
public bool CheckForCollisions()
{
Vector3 colliderPos = transform.position + m_DetectorOffset;
Collider[] colliders = Physics.OverlapBox(colliderPos, m_DetectorSize, transform.rotation, m_LayerMask);
if (colliders.Length == 1)
{
// Ignore collision with itself
if (colliders[0].gameObject == gameObject)
return false;
return true;
}
if (colliders.Length > 0)
return true;
return false;
}
#if UNITY_EDITOR
protected virtual void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.matrix = transform.localToWorldMatrix;
Gizmos.DrawWireCube(m_DetectorOffset, m_DetectorSize * 2.0f);
}
#endif
}
如果我不旋转“车辆”,此脚本效果很好 - 在图片中,蓝色立方体是我要检测的对象,绿色/红色立方体是车辆,红色线框框是 OverlapBox 表示小发明:
当“车辆”旋转时会出现问题 - 在下图中,我将车辆沿 Y 轴旋转 90 度,Gizmo 表示盒子在正确的位置,但是 OverlapBox 逻辑忽略了这种旋转(即使当对象的旋转在函数中传递):
如何使 OverlapBox 在考虑到旋转的情况下正常工作并能够表示准确的 Gizmo。
非常感谢。
【问题讨论】:
标签: c# unity3d collision-detection