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

时间:2017-04-08 02:41:23

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

我正在用C#学习Unity并学习GUI Button。我在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语句将不执行任何操作,但与事件驱动的输入相比,它会保持检测并且效率不高。

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

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

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

1 个答案:

答案 0 :(得分:2)

1 。如果按下按钮GUI.Button,则返回true。如果未按下按钮,GUI.Button将返回false。就这么简单。那不是事件。它只是一个返回true或false的函数,具体取决于Button是否被按下。

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

第3

  

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

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

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

以下是注册和取消注册Button onClick事件的简单方法。

public Button button;

注册按钮事件

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

取消注册按钮事件

button.onClick.RemoveAllListeners();

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