我用
跟随光标制作了一个工具提示面板void Update () {
this.transform.position = Input.mousePosition;
}
在更新功能中。
面板“落后”,在四分之一秒后移动到光标位置,这有点烦人 有没有更好的方法呢?我可以以某种方式“粘合”它到光标? 以下是我从右向左移动鼠标时的外观。
当鼠标静止时,面板IS位于光标下,只有在剧烈移动时才会落后。
答案 0 :(得分:4)
您无法直接将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插槽。
修改强>
在您的问题中使用原始图像时,我认为您正在移动的UI始终位于光标的一侧。在链接视频之后,我刚刚意识到问题是对象移动到光标位置时会有延迟。
这是Unity的一个问题。 Unity目前正在重新设计InputSystem来解决这个问题。当前的解决方法是使用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并分配相机时,Input.mousePosition
无法正常工作,但RectTransformUtility.ScreenPointToLocalPointInRectangle
解决方案应该有效。
答案 1 :(得分:1)
这是一个统一的已知问题。
在将鼠标位置绑定到任何gameObject的位置时,我们面临滞后。这种滞后是由单位输入模块的鼠标位置记录引入的。 Reference1,Reference2。
解决方法:您可以在游戏中制作自己的光标并将其绑定到鼠标位置(当您绑定UI面板时)。游戏中的自定义光标对象将与面板具有相同的位置,因为这两个对象将从相同的源派生它们的位置。你会得到一个无滞后的面板。 :)
请记住隐藏默认光标。