获取是不是按下 Unity UI 元素 [重复]

Posted

技术标签:

【中文标题】获取是不是按下 Unity UI 元素 [重复]【英文标题】:Get if Unity UI element is being pressed [duplicate]获取是否按下 Unity UI 元素 [重复] 【发布时间】:2017-08-29 17:32:20 【问题描述】:

我知道 Unity 中的 EventTrigger 实用程序,目前使用它来检查屏幕是否“被按下”:

public static bool JUMP;
public void PointerDown()

    JUMP = true;

public void PointerUp()

    JUMP = false;

但问题在于,在关卡加载时,触发器不会收到OnPointerUp 的通知,并且玩家被卡在跳跃中。

因此,我正在寻找一种解决方案,在按下 UI 元素时基本上返回 true,否则 返回 false,可能使用polling。所以基本上GetMouseButton 仅适用于 UI 元素和触摸屏。

我查看了EventTrigger 系统,但没有找到我想要的。

编辑

我介绍的两种方法分别连接到gameobjectEventTriggerOnPointerUpOnPointerDown。我在这里写的代码确实有效,但我需要一个更可靠的解决方案,一个可能使用轮询的解决方案(例如,从FixedUpdate() 调用以获取更新)。

为什么这对我或其他人来说不够可靠

引擎必须在每次指针向上时通知,以免卡住 - 在我的情况下 - 在跳跃中。现在,手机游戏中有些情况不会发生这种情况:

用户在手持设备时不小心触摸了屏幕 滞后/卡顿,可能不是由于应用程序本身,而是设备上发生的任何其他问题 关卡加载、广告加载

为了测试目的,我弄乱了应用程序,发现如果以这种方式使用我展示的它实际上并不难让角色卡住 - 在我的情况下 - 跳跃。

下面是代码与EventTrigger的连接方式:

【问题讨论】:

您或其他人在几天前问过这个确切的问题,它被标记为重复。我再给你指出,没有PointerDownPointerUp。有OnPointerDownOnPointerUp。修复该问题并重试,您的代码应该可以工作。 我解释得不够清楚,但我将这两种方法与OnPointerUpEventTrigger 中可用的方法联系起来。我编写的这段代码有效,但很脆弱,我正在寻找一种基于轮询的方式来做同样的事情。 EventTrigger 捕获所有缓慢的事件。不这样做的正确方法是从脚本中实现IPointerDownHandlerIPointerUpHandler,然后使用OnPointerDownOnPointerUp 函数。有关示例,请参阅this。它应该附加到每个对象上,然后有一个公共的非静态布尔变量可以在它们上使用。 你给了我很多阅读和实现的内容:D 现在检查一下。 是的,这听起来像是要走的路。你知道 Unity,就像你是它的首席架构师一样:D 【参考方案1】:

您缺少参数并且命名错误。 请查看统一脚本参考以获取更多信息。

public static bool JUMP;
public void OnPointerDown(PointerEventData eventData)
    JUMP = true;


public void OnPointerUp(PointerEventData eventData)

Unity 脚本参考: https://docs.unity3d.com/ScriptReference/UI.Selectable.OnPointerUp.html

更新 如果您不想使用 OnPointerUp/Down 方法。另一种解决方案是使用

Input.GetTouch

这些触摸事件包含“阶段”,告诉您触摸是刚刚开始还是被释放等。因此您可以使用此事件的触摸位置并检查它是否与您的 UI 元素重叠。如果它重叠并且被按下,那么你就想跳起来。如果它被释放,你想停止跳起来。 您可以在附加到 ui 组件的脚本的更新方法中检查这一点。

https://docs.unity3d.com/ScriptReference/Input.GetTouch.html

更新2 你可以使用RectTransformUtility.ScreenPointToLocalPointInRectangle 来确定你的触摸事件是否命中了你的 UI 元素。

【讨论】:

谢谢,但刚刚更新了问题。由于编辑中写的原因,我的代码有效,我只需要一个更稳定的解决方案。 用替代解决方案编辑了我的答案 谢谢,我自己搞砸了GetTouch,看看它能做什么。 更新了更多以获得另一个提示。希望对你有帮助

以上是关于获取是不是按下 Unity UI 元素 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

[Unity 3d] 判断手指/鼠标按下触发在UI上的正确方法

Unity3D:如何检测按钮何时被按住和释放[重复]

Unity3d游戏开发浅谈UGUI中的Canvas以及三种画布渲染模式

Unity 在运行时更改 UI 图像颜色

统一3d。如何获取ui元素的屏幕或世界位置

退出应用程序后隐藏 UI [重复]