/// <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);
        }