在Unity C周围拖动对象变大

时间:2016-08-06 16:58:13

标签: c# user-interface unity3d

当我在某些游戏对象上运行此脚本时遇到问题我将它拖到它周围以某种方式改变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

2 个答案:

答案 0 :(得分:2)

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

如果这不能解决问题,那么您正在从另一个代码修改对象比例或pos,您也应该显示该部分代码。为了您的信息,Object实际上并没有使用该代码进行扩展。它正在靠近相机,使它看起来很大。

编辑

您的问题中的代码是一种移动Sprites / Sprite渲染器而不是UI组件的方法,如Image,Button,RawImage ....

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

如果你试试这个,你会发现当你点击图像时,图像会跳到点击位置。移动图像时需要添加偏移位置以修复此问题。只需在鼠标按钮关闭时获取鼠标位置即可。使用它在拖动时添加到当前鼠标pos。这可以通过实施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;
    }
}

答案 1 :(得分:0)

@OP 我相信问题可能是你的position.z设置为0但你的case中的position.z等于localPosition.z中的-708.4954

测试,Debug.Log(position.z)以查看它是否实际为零或将localPosition.z设置为零而不是位置。

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