/// <summary> /// 计算和周边碰撞体移动多少距离才能脱离碰撞,会包含自身,建议将自身加入到ignoreSet中 /// </summary> /// <param name="self"></param> /// <param name="detectLayer">检测的层</param> /// <param name="cache"></param> /// <param name="ignoreSet">需要忽视的碰撞体集合</param> /// <param name="currentPosition"></param> /// <returns></returns> private static Vector3 ComputeCurrent(this SphereCollider self, int detectLayer, Collider[] cache, HashSet <Collider> ignoreSet = null, Vector3?currentPosition = null) { if (self.isTrigger) { return(Vector3.zero); } var ans = Vector3.zero; var count = self.GetOverlapNoAlloc(detectLayer, cache, currentPosition); for (var i = 0; i < count; i++) { var other = cache[i]; if (other.isTrigger) { continue; } if (ignoreSet != null && ignoreSet.Contains(other)) { continue; } if (Physics.ComputePenetration( self, currentPosition ?? self.transform.position, self.transform.rotation, other, other.transform.position, other.transform.rotation, out var dir, out var distance)) { ans += dir.normalized * distance; } } return(ans); }