2025-03-10 10:18:11 +08:00

81 lines
2.5 KiB
C#

using UnityEngine;
//using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace Crosstales.UI
{
/// <summary>Resize a UI element.</summary>
public class UIResize : MonoBehaviour, IPointerDownHandler, IDragHandler
{
#region Variables
/// <summary>Minimum size of the UI element.</summary>
[Tooltip("Minimum size of the UI element.")] public Vector2 MinSize = new Vector2(300, 160);
/// <summary>Maximum size of the UI element.</summary>
[Tooltip("Maximum size of the UI element.")] public Vector2 MaxSize = new Vector2(800, 600);
private RectTransform panelRectTransform;
private Vector2 originalLocalPointerPosition;
private Vector2 originalSizeDelta;
private Vector2 originalSize;
#endregion
#region MonoBehaviour methods
private void Awake()
{
panelRectTransform = transform.parent.GetComponent<RectTransform>();
Rect rect = panelRectTransform.rect;
originalSize = new Vector2(rect.width, rect.height);
}
#endregion
#region Implemented methods
public void OnPointerDown(PointerEventData data)
{
originalSizeDelta = panelRectTransform.sizeDelta;
RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);
}
public void OnDrag(PointerEventData data)
{
if (panelRectTransform == null)
return;
RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out Vector2 localPointerPosition);
Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
Vector2 sizeDelta = originalSizeDelta + new Vector2(offsetToOriginal.x, -offsetToOriginal.y);
if (originalSize.x + sizeDelta.x < MinSize.x)
{
sizeDelta.x = -(originalSize.x - MinSize.x);
}
else if (originalSize.x + sizeDelta.x > MaxSize.x)
{
sizeDelta.x = MaxSize.x - originalSize.x;
}
if (originalSize.y + sizeDelta.y < MinSize.y)
{
sizeDelta.y = -(originalSize.y - MinSize.y);
}
else if (originalSize.y + sizeDelta.y > MaxSize.y)
{
sizeDelta.y = MaxSize.y - originalSize.y;
}
panelRectTransform.sizeDelta = sizeDelta;
}
#endregion
}
}
// © 2018-2020 crosstales LLC (https://www.crosstales.com)