using UnityEngine; //using UnityEngine.UI; using UnityEngine.EventSystems; namespace Crosstales.UI { /// Resize a UI element. public class UIResize : MonoBehaviour, IPointerDownHandler, IDragHandler { #region Variables /// Minimum size of the UI element. [Tooltip("Minimum size of the UI element.")] public Vector2 MinSize = new Vector2(300, 160); /// Maximum size of the UI element. [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(); 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)