- Home /
Question by
EDartBlade · Jul 24, 2020 at 02:20 PM ·
editor-scriptingcomponents
How do you edit default components?
If possible, how do you edit default unity-made components, like the Transform component.
If you want to know, I'd like to add a custom property to the Transform component in unity, which would return the game object's position as a Vector2 for my 2D game.
Comment
Answer by smark12007 · Jul 24, 2020 at 06:21 PM
https://wiki.unity3d.com/index.php/TransformInspector
This just looks like the default one.
[CanEditMultipleObjects, CustomEditor(typeof(Transform))]
public class TransformInspector : Editor {
private const float FIELD_WIDTH = 212.0f;
private const bool WIDE_MODE = true;
private const float POSITION_MAX = 100000.0f;
private static GUIContent positionGUIContent = new GUIContent(LocalString("Position")
,LocalString("The local position of this Game Object relative to the parent."));
private static GUIContent rotationGUIContent = new GUIContent(LocalString("Rotation")
,LocalString("The local rotation of this Game Object relative to the parent."));
private static GUIContent scaleGUIContent = new GUIContent(LocalString("Scale")
,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 LocalizationDatabase.GetLocalizedString(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 = EditorGUIUtility.currentViewWidth - TransformInspector.FIELD_WIDTH; // align field to right of inspector
this.serializedObject.Update();
EditorGUILayout.PropertyField(this.positionProperty, positionGUIContent);
this.RotationPropertyField( this.rotationProperty, rotationGUIContent);
EditorGUILayout.PropertyField(this.scaleProperty, scaleGUIContent);
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;
}
}
Modify the method, OnInspectorGUI, to approach whatever you need. Maybe you'll need to call EditorGUILayout.Vector2Field() on your own.