public static Vector3 FindSnapPosition(Vector3 position, Vector3 scale) { var newSnapPosition = Vector3Extensions.Round(10 * position) / (10); var newSnapScale = scale.Round(); if (newSnapScale.x % 1 != 0) { newSnapScale.x -= newSnapScale.x % 1; } if (newSnapScale.y % 1 != 0) { newSnapScale.y -= newSnapScale.y % 1; } if (newSnapScale.z % 1 != 0) { newSnapScale.z -= newSnapScale.z % 1; } position.x = Snap.FindSnapPosition(newSnapPosition.x, newSnapScale.x, position.x); position.y = Snap.FindSnapPosition(newSnapPosition.y, newSnapScale.y, position.y); position.z = Snap.FindSnapPosition(newSnapPosition.z, newSnapScale.z, position.z); return(position); }
public static void SnapToGrid() { var selectedTransforms = Selection.transforms; //iterate through all selected objects and reset their position foreach (var selectedTransform in selectedTransforms) { Undo.RecordObject(selectedTransform, "ResetPosition of " + selectedTransform.name); var newScale = selectedTransform.localScale; newScale = newScale.Round(); newScale.x = Mathf.Abs(newScale.x) < 1 ? Mathf.Sign(newScale.x) : newScale.x; newScale.y = Mathf.Abs(newScale.y) < 1 ? Mathf.Sign(newScale.y) : newScale.y; newScale.z = Mathf.Abs(newScale.z) < 1 ? Mathf.Sign(newScale.z) : newScale.z; selectedTransform.localScale = newScale; selectedTransform.localPosition = Snap.FindSnapPosition(selectedTransform.localPosition, selectedTransform.localScale); EditorUtility.SetDirty(selectedTransform); } }