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

Position UI to mouse position (Make Tooltip panel follow cursor)

我制作了一个工具提示面板跟随光标

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

在更新函数中。

后面的面板"lags",一刻钟后移动到光标位置,有点烦人 有更好的方法吗?我能以某种方式 "glue" 它到光标吗? 这是我从右向左移动鼠标时的样子。

面板在鼠标静止时处于光标下方,只有在用力移动时才会消失。

不能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 分配给父 Canvas 插槽。

编辑:

根据您问题中的原始图像,我认为您移动的 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 解决方案应该起作用。

这是 unity 的一个已知问题。

在将鼠标位置绑定到任何游戏对象的位置时,我们面临延迟。这种滞后是由统一输入模块的鼠标位置记录引入的。 Reference1, Reference2.

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

记得隐藏默认光标。

Unity 2021 - 对于所有对 2021 感兴趣的人来说,在鼠标位置之后有工具提示(Unity GUI)。

上面 RectTransformUtility post 的解决方案不起作用,或者它取决于一些 canvas 设置的细微差别,这些细微差别在 post 中缺失.

Unity 2021 中有效的 (tm) 如下:

Canvas 设置:

工具提示是一个简单的 UI 对象(面板或其他)作为 canvas 的子对象,具有以下设置:

并附有以下脚本:

tooltip_rect_transform_ref.anchoredPosition = Input.mousePosition / tooltip_parent_canvas.transform.localScale.x;

在编辑器和构建中以不同的分辨率工作。