0

我正在使用 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 语句将不执行任何操作,但与事件驱动输入相比,它一直在检测并且效率不高。

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

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

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

4

1 回答 1

3

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

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

3

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

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


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

下面是注册和注销 ButtononClick事件的简单方法。

public Button button;

注册按钮事件

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

取消注册按钮事件

button.onClick.RemoveAllListeners();

您可以在此处找到其他 UI 事件示例。

于 2017-04-08T03:28:16.300 回答