123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- using System.Linq;
- using UnityEditor.AnimatedValues;
- using UnityEngine;
- using UnityEngine.UI;
-
- namespace UnityEditor.UI
- {
- /// <summary>
- /// Editor class used to edit UI Graphics.
- /// Extend this class to write your own graphic editor.
- /// </summary>
-
- [CustomEditor(typeof(MaskableGraphic), false)]
- [CanEditMultipleObjects]
- public class GraphicEditor : Editor
- {
- protected SerializedProperty m_Script;
- protected SerializedProperty m_Color;
- protected SerializedProperty m_Material;
- protected SerializedProperty m_RaycastTarget;
- protected SerializedProperty m_RaycastPadding;
- protected SerializedProperty m_Maskable;
-
- private GUIContent m_CorrectButtonContent;
- protected AnimBool m_ShowNativeSize;
-
- GUIContent m_PaddingContent;
- GUIContent m_LeftContent;
- GUIContent m_RightContent;
- GUIContent m_TopContent;
- GUIContent m_BottomContent;
- static private bool m_ShowPadding = false;
-
- protected virtual void OnDisable()
- {
- Tools.hidden = false;
- m_ShowNativeSize.valueChanged.RemoveListener(Repaint);
- SceneView.duringSceneGui -= DrawAnchorsOnSceneView;
- }
-
- protected virtual void OnEnable()
- {
- m_CorrectButtonContent = EditorGUIUtility.TrTextContent("Set Native Size", "Sets the size to match the content.");
- m_PaddingContent = EditorGUIUtility.TrTextContent("Raycast Padding");
- m_LeftContent = EditorGUIUtility.TrTextContent("Left");
- m_RightContent = EditorGUIUtility.TrTextContent("Right");
- m_TopContent = EditorGUIUtility.TrTextContent("Top");
- m_BottomContent = EditorGUIUtility.TrTextContent("Bottom");
-
- m_Script = serializedObject.FindProperty("m_Script");
- m_Color = serializedObject.FindProperty("m_Color");
- m_Material = serializedObject.FindProperty("m_Material");
- m_RaycastTarget = serializedObject.FindProperty("m_RaycastTarget");
- m_RaycastPadding = serializedObject.FindProperty("m_RaycastPadding");
- m_Maskable = serializedObject.FindProperty("m_Maskable");
-
- m_ShowNativeSize = new AnimBool(false);
- m_ShowNativeSize.valueChanged.AddListener(Repaint);
-
- SceneView.duringSceneGui += DrawAnchorsOnSceneView;
- }
-
- public override void OnInspectorGUI()
- {
- serializedObject.Update();
- EditorGUILayout.PropertyField(m_Script);
- AppearanceControlsGUI();
- RaycastControlsGUI();
- MaskableControlsGUI();
- serializedObject.ApplyModifiedProperties();
- }
-
- void DrawAnchorsOnSceneView(SceneView sceneView)
- {
- if (!target || targets.Length > 1)
- return;
-
- if (!sceneView.drawGizmos || !EditorGUIUtility.IsGizmosAllowedForObject(target))
- return;
-
- Graphic graphic = target as Graphic;
-
- RectTransform gui = graphic.rectTransform;
- Transform ownSpace = gui.transform;
- Rect rectInOwnSpace = gui.rect;
-
- Handles.color = Handles.UIColliderHandleColor;
- DrawRect(rectInOwnSpace, ownSpace, graphic.raycastPadding);
- }
-
- void DrawRect(Rect rect, Transform space, Vector4 offset)
- {
- Vector3 p0 = space.TransformPoint(new Vector2(rect.x + offset.x, rect.y + offset.y));
- Vector3 p1 = space.TransformPoint(new Vector2(rect.x + offset.x, rect.yMax - offset.w));
- Vector3 p2 = space.TransformPoint(new Vector2(rect.xMax - offset.z, rect.yMax - offset.w));
- Vector3 p3 = space.TransformPoint(new Vector2(rect.xMax - offset.z, rect.y + offset.y));
-
- Handles.DrawLine(p0, p1);
- Handles.DrawLine(p1, p2);
- Handles.DrawLine(p2, p3);
- Handles.DrawLine(p3, p0);
- }
-
- /// <summary>
- /// Set if the 'Set Native Size' button should be visible for this editor.
- /// </summary>
- /// <param name="show">Are we showing or hiding the AnimBool for the size.</param>
- /// <param name="instant">Should the size AnimBool change instantly.</param>
- protected void SetShowNativeSize(bool show, bool instant)
- {
- if (instant)
- m_ShowNativeSize.value = show;
- else
- m_ShowNativeSize.target = show;
- }
-
- /// <summary>
- /// GUI for showing a button that sets the size of the RectTransform to the native size for this Graphic.
- /// </summary>
- protected void NativeSizeButtonGUI()
- {
- if (EditorGUILayout.BeginFadeGroup(m_ShowNativeSize.faded))
- {
- EditorGUILayout.BeginHorizontal();
- {
- GUILayout.Space(EditorGUIUtility.labelWidth);
- if (GUILayout.Button(m_CorrectButtonContent, EditorStyles.miniButton))
- {
- foreach (Graphic graphic in targets.Select(obj => obj as Graphic))
- {
- Undo.RecordObject(graphic.rectTransform, "Set Native Size");
- graphic.SetNativeSize();
- EditorUtility.SetDirty(graphic);
- }
- }
- }
- EditorGUILayout.EndHorizontal();
- }
- EditorGUILayout.EndFadeGroup();
- }
-
- protected void MaskableControlsGUI()
- {
- EditorGUILayout.PropertyField(m_Maskable);
- }
-
- /// <summary>
- /// GUI related to the appearance of the Graphic. Color and Material properties appear here.
- /// </summary>
- protected void AppearanceControlsGUI()
- {
- EditorGUILayout.PropertyField(m_Color);
- EditorGUILayout.PropertyField(m_Material);
- }
-
- /// <summary>
- /// GUI related to the Raycasting settings for the graphic.
- /// </summary>
- protected void RaycastControlsGUI()
- {
- EditorGUI.BeginChangeCheck();
- EditorGUILayout.PropertyField(m_RaycastTarget);
- if (EditorGUI.EndChangeCheck() && target is Graphic graphic)
- {
- graphic.SetRaycastDirty();
- }
-
- float height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- if (m_ShowPadding)
- height += (EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing) * 4;
-
- var rect = EditorGUILayout.GetControlRect(true, height);
- EditorGUI.BeginProperty(rect, m_PaddingContent, m_RaycastPadding);
- rect.height = EditorGUIUtility.singleLineHeight;
-
- using (var check = new EditorGUI.ChangeCheckScope())
- {
- m_ShowPadding = EditorGUI.Foldout(rect, m_ShowPadding, m_PaddingContent, true);
- if (check.changed)
- {
- SceneView.RepaintAll();
- }
- }
-
- if (m_ShowPadding)
- {
- using (var check = new EditorGUI.ChangeCheckScope())
- {
- EditorGUI.indentLevel++;
- Vector4 newPadding = m_RaycastPadding.vector4Value;
-
- rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- newPadding.x = EditorGUI.FloatField(rect, m_LeftContent, newPadding.x);
-
- rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- newPadding.y = EditorGUI.FloatField(rect, m_BottomContent, newPadding.y);
-
- rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- newPadding.z = EditorGUI.FloatField(rect, m_RightContent, newPadding.z);
-
- rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- newPadding.w = EditorGUI.FloatField(rect, m_TopContent, newPadding.w);
-
- if (check.changed)
- {
- m_RaycastPadding.vector4Value = newPadding;
- }
- EditorGUI.indentLevel--;
- }
- }
-
- EditorGUI.EndProperty();
- }
- }
- }
|