private static float GetTimeOfImpactPlane(BallBounce bounce, Plane plane)
    {
        Vector3 center         = bounce.transform.position;
        float   distanceBefore = plane.DistanceTo(center - bounce.velocity) - bounce.GetRadius();
        float   distanceAfter  = plane.DistanceTo(center) - bounce.GetRadius();
        float   t = -(distanceBefore * Time.deltaTime) / (distanceAfter - distanceBefore);

        return(t);
    }
    private static void ResolveCollisionPlane(BallBounce bounce, Plane plane)
    {
        Vector3 velocity      = bounce.velocity;
        Vector3 perpendicular = plane.PerpToSurface(velocity);
        Vector3 parallel      = plane.ParallelToSurface(velocity);
        float   timeOfImpact  = SetTimeOfImpactPositionPlane(bounce, plane);
        Vector3 center        = bounce.transform.position;
        float   distance      = plane.DistanceTo(center) - bounce.GetRadius();

        bounce.velocity           = ((parallel * bounce.coefficientOfRestitution) - perpendicular);
        bounce.transform.position = (center + (bounce.velocity * timeOfImpact)) + (distance * perpendicular.normalized);
    }
    private static void CollisionCheckSphere(int currentIndex)
    {
        BallBounce bounce1 = _ballBounces[currentIndex];
        float      radius1 = bounce1.GetRadius();
        Vector3    center1 = bounce1.transform.position;

        for (int i = currentIndex + 1; i < _ballBounces.Length; i++)
        {
            BallBounce bounce2  = _ballBounces[i];
            float      radius2  = bounce2.GetRadius();
            Vector3    center2  = bounce2.transform.position;
            float      distance = (center2 - center1).magnitude - (radius1 + radius2);

            if (distance < CollisionDistance)
            {
                ResolveCollisionSphere(bounce1, bounce2);
            }
        }
    }
    private static void CollisionCheckPlane(int currentIndex)
    {
        BallBounce currentBounce = _ballBounces[currentIndex];

        for (int i = 0; i < _planes.Length; i++)
        {
            Plane currentPlane = _planes[i];
            float distance     = currentPlane.DistanceTo(currentBounce.transform.position) - currentBounce.GetRadius();
            if (distance < CollisionDistance)
            {
                ResolveCollisionPlane(currentBounce, currentPlane);
            }
        }
    }