johnhattan icon

Unity TransformSnapAndLock component

johnhattan | PRO | 01/09/17 02:48:33 PM UTC | 0 ⭐ | 307 👁️ | Never ⏰ | []
C# |

3.1 KB

|

None

|

0 👍

/

0 👎

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