将 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;
在编辑器和构建中以不同的分辨率工作。
我制作了一个工具提示面板跟随光标
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;
在编辑器和构建中以不同的分辨率工作。