【问题标题】:Unity GUI Button - Polling Input VS Event Driven InputUnity GUI 按钮 - 轮询输入 VS 事件驱动输入
【发布时间】:2017-09-03 12:21:42
【问题描述】:

我正在使用 C# 学习 Unity 并学习 GUI 按钮。我在 Unity 文档中找到了以下语句:

“这意味着您的 OnGUI 实现可能每帧调用多次(每个事件调用一次)。”

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnGUI() {
        if (GUI.Button(new Rect(10, 10, 150, 100), "I am a button"))
            print("You clicked the button!");

    }
}

我的问题是:

1) 上面的“if”语句会一直检测条件直到它为真。它应该被称为轮询输入。为什么上面的代码使用轮询输入而不是事件驱动输入? (即当有人按下按钮时,该事件被触发。)。虽然 if 语句在条件为 false 时什么都不做,但与事件驱动输入相比,它一直在检测并且效率不高。

2) 为什么 Unity 在这种情况下使用轮询输入?

3) 上述声明提到“每个事件一次调用”。这是否意味着它实际上是事件驱动输入,而不是轮询输入?

我对这些问题感到困惑,找不到答案。有人可以给我解释一下。谢谢。

【问题讨论】:

  • 您不应该使用 OnGUI 系统进行游戏开发。请参阅Immediate Mode GUI (IMGUI) 的帮助页面 “IMGUI 系统通常不适用于玩家可能使用和与之交互的普通游戏内用户界面。为此,您应该使用 Unity 的主要基于 GameObject 的UI system ,它提供了一种基于 GameObject 的方法来编辑和定位 UI 元素,并且具有更好的工具来处理 UI 的视觉设计和布局。”

标签: c# button unity3d polling event-driven-design


【解决方案1】:

1。如果您按下按钮GUI.Button,则返回true。如果未按下按钮,GUI.Button 将返回false。就这么简单。那不是一个事件。它只是一个函数,根据是否按下按钮返回 true 或 false。

2。我的猜测是 Unity 想通过这样做让事情变得更简单。基本上,您创建一个 Button 并检查它是否仅用一行代码被按下。

3

这是否意味着它实际上是事件驱动输入,而不是轮询输入?

它仍然是轮询,但它只在点击时被调用一次,直到被释放。要调用GUI.Button,您必须在OnGUI 函数中不断调用GUI.Button


此时忘记GUI.Button。你现在使用的是IMGUI。 你不需要它。有一个新的用户界面系统(uGUI)。这是你应该使用的,一切都基于事件。 Here是新UI系统的教程。忽略任何需要使用OnGUI 函数的内容。

下面是注册和注销按钮onClick事件的简单方法。

public Button button;

注册按钮事件

button.onClick.AddListener(() => yourCallBackFunction);

取消注册按钮事件

button.onClick.RemoveAllListeners();

您可以找到其他 UI 事件示例here

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多