Unity GUI 按钮 - 轮询输入与事件驱动输入

Unity GUI Button - Polling Input VS Event Driven Input

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

"This means that your OnGUI implementation might be called several times per frame (one call per event). "

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语句在条件为假时什么都不做,但是它一直在检测,与事件驱动输入相比效率不高。

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

3) 上面的语句提到了"one call per event"。这是否意味着它实际上是一个事件驱动输入,而不是轮询输入?

我对这些问题很困惑,找不到答案。有人会向我解释。谢谢

1。如果你按下按钮 GUI.Button returns true。如果未按下按钮,GUI.Button 将 return false。就这么简单。那不是一个事件。它只是一个 return 真或假的函数,取决于是否按下按钮。

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

3

Does it mean it is actually a event driven input, not polling input?

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


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

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

public Button button;

注册按钮事件

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

注销按钮事件

button.onClick.RemoveAllListeners();

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