将UI定位到鼠标位置(使“工具提示”面板跟随光标)

我按照光标制作了一个工具提示面板

void Update () { this.transform.position = Input.mousePosition; } 

在更新function中。

面板“落后”,在四分之一秒后移动到光标位置,这有点烦人有更好的方法吗? 我可以以某种方式“粘合”它到光标? 以下是我从右向左移动鼠标时的外观。 在此处输入图像描述

当鼠标静止时,面板IS在光标下,只有在剧烈移动时它才会落后。

这是统一的已知问题。

在将鼠标位置绑定到任何gameObject的位置时,我们面临滞后。 这种滞后是由单位输入模块的鼠标位置记录引入的。 参考文献1 , 参考文献2 。

解决方法:您可以在游戏中制作自己的光标并将其绑定到鼠标位置(当您绑定UI面板时)。 游戏中的自定义光标对象将与面板具有相同的位置,因为这两个对象都将从相同的源派生它们的位置。 你会得到一个无滞后的面板。 🙂

记得隐藏默认光标。

不能分配Input.mousePosition; 直接到UI转换。 您必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle将鼠标位置和Canvas转换为UI可以理解的适当位置。

之后,使用Canvas.transform.TransformPoint(result)获取应分配给UI / Panel位置的鼠标的最终位置。

这个代码应该是这样的:

 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插槽。

编辑:

在您的问题中使用原始图像时,我认为您正在移动的UI始终位于光标的一侧。 在链接video之后,我刚刚意识到问题是对象移动到光标位置时会有延迟。

这是Unity的一个问题。 Unity目前正在重新设计InputSystem来解决这个问题。 目前的解决方法是使用Cursor.visible = false;禁用游标Cursor.visible = false; 然后使用另一个带有光标图标的图像作为光标。

在线找到好的光标并将其分配给编辑器中的mouseCursor插槽纹理。

 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解决方案应该可以工作。