用户界面-当在Unity C#周围拖动时,对象会变大



当我在某个游戏对象上运行这个脚本时,我遇到了问题,我把它拖来拖去,通过某种方式改变上的z位置,它变得非常大

public class Draggable : MonoBehaviour, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        transform.position = new Vector3(transform.position.x, transform.position.y, 0);
    }
}

之前http://prnt.sc/c2e7t7

之后http://prnt.sc/c2e7wb

例如,即使我将其附加到全新的Image对象,它也总是将其调整为这个精确的Z值-708.4954

更新添加了问题仍然存在的小样本项目:http://s000.tinyupload.com/?file_id=65691163815194240868

这可能是因为在执行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;
}

如果这不能解决问题,那么您正在从另一个代码中修改对象比例或位置,您还应该显示代码的这一部分。根据您的信息,对象实际上并没有使用该代码进行缩放。它正在向相机靠近,使它看起来很大。

编辑

问题中的代码是移动精灵/精灵渲染器的一种方式,而不是移动图像、按钮、RawImage等UI组件。。。。

当您的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;
    }
}

@OP我认为问题可能是你将position.z设置为0,但在你的情况下,position.z在localPosition.z 中等于-708.4954

要进行测试,请调试.Log(position.z(,看看它是否真的为零,或者将localPosition.z设置为零而不是位置。

对于GUI对象,检查器中的位置将始终为localPosition,因为它们是画布的强制子对象。

最新更新