我做了一个工具提示面板跟随光标
void Update () { this.transform.position = Input.mousePosition; }
在更新功能中。面板“滞后”,在四分之一秒后移动到光标位置,这有点烦人。有没有更好的方法?我能用某种方法将它“粘”到光标上吗?下面是我将鼠标从右向左移动时的外观。
当鼠标静止时,面板位于光标下方,只有当大力移动时,面板才会消失。
z3yyvxxp1#
你不能将Input.mousePosition;直接赋值给UI转换,你必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle来转换鼠标位置,并将画布转换到UI可以理解的适当位置。然后,使用Canvas.transform.TransformPoint(result)获取应该分配给UI/Panel位置的鼠标的最终位置。代码应该如下所示:
Input.mousePosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle
Canvas.transform.TransformPoint(result)
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槽纹理。
Cursor.visible = false;
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解决方案应该起作用。
Input.mousePosition
8ftvxx2r2#
这是一个众所周知的统一问题。当鼠标位置绑定到任何gameObject的位置时,我们会遇到滞后。这个滞后是由unity输入模块的鼠标位置记录引入的。Reference1,Reference2。
**解决方法:**您可以在游戏中制作自己的光标,并将其绑定到鼠标位置(就像您绑定UI面板一样)。游戏中的自定义光标对象将与面板具有相同的位置,因为这两个对象将从相同的源获得它们的位置。并且您将获得一个无滞后面板。:)
记住隐藏默认光标。
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;
工程编辑器和建设,在不同的分辨率.
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对象)以 * 任何 * 分辨率和纵横比跟随鼠标。
4条答案
按热度按时间z3yyvxxp1#
你不能将
Input.mousePosition;
直接赋值给UI转换,你必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle
来转换鼠标位置,并将画布转换到UI可以理解的适当位置。然后,使用
Canvas.transform.TransformPoint(result)
获取应该分配给UI/Panel位置的鼠标的最终位置。代码应该如下所示:
确保将"画布"指定给parentCanvas窗口。
在你的问题中的原始图像,我以为你移动的用户界面总是在光标的一边。链接视频后,我才意识到问题是,当对象移动到光标位置时有延迟。
这是Unity的问题。Unity目前正在重新设计InputSystem以解决此问题。当前的解决方案是使用
Cursor.visible = false;
禁用光标,然后使用另一个带有光标图标的图像作为光标。在线查找好的光标并从编辑器中将其分配给mouseCursor槽纹理。
最后大家会注意到,我并没有直接使用
Input.mousePosition
来设置UI位置,不要使用它,原因是当你改变Canvas RenderMode并分配Camera时,Input.mousePosition
并不起作用,但RectTransformUtility.ScreenPointToLocalPointInRectangle
解决方案应该起作用。8ftvxx2r2#
这是一个众所周知的统一问题。
当鼠标位置绑定到任何gameObject的位置时,我们会遇到滞后。这个滞后是由unity输入模块的鼠标位置记录引入的。Reference1,Reference2。
**解决方法:**您可以在游戏中制作自己的光标,并将其绑定到鼠标位置(就像您绑定UI面板一样)。游戏中的自定义光标对象将与面板具有相同的位置,因为这两个对象将从相同的源获得它们的位置。并且您将获得一个无滞后面板。:)
记住隐藏默认光标。
bweufnob3#
Unity 2021-适用于所有对2021年感兴趣的用户,在鼠标位置后显示工具提示(Unity GUI)。
上面发布的 RectTransformUtility 解决方案不起作用,或者它取决于一些画布设置的细微差别,而这些细微差别在帖子中缺失。
在Unity 2021中起作用的(tm)如下:
画布设置:
Tooltip是一个简单的UI对象(面板或其他对象),作为画布的子对象,设置如下:
并附上以下脚本:
工程编辑器和建设,在不同的分辨率.
uqdfh47h4#
关于@zizu_zaza的解决方案,它没有考虑不同的纵横比(至少当画布缩放器屏幕匹配比不是1.0或0.0时)。通过画布缩放来缩放鼠标位置仅适用于相同纵横比的不同分辨率。
要在鼠标位置缩放中同时考虑分辨率和纵横比,请执行以下操作:
这将允许工具提示(或任何其他UI对象)以 * 任何 * 分辨率和纵横比跟随鼠标。