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

时间:2017-05-05 10:08:42

标签: c# unity3d cursor tooltip

我用

跟随光标制作了一个工具提示面板
void Update () {
    this.transform.position = Input.mousePosition;  
}

在更新功能中。

面板“落后”,在四分之一秒后移动到光标位置,这有点烦人 有没有更好的方法呢?我可以以某种方式“粘合”它到光标? 以下是我从右向左移动鼠标时的外观。enter image description here

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

2 个答案:

答案 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的位置时,我们面临滞后。这种滞后是由单位输入模块的鼠标位置记录引入的。 Reference1Reference2

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

请记住隐藏默认光标。