当我在某个游戏对象上运行这个脚本时,我遇到了问题,我把它拖来拖去,通过某种方式改变上的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,因为它们是画布的强制子对象。