2017-05-05 65 views
1

我做了一个提示板跟随光标与位置UI鼠标位置(制作工具提示面板后续光标)

void Update() { 
    this.transform.position = Input.mousePosition; 
} 
在更新功能

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

面板IS在鼠标悬停的时候在光标下方,它只有在大力移动时才会关闭。

+1

试了一下,看不出任何滞后。请分享一些关于您的应用,面板,脚本的更多信息。 –

+0

如果我把30px30p面板,并使其跟随光标,与简单的Input.mousePosition我可以很容易地超过它我快速移动鼠标。 其他人不是这种情况吗? 我试图做空项目,仍然有同样的问题。我需要30p 30p面板始终在光标下。 – user2998964

+0

工具提示面板,它是UI还是普通的GameObject?你慢什么意思?工具提示不在鼠标光标所在的位置?我想你应该放一个截图。 – Programmer

回答

1

这是统一的已知问题。

将鼠标位置绑定到任何gameObject的位置时,我们会面临滞后。这种滞后是由统一输入模块的鼠标位置记录引入的。 Reference1,Reference2

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

请记住隐藏默认光标。

+0

是否有任何已知的黑客? 我想它并不那么重要。 – user2998964

+0

包括一个可能的解决方法。 –

+0

@programmer,我在编辑你的时候写了我的答案。请不要以其他方式认为。重要的是我们有解决这个问题的办法。无论如何,我们都有相同的解决这个问题,这使得它充分证明;)。 –

2

不能直接指定Input.mousePosition;到UI变换。您必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle将鼠标位置和画布转换为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); 
} 

确保画布分配给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位置。不要使用它。原因在于,当您更改“画布渲染模式”并分配相机时,Input.mousePosition将不起作用,但RectTransformUtility.ScreenPointToLocalPointInRectangle解决方案应该可以正常工作。

+0

同样的效果,面板光标:( – user2998964

+0

工作平稳在我身边经过的路径。什么是你的相机投影模式?什么是Canva的渲染模式?你统一的版本? – Programmer

+0

尝试这种代码,我仍然得到滞后。 –