我正在用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)上述声明提到“每个事件一个电话”。这是否意味着它实际上是一个事件驱动的输入,而不是轮询输入?
我对这些问题感到困惑,无法找到答案。有人会向我解释。感谢。
答案 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。