You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

World Space模式下UI拖拽位置与鼠标不对齐问题咨询

World Space模式UI拖拽异常问题修复方案

问题产生原因

  • 坐标体系不匹配:eventData.delta是屏幕空间的像素偏移值,而World Space模式下UI的anchoredPosition是Canvas局部空间的单位值,二者没有固定的scaleFactor对应关系。World Space模式下canvas.scaleFactor恒为1,你代码中先乘后除的操作本质没有实际作用,直接叠加偏移会导致坐标完全错位。
  • 偏移累积误差:基于上一帧anchoredPosition叠加偏移的计算方式,会因为每帧坐标转换的微小误差持续累积,最终出现拖拽元素和鼠标指针位置不同步、漂移的异常效果。

修复方案

直接通过Unity官方提供的坐标转换工具,将指针屏幕坐标转为UI父容器的局部坐标,再做范围限制后赋值,避免手动计算偏移带来的误差,完美适配World Space模式的坐标体系。
修复后代码如下:

// 提前声明变量存储拖拽元素父容器的RectTransform组件
public RectTransform parentRectTrans;

public void OnDrag(PointerEventData eventData)
{
    if (!image.enabled) return;

    // 将屏幕指针坐标转换为父容器局部坐标
    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
        parentRectTrans, 
        eventData.position, 
        eventData.pressEventCamera, 
        out Vector2 localPos))
    {
        // 对转换后的坐标做范围限制
        float newX = Mathf.Clamp(localPos.x, leftSibling.x, rightSibling.x);
        float newY = Mathf.Clamp(localPos.y, 0, height);
        // 直接赋值无需额外缩放计算
        rectTrans.anchoredPosition = new Vector2(newX, newY);
    }
}

注意事项

  • 提前将拖拽元素父容器的RectTransform组件赋值给代码中的parentRectTrans变量
  • 确认World Space Canvas的Event Camera参数已配置为场景中渲染UI的对应相机
  • 原有边界限制参数leftSibling.x、rightSibling.x、height需保持为父容器局部坐标下的数值,和anchoredPosition单位统一

内容的提问来源于stack exchange,提问作者Daarwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:30:01