public static void Translate(this TransformSelection selection, Vector3 translation)
 {
     for (var t = 0; t < selection.Transforms.Length; t++)
     {
         selection.Transforms[t].position = GridUtility.CleanPosition(selection.BackupPositions[t] + translation);
     }
 }
        public static void Rotate(this TransformSelection selection, Vector3 rotationCenter, Vector3 rotationAxis, float rotationAngle)
        {
            var rotationQuaternion = Quaternion.AngleAxis(rotationAngle, rotationAxis);

            if (Mathf.Abs(rotationAngle) < MathConstants.EqualityEpsilon)
            {
                for (var t = 0; t < selection.Transforms.Length; t++)
                {
                    var targetTransform = selection.Transforms[t];
                    targetTransform.position = selection.BackupPositions[t];
                    targetTransform.rotation = selection.BackupRotations[t];
                }
            }
            else
            {
                for (var t = 0; t < selection.Transforms.Length; t++)
                {
                    var targetTransform = selection.Transforms[t];
                    var originalCenter  = targetTransform.InverseTransformPoint(rotationCenter);
                    targetTransform.position = selection.BackupPositions[t];
                    targetTransform.rotation = rotationQuaternion * selection.BackupRotations[t];
                    var newCenter = targetTransform.TransformPoint(originalCenter);
                    targetTransform.position += rotationCenter - newCenter;
                }
            }
        }