using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; /// /// ͨÓÃÍÏ×§×é¼þ /// public class DragUIItem :MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler { private RectTransform rectTransform; private Canvas canvas; private Vector2 startPosition; private bool restrictToCanvas = true; private LayoutGroup parentLayoutGroup; private void Awake() { rectTransform = GetComponent(); canvas = GetComponentInParent(); startPosition = rectTransform.anchoredPosition; parentLayoutGroup = GetComponentInParent(); } public void OnBeginDrag(PointerEventData eventData) { if (parentLayoutGroup != null) parentLayoutGroup.enabled = false; parentLayoutGroup.GetComponent().enabled = false; } public void OnDrag(PointerEventData eventData) { if (RectTransformUtility.ScreenPointToWorldPointInRectangle( rectTransform, eventData.position, canvas.worldCamera, out Vector3 worldPosition)) { rectTransform.position = worldPosition; if (restrictToCanvas) RestrictToCanvasBounds(); } } public void OnEndDrag(PointerEventData eventData) { parentLayoutGroup.enabled = true; parentLayoutGroup.GetComponent().enabled = true; } private void RestrictToCanvasBounds() { Vector3[] corners = new Vector3[4]; canvas.GetComponent().GetWorldCorners(corners); Vector3 min = corners[0]; Vector3 max = corners[2]; Vector3 pos = rectTransform.position; pos.x = Mathf.Clamp(pos.x, min.x, max.x); pos.y = Mathf.Clamp(pos.y, min.y, max.y); rectTransform.position = pos; } public void ResetPosition() { rectTransform.anchoredPosition = startPosition; } }