这可能是因为当您执行 transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition); 时 Z 轴正在发生变化,您应该将其存储为临时值,然后将 z 值更改为 0,然后再将其分配回对象的位置。
public void OnDrag(PointerEventData eventData)
{
Vector3 noZValue = Camera.main.ScreenToWorldPoint(Input.mousePosition);
noZValue.z = 0;
transform.position = noZValue;
}
如果这不能解决问题,那么您正在从另一个代码修改对象比例或位置,您还应该显示该部分代码。供您参考,对象实际上并没有使用该代码进行缩放。它越来越靠近相机,使它看起来很大。
编辑:
您问题中的代码是一种移动 Sprites/Sprite Renderer 而不是 UI 组件(如 Image、Button、RawImage....
当您的 UI 画布处于 屏幕空间 - 相机模式时,这应该会移动您的 UI:
public class Draggable : MonoBehaviour, IDragHandler
{
public Canvas parentCanvas;
public void OnDrag(PointerEventData eventData)
{
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out movePos);
transform.position = parentCanvas.transform.TransformPoint(movePos);
}
}
如果你试试这个,你会发现当你点击图片时,图片会跳转到点击的位置。您需要在移动图像时添加偏移位置来解决此问题。只需在鼠标按钮按下时获取鼠标位置。拖动时使用它添加到当前鼠标位置。这可以通过实现IBeginDragHandler 和使用OnBeginDrag 函数来完成。
完整的 UI 图像移动偏移:
public class Draggable : MonoBehaviour, IDragHandler, IBeginDragHandler
{
public Canvas parentCanvas;
Vector3 Offset = Vector3.zero;
public void OnBeginDrag(PointerEventData eventData)
{
Vector2 pos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out pos);
Offset = transform.position - parentCanvas.transform.TransformPoint(pos);
}
public void OnDrag(PointerEventData eventData)
{
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out movePos);
transform.position = parentCanvas.transform.TransformPoint(movePos) + Offset;
}
}