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

g6ll5ycj  于 2023-03-09  发布在  其他
关注(0)|答案(4)|浏览(669)

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

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

在更新功能中。
面板“滞后”,在四分之一秒后移动到光标位置,这有点烦人。有没有更好的方法?我能用某种方法将它“粘”到光标上吗?下面是我将鼠标从右向左移动时的外观。

当鼠标静止时,面板位于光标下方,只有当大力移动时,面板才会消失。

z3yyvxxp

z3yyvxxp1#

不能Input.mousePosition;直接赋值给UI转换,你必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle来转换鼠标位置,并将画布转换到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);
}

确保将"画布"指定给parentCanvas窗口。

    • 编辑:**

在你的问题中的原始图像,我以为你移动的用户界面总是在光标的一边。链接视频后,我才意识到问题是,当对象移动到光标位置时有延迟。
这是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并分配Camera时,Input.mousePosition并不起作用,但RectTransformUtility.ScreenPointToLocalPointInRectangle解决方案应该起作用。

8ftvxx2r

8ftvxx2r2#

这是一个众所周知的统一问题。
当鼠标位置绑定到任何gameObject的位置时,我们会遇到滞后。这个滞后是由unity输入模块的鼠标位置记录引入的。Reference1Reference2

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

记住隐藏默认光标。

bweufnob

bweufnob3#

Unity 2021-适用于所有对2021年感兴趣的用户,在鼠标位置后显示工具提示(Unity GUI)。

上面发布的 RectTransformUtility 解决方案不起作用,或者它取决于一些画布设置的细微差别,而这些细微差别在帖子中缺失。
在Unity 2021中起作用的(tm)如下:
画布设置:

Tooltip是一个简单的UI对象(面板或其他对象),作为画布的子对象,设置如下:

并附上以下脚本:

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

工程编辑器和建设,在不同的分辨率.

uqdfh47h

uqdfh47h4#

  • 把它挖出来,就像我今天有同样的任务一样 *

关于@zizu_zaza的解决方案,它没有考虑不同的纵横比(至少当画布缩放器屏幕匹配比不是1.0或0.0时)。通过画布缩放来缩放鼠标位置仅适用于相同纵横比的不同分辨率。
要在鼠标位置缩放中同时考虑分辨率和纵横比,请执行以下操作:

Vector2 mergedFactors = new Vector2(
      (canvas.transform as RectTransform).sizeDelta.x / Screen.width,
      (canvas.transform as RectTransform).sizeDelta.y / Screen.height);
//x and y -> *= (RefX/ScreenWidth) * (CanvasWidth/RefX)
tooltip.anchoredPosition = mousePos * mergedFactors;

//Short maths explanation:
//CanvasScaler scaler = GetComponentInParent<CanvasScaler>();
//Vector2 scaleFactors = new Vector2(
//    scaler.referenceResolution.x / Screen.width, 
//    scaler.referenceResolution.y / Screen.height);
//Vector2 aspectFactors = new Vector2(
//    (canvas.transform as RectTransform).sizeDelta.x / scaler.referenceResolution.x,
//    (canvas.transform as RectTransform).sizeDelta.y / scaler.referenceResolution.y);
//Vector2 mergedFactors = scaleFactors * aspectFactors
//
//->scale reference resolution by actual screen resolution
//->scale canvas "size" (which adjusts to aspect) by reference resolution
//->combine both: reference resolution multi & div cancel out

这将允许工具提示(或任何其他UI对象)以 * 任何 * 分辨率和纵横比跟随鼠标。

相关问题