一、單個Image拖拽
using UnityEngine;
using UnityEngine.EventSystems;
public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
? ? private RectTransform rectTransform;
? ? private RectTransform canvasRectTransform;
? ? private Vector2 canvasSize;
? ? void Start()
? ? {
? ? ? ? rectTransform = GetComponent<RectTransform>();
? ? ? ? canvasRectTransform = rectTransform.parent.GetComponent<RectTransform>();
? ? ? ? canvasSize = canvasRectTransform.rect.size;
? ? }
? ? public void OnBeginDrag(PointerEventData eventData)
? ? {
? ? ? ? // 可以記錄開始拖拽時的位置,如果需要的話
? ? }
? ? public void OnDrag(PointerEventData eventData)
? ? {
? ? ? ? // 計算新的位置
? ? ? ? Vector2 newPosition = rectTransform.anchoredPosition + eventData.delta;
? ? ? ? // 獲取Image的尺寸
? ? ? ? Vector2 imageSize = rectTransform.rect.size;
? ? ? ? // 限制拖拽在Canvas范圍內(nèi)
? ? ? ? // 限制x軸
? ? ? ? newPosition.x = Mathf.Clamp(newPosition.x, -canvasSize.x / 2 + imageSize.x / 2, canvasSize.x / 2 - imageSize.x / 2);
? ? ? ? // 限制y軸
? ? ? ? newPosition.y = Mathf.Clamp(newPosition.y, -canvasSize.y / 2 + imageSize.y / 2, canvasSize.y / 2 - imageSize.y / 2);
? ? ? ? // 設(shè)置新的位置
? ? ? ? rectTransform.anchoredPosition = newPosition;
? ? }
? ? public void OnEndDrag(PointerEventData eventData)
? ? {
? ? ? ? // 可以在這里處理拖拽結(jié)束的邏輯
? ? }
}

二、拖拽子Image
using UnityEngine;
using UnityEngine.EventSystems;
public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
? ? public RectTransform smallImageRect; // 小Image的RectTransform
? ? private RectTransform largeImageRect; // 大Image的RectTransform,即腳本所在的RectTransform
? ? private RectTransform canvasRect; // Canvas的RectTransform
? ? void Start()
? ? {
? ? ? ? largeImageRect = GetComponent<RectTransform>();
? ? ? ? canvasRect = largeImageRect.parent as RectTransform; // 假設(shè)大Image直接在Canvas下
? ? }
? ? public void OnBeginDrag(PointerEventData eventData)
? ? {
? ? ? ? // 可以在這里添加開始拖拽的邏輯
? ? }
? ? public void OnDrag(PointerEventData eventData)
? ? {
? ? ? ? // 計算小Image相對于大Image的拖拽增量
? ? ? ? Vector2 delta = eventData.delta / canvasRect.localScale.x; // 考慮Canvas的縮放
? ? ? ? // 更新大Image的位置,使得小Image跟隨拖拽
? ? ? ? Vector2 newPosition = largeImageRect.anchoredPosition + delta;
? ? ? ? largeImageRect.anchoredPosition = ClampPositionToBounds(newPosition);
? ? }
? ? public void OnEndDrag(PointerEventData eventData)
? ? {
? ? ? ? // 可以在這里添加結(jié)束拖拽的邏輯
? ? }
? ? private Vector2 ClampPositionToBounds(Vector2 newPosition)
? ? {
? ? ? ? // 計算大Image的邊界
? ? ? ? Vector2 minPosition = new Vector2(
? ? ? ? ? ? -canvasRect.rect.width / 2 + largeImageRect.rect.width / 2,
? ? ? ? ? ? -canvasRect.rect.height / 2 + largeImageRect.rect.height / 2
? ? ? ? );
? ? ? ? Vector2 maxPosition = new Vector2(
? ? ? ? ? ? canvasRect.rect.width / 2 - largeImageRect.rect.width / 2,
? ? ? ? ? ? canvasRect.rect.height / 2 - largeImageRect.rect.height / 2
? ? ? ? );
? ? ? ? // 限制大Image的位置,確保它不會超出Canvas的范圍
? ? ? ? newPosition.x = Mathf.Clamp(newPosition.x, minPosition.x, maxPosition.x);
? ? ? ? newPosition.y = Mathf.Clamp(newPosition.y, minPosition.y, maxPosition.y);
? ? ? ? return newPosition;
? ? }
}

三、拖拽吸附邊緣
using UnityEngine;
using UnityEngine.EventSystems;
public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
? ? public RectTransform smallImageRect; // 小Image的RectTransform
? ? private RectTransform largeImageRect; // 大Image的RectTransform,即腳本所在的RectTransform
? ? private RectTransform canvasRect; // Canvas的RectTransform
? ? void Start()
? ? {
? ? ? ? largeImageRect = GetComponent<RectTransform>();
? ? ? ? canvasRect = largeImageRect.parent as RectTransform; // 假設(shè)大Image直接在Canvas下
? ? }
? ? public void OnBeginDrag(PointerEventData eventData)
? ? {
? ? ? ? // 可以在這里添加開始拖拽的邏輯
? ? }
? ? public void OnDrag(PointerEventData eventData)
? ? {
? ? ? ? // 計算小Image相對于大Image的拖拽增量
? ? ? ? Vector2 delta = eventData.delta / canvasRect.localScale.x; // 考慮Canvas的縮放
? ? ? ? // 更新大Image的位置,使得小Image跟隨拖拽
? ? ? ? Vector2 newPosition = largeImageRect.anchoredPosition + delta;
? ? ? ? largeImageRect.anchoredPosition = ClampPositionToBounds(newPosition);
? ? }
? ? public void OnEndDrag(PointerEventData eventData)
? ? {
? ? ? ? // 可以在這里添加結(jié)束拖拽的邏輯
? ? ? ? if (largeImageRect.anchoredPosition.x < 0)
? ? ? ? {
? ? ? ? ? ? // 吸附到左側(cè)邊緣
? ? ? ? ? ? largeImageRect.anchoredPosition = new Vector2(-canvasRect.rect.width / 2 + largeImageRect.rect.width / 2, largeImageRect.anchoredPosition.y);
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? // 吸附到右側(cè)邊緣
? ? ? ? ? ? largeImageRect.anchoredPosition = new Vector2(canvasRect.rect.width / 2 - largeImageRect.rect.width / 2, largeImageRect.anchoredPosition.y);
? ? ? ? }
}
? ? private Vector2 ClampPositionToBounds(Vector2 newPosition)
? ? {
? ? ? ? // 計算大Image的邊界
? ? ? ? Vector2 minPosition = new Vector2(
? ? ? ? ? ? -canvasRect.rect.width / 2 + largeImageRect.rect.width / 2,
? ? ? ? ? ? -canvasRect.rect.height / 2 + largeImageRect.rect.height / 2
? ? ? ? );
? ? ? ? Vector2 maxPosition = new Vector2(
? ? ? ? ? ? canvasRect.rect.width / 2 - largeImageRect.rect.width / 2,
? ? ? ? ? ? canvasRect.rect.height / 2 - largeImageRect.rect.height / 2
? ? ? ? );
? ? ? ? // 限制大Image的位置,確保它不會超出Canvas的范圍
? ? ? ? newPosition.x = Mathf.Clamp(newPosition.x, minPosition.x, maxPosition.x);
? ? ? ? newPosition.y = Mathf.Clamp(newPosition.y, minPosition.y, maxPosition.y);
? ? ? ? return newPosition;
? ? }
}
