215 lines
8.3 KiB
215 lines
8.3 KiB
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(); |
|
} |
|
} |
|
}
|
|
|