通过指定半径和物体的中心位置,画出一个相交球。通过相交球进行检测,如果检测中有搜索到Collider的话,进行位置修复。
先判断相交球的位置是否在碰到的collider里面,如果在里面往物体的位置和向相交球的位置反方向移出。通过ColliderClosestPointOnBounds(Vector3 point)来获取相交球和目标collider应该的接触点,把相交球的中心点往反向移动半径位置。达到相交的位置来阻挡物体穿过
collider.ClosestPointOnBounds(Vector3 point)
只能获取到collider外部的点在collider的bounds上的最接近的位置,如果检测点在collider内部的话,会一直返回检测点。
代码:
Vector3 PointDebug(Vector3 toPos)
{
int layerMask = 1 << LayerMask.NameToLayer(Global.TAG_ABSORB) | 1 << LayerMask.NameToLayer(Global.TAG_GOAL) | 1 << LayerMask.NameToLayer(Global.TAG_SUPPLY) | 1 << LayerMask.NameToLayer("BallNode") | 1<<LayerMask.NameToLayer("Default");
layerMask = ~layerMask;
Vector3 pos = toPos + colliderComp.center;
float radius = colliderComp.radius * transform.localScale.x;
Collider[] colliders = Physics.OverlapSphere(pos, radius, layerMask);
if (colliders.Length <= 0) return toPos;
else
{
Vector3 testPos = toPos;
Collider collider = colliders[0];
bool inCollider = collider.bounds.Contains(testPos);
while (inCollider)
{
Vector3 d = testPos - collider.gameObject.transform.position;
testPos += d.normalized * radius;
inCollider = collider.bounds.Contains(testPos);
}
Vector3 pointOnBound = collider.ClosestPointOnBounds(testPos);
Vector3 dir = pointOnBound - collider.gameObject.transform.position;
dir.y = 0;
Vector3 dis = dir.normalized * radius;
toPos = pointOnBound + dis;
return toPos;
}
}