更新UI拖拽组件 支持鼠标与UI中心点的偏移计算

This commit is contained in:
shenjianxing 2025-02-19 15:05:22 +08:00
parent 45cae04aa6
commit 5012e405ec

View File

@ -7,6 +7,7 @@ public class UIDragItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDr
private RectTransform rectTransform; // UI 图片的 RectTransform private RectTransform rectTransform; // UI 图片的 RectTransform
private CanvasGroup canvasGroup; // CanvasGroup 用于处理拖拽时的透明度 private CanvasGroup canvasGroup; // CanvasGroup 用于处理拖拽时的透明度
private Vector2 startPosition; // 拖拽开始时的初始位置 private Vector2 startPosition; // 拖拽开始时的初始位置
private Vector2 offset; // 鼠标相对于 UI 中心点的偏移量
void Start() void Start()
{ {
@ -27,6 +28,13 @@ public class UIDragItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDr
// 记录初始位置 // 记录初始位置
startPosition = rectTransform.anchoredPosition; startPosition = rectTransform.anchoredPosition;
// 计算鼠标相对于 UI 中心点的偏移量
Vector2 localPoint;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out localPoint))
{
offset = localPoint;
}
// 降低透明度,表示拖拽状态 // 降低透明度,表示拖拽状态
canvasGroup.alpha = 0.6f; canvasGroup.alpha = 0.6f;
@ -37,17 +45,19 @@ public class UIDragItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDr
// 拖拽过程中调用 // 拖拽过程中调用
public void OnDrag(PointerEventData eventData) public void OnDrag(PointerEventData eventData)
{ {
// 将屏幕坐标转换为 UI 坐标 // 将屏幕坐标转换为 UI 父对象的本地坐标
Vector2 screenPoint = eventData.position; Vector2 screenPoint = eventData.position;
RectTransformUtility.ScreenPointToLocalPointInRectangle( Vector2 localPoint;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
rectTransform.parent as RectTransform, // 父对象Canvas 或 Panel rectTransform.parent as RectTransform, // 父对象Canvas 或 Panel
screenPoint, // 屏幕坐标 screenPoint, // 屏幕坐标
eventData.pressEventCamera, // 相机Canvas 的渲染模式决定) eventData.pressEventCamera, // 相机Canvas 的渲染模式决定)
out Vector2 localPoint // 输出的本地坐标 out localPoint // 输出的本地坐标
); ))
{
// 更新 UI 图片的位置 // 根据鼠标位置和偏移量更新 UI 的位置
rectTransform.anchoredPosition = localPoint; rectTransform.anchoredPosition = localPoint - offset;
}
} }
// 结束拖拽时调用 // 结束拖拽时调用