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
Comments