You can't assign Input.mousePosition;
直接到 UI 转换。你必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle将鼠标位置和 Canvas 转换为 UI 可以理解的适当位置。
之后,您使用Canvas.transform.TransformPoint(result)
获取应分配给 UI/面板位置的鼠标的最终位置。
该代码应该如下所示:
public Canvas parentCanvas;
public void Start()
{
Vector2 pos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
parentCanvas.transform as RectTransform, Input.mousePosition,
parentCanvas.worldCamera,
out pos);
}
public void Update()
{
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
parentCanvas.transform as RectTransform,
Input.mousePosition, parentCanvas.worldCamera,
out movePos);
transform.position = parentCanvas.transform.TransformPoint(movePos);
}
确保将 Canvas 分配给parentCanvas 插槽。
EDIT:
对于您问题中的原始图像,我认为您正在移动的用户界面始终位于光标一侧。在链接视频之后,我刚刚意识到问题是当对象移动到光标位置时存在延迟。
这是Unity的问题。 Unity 目前正在重新设计输入系统来解决此问题。当前的解决方法是禁用光标Cursor.visible = false;
然后使用另一个带有光标图标的图像作为光标。
在线找到好的光标并将其从编辑器分配给鼠标光标槽纹理。
public Canvas parentCanvas;
public RawImage mouseCursor;
public void Start()
{
Cursor.visible = false;
}
public void Update()
{
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
parentCanvas.transform as RectTransform,
Input.mousePosition, parentCanvas.worldCamera,
out movePos);
Vector3 mousePos = parentCanvas.transform.TransformPoint(movePos);
//Set fake mouse Cursor
mouseCursor.transform.position = mousePos;
//Move the Object/Panel
transform.position = mousePos;
}
最后,你会注意到我没有使用Input.mousePosition
直接设置UI位置。不要使用它。原因是当你改变Canvas RenderMode并分配Camera时,Input.mousePosition
不会工作,但RectTransformUtility.ScreenPointToLocalPointInRectangle
解决方案应该有效。