public RandomTranslation Clone()
    {
        RandomTranslation clone = new RandomTranslation();

        clone.transform = transform;
        clone.axis      = axis;
        clone.uniform   = uniform;
        clone.min       = min;
        clone.max       = max;
        return(clone);
    }
    static public RandomTranslation[] CloneArray(RandomTranslation[] sources)
    {
        int len = sources.Length;

        RandomTranslation[] clones = new RandomTranslation[len];

        for (int i = 0; i < len; i++)
        {
            clones[i] = sources[i].Clone();
        }

        return(clones);
    }
    private void RandomizeTranslation()
    {
        int len = translations.Length;

        for (int i = 0; i < len; i++)
        {
            RandomTranslation translationRandomization = translations[i];

            if (defaultToBaseTransform)
            {
                translationRandomization.transform = defaultTransform;
            }

            if (translationRandomization.transform != null)
            {
                Vector3 translation      = new Vector3();
                float   translationValue = Random.Range(translationRandomization.min, translationRandomization.max);
                Axis    axis             = translationRandomization.axis;

                // x
                if (axis == Axis.X || axis == Axis.XZ || axis == Axis.XYZ)
                {
                    translation.x += translationValue;
                }

                // y
                if (!translationRandomization.uniform)
                {
                    translationValue = Random.Range(translationRandomization.min, translationRandomization.max);
                }
                if (axis == Axis.Y || axis == Axis.YZ || axis == Axis.XYZ)
                {
                    translation.y += translationValue;
                }

                // z
                if (!translationRandomization.uniform)
                {
                    translationValue = Random.Range(translationRandomization.min, translationRandomization.max);
                }
                if (axis == Axis.Z || axis == Axis.XZ || axis == Axis.XYZ)
                {
                    translation.z += translationValue;
                }

                Rigidbody rigidBody = translationRandomization.transform.gameObject.GetComponent <Rigidbody>();

                if (rigidBody != null)
                {
                    if (rigidBody.isKinematic)
                    {
                        // the object needs to be non-kinematic such that it can be pushed out of place if overlapping with another object
                        // however, it needs to only be non-kinematic for atleast one frame so Unity's physics code runs and moves the object

                        rigidBody.isKinematic = false;
                        StartCoroutine(ReapplyKinematicRigidbody(rigidBody));
                    }

                    translationRandomization.transform.Translate(translation);
                }
                else
                {
                    translationRandomization.transform.position = translationRandomization.transform.position + translation;
                }
            }
        }
    }