2016-08-06 21 views
1

我有问题时,我的一些游戏物体运行此脚本,我拖动它周围变得非常大通过某种方式改变的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

这是因为当你做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机,你应该也显示的代码部分。对于您的信息,该对象实际上并没有用该代码进行缩放。它靠近相机,看起来很大。

编辑

在你的问题中的代码是移动精灵/雪碧渲染不UI组件,如图像,按钮,RawImage的方式....

这应该将你的UI时你的UI Canvas是在屏幕空间 - 相机模式:

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; 
    } 
} 
+0

什么都不改变对象的比例或位置,因为我刚刚创建了一个全新的统一项目,添加了一个简单的'Image'对象,并且只添加了这个脚本,而且它完成了同样的事情。如果它很重要,那就是我的画布http://prntscr.com/c2eiz3 – GeekCodingMaster

+0

您是否在我的答案中尝试了代码? – Programmer

+0

是的它现在运行你的代码不是我的。 – GeekCodingMaster

0

@OP 我相信问题可能是您的设置position.z为0,但position.z你的情况在localPosition.z

等于-708.4954

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

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