Skip to content

Instantly share code, notes, and snippets.

@brovador
Last active April 22, 2018 08:41
Show Gist options
  • Save brovador/1d36462dc7131b9058b54345be2550d8 to your computer and use it in GitHub Desktop.
Save brovador/1d36462dc7131b9058b54345be2550d8 to your computer and use it in GitHub Desktop.
Unity-TransformInspector adding reset button for each property
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
// Reverse engineered UnityEditor.TransformInspector
[CanEditMultipleObjects, CustomEditor(typeof(Transform))]
public class TransformInspector : Editor {
private const float FIELD_WIDTH = 300.0f;
private const bool WIDE_MODE = true;
private const float POSITION_MAX = 100000.0f;
private static GUIContent positionGUIContent = new GUIContent(LocalString("")
,LocalString("The local position of this Game Object relative to the parent."));
private static GUIContent rotationGUIContent = new GUIContent(LocalString("")
,LocalString("The local rotation of this Game Object relative to the parent."));
private static GUIContent scaleGUIContent = new GUIContent(LocalString("")
,LocalString("The local scaling of this Game Object relative to the parent."));
private static string positionWarningText = LocalString("Due to floating-point precision limitations, it is recommended to bring the world coordinates of the GameObject within a smaller range.");
private SerializedProperty positionProperty;
private SerializedProperty rotationProperty;
private SerializedProperty scaleProperty;
private static string LocalString(string text) {
return text;
}
public void OnEnable() {
this.positionProperty = this.serializedObject.FindProperty("m_LocalPosition");
this.rotationProperty = this.serializedObject.FindProperty("m_LocalRotation");
this.scaleProperty = this.serializedObject.FindProperty("m_LocalScale");
}
public override void OnInspectorGUI() {
EditorGUIUtility.wideMode = TransformInspector.WIDE_MODE;
EditorGUIUtility.labelWidth = 50; //EditorGUIUtility.currentViewWidth - TransformInspector.FIELD_WIDTH; // align field to right of inspector
this.serializedObject.Update();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("P", GUILayout.Width(20))) {
this.positionProperty.vector3Value = Vector3.zero;
}
EditorGUILayout.PropertyField(this.positionProperty, positionGUIContent);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("R", GUILayout.Width(20))) {
this.rotationProperty.quaternionValue = Quaternion.identity;
}
this.RotationPropertyField( this.rotationProperty, rotationGUIContent);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("S", GUILayout.Width(20))) {
this.scaleProperty.vector3Value = Vector3.one;
}
EditorGUILayout.PropertyField(this.scaleProperty, scaleGUIContent);
EditorGUILayout.EndHorizontal();
if (!ValidatePosition(((Transform) this.target).position)) {
EditorGUILayout.HelpBox(positionWarningText, MessageType.Warning);
}
this.serializedObject.ApplyModifiedProperties();
}
private bool ValidatePosition(Vector3 position) {
if (Mathf.Abs(position.x) > TransformInspector.POSITION_MAX) return false;
if (Mathf.Abs(position.y) > TransformInspector.POSITION_MAX) return false;
if (Mathf.Abs(position.z) > TransformInspector.POSITION_MAX) return false;
return true;
}
private void RotationPropertyField(SerializedProperty rotationProperty, GUIContent content) {
Transform transform = (Transform) this.targets[0];
Quaternion localRotation = transform.localRotation;
foreach (UnityEngine.Object t in (UnityEngine.Object[]) this.targets) {
if (!SameRotation(localRotation, ((Transform) t).localRotation)) {
EditorGUI.showMixedValue = true;
break;
}
}
EditorGUI.BeginChangeCheck();
Vector3 eulerAngles = EditorGUILayout.Vector3Field(content, localRotation.eulerAngles);
if (EditorGUI.EndChangeCheck()) {
Undo.RecordObjects(this.targets, "Rotation Changed");
foreach (UnityEngine.Object obj in this.targets) {
Transform t = (Transform) obj;
t.localEulerAngles = eulerAngles;
}
rotationProperty.serializedObject.SetIsDifferentCacheDirty();
}
EditorGUI.showMixedValue = false;
}
private bool SameRotation(Quaternion rot1, Quaternion rot2) {
if (rot1.x != rot2.x) return false;
if (rot1.y != rot2.y) return false;
if (rot1.z != rot2.z) return false;
if (rot1.w != rot2.w) return false;
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment