using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif [ExecuteInEditMode] public class TransformSnapAndLock : MonoBehaviour { public float SnapX = 1.0f; public bool LockX = false; public float LockXTo = 0.0f; public float SnapY = 1.0f; public bool LockY = false; public float LockYTo = 0.0f; public float SnapZ = 1.0f; public bool LockZ = false; public float LockZTo = 0.0f; #if UNITY_EDITOR void Update() { if(!Application.isPlaying) { Vector3 T = transform.localPosition; if (LockX) T.x = LockXTo; else if(SnapX > 0.0f) { float SnapInverse = 1 / SnapX; T.x = Mathf.Round(transform.localPosition.x * SnapInverse) / SnapInverse; } if(LockY) T.y = LockYTo; else if(SnapY > 0.0f) { float SnapInverse = 1 / SnapY; T.y = Mathf.Round(transform.localPosition.y * SnapInverse) / SnapInverse; } if(LockZ) T.z = LockZTo; else if(SnapZ > 0.0f) { float SnapInverse = 1 / SnapY; T.z = Mathf.Round(transform.localPosition.z * SnapInverse) / SnapInverse; } transform.localPosition = T; } } #endif } #if UNITY_EDITOR [CustomEditor(typeof(TransformSnapAndLock))] public class LevelScriptEditor : Editor { public override void OnInspectorGUI() { TransformSnapAndLock myTarget = (TransformSnapAndLock)target; Color C = GUI.color; GUI.color = new Color(1.0f, 0.5f, 0.5f); myTarget.LockX = EditorGUILayout.BeginToggleGroup("Lock X Position", myTarget.LockX); EditorGUILayout.EndToggleGroup(); GUI.color = C; EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(!myTarget.LockX); myTarget.LockXTo = EditorGUILayout.FloatField("Lock X Position To", myTarget.LockXTo); EditorGUI.EndDisabledGroup(); EditorGUI.BeginDisabledGroup(myTarget.LockX); myTarget.SnapX = EditorGUILayout.FloatField("Snap X Position To", myTarget.SnapX); EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; GUI.color = new Color(0.5f, 1.0f, 0.5f); myTarget.LockY = EditorGUILayout.BeginToggleGroup("Lock Y Position", myTarget.LockY); EditorGUILayout.EndToggleGroup(); GUI.color = C; EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(!myTarget.LockY); myTarget.LockYTo = EditorGUILayout.FloatField("Lock Y Position To", myTarget.LockYTo); EditorGUI.EndDisabledGroup(); EditorGUI.BeginDisabledGroup(myTarget.LockY); myTarget.SnapY = EditorGUILayout.FloatField("Snap Y Position To", myTarget.SnapY); EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; GUI.color = new Color(0.5f, 0.5f, 1.0f); myTarget.LockZ = EditorGUILayout.BeginToggleGroup("Lock Z Position", myTarget.LockZ); EditorGUILayout.EndToggleGroup(); GUI.color = C; EditorGUI.indentLevel++; EditorGUI.BeginDisabledGroup(!myTarget.LockZ); myTarget.LockZTo = EditorGUILayout.FloatField("Lock Z Position To", myTarget.LockZTo); EditorGUI.EndDisabledGroup(); EditorGUI.BeginDisabledGroup(myTarget.LockZ); myTarget.SnapZ = EditorGUILayout.FloatField("Snap Z Position To", myTarget.SnapZ); EditorGUI.EndDisabledGroup(); EditorGUI.indentLevel--; } } #endif