我还非常擅长Unity3D中的脚本编写,并且我正在使用GUI.Button()在屏幕上绘制按钮的教程。
我对这个功能的工作方式很感兴趣。通过documentation,正确使用GUI.Button是在if语句中调用函数,并在if语句块中按下按钮时调用要调用的代码。
我想知道的是,Unity3D"神奇地"延迟if语句中的代码,直到单击按钮为止?如果它作为回调函数或其他东西传入,那么我可以理解发生了什么。也许Unity正在使用延迟来延迟代码的执行,但后来我觉得它会导致if语句执行多次后的代码。我只是想了解我的代码是如何工作的,而且这个特殊功能仍然保持着“神奇”的感觉。对我来说。
答案 0 :(得分:0)
我不知道这是否是正确的术语,但我通常将此类系统称为立即模式GUI 。
如果在最后一帧期间按钮边界内发生了单击事件,Unity3D如何“神奇地”延迟if语句中的代码直到 单击按钮后?
GUI.Button只返回true。基本上调用该函数你是轮询:每个按钮的每一帧询问引擎是否发生了关于该按钮(屏幕区域)的事件。
如果它作为回调函数或其他东西传入,那么我 可以理解发生了什么
您可能习惯于MVC
之类的模式,您可以在其中传递从view
引发UI事件时调用的控制器委托。这是真的不同的东西。
也许Unity正在使用延续功能来延迟 执行代码,但后来我觉得它会导致代码 if语句要多次执行。
没有。该函数只是立即返回,只有在事件发生时才返回true。如果返回false,则if之后的代码根本不会被执行。
附注:
除非您正在编写编辑器扩展或自定义检查器代码,否则我会远离它。如果你想构建一个菜单实现你自己的系统或使用外部插件(有几个好的NGUI,EZGUI,..)。
Unity
已宣布新版integrated UI System,应尽快发布。
答案 1 :(得分:0)
好问题。 unity3d gui经历了几个事件阶段,或者在documentation
中事件对应于用户输入(按键,鼠标操作),或者是UnityGUI布局或渲染事件。
对于每个事件,在脚本中调用OnGUI;因此,每帧可能会多次调用OnGUI。 Event.current对应于"当前" OnGUI调用中的事件。"
在OnGUI中,您可以使用> Event.current
找出当前正在发生的事件处理以下事件link:
UnityGUI输入和处理事件的类型。
-MouseDown
-MouseUp,mouse button was released
-MouseMove,Mouse was moved (editor views only)
-MouseDrag,Mouse was dragged
-KeyDown, A keyboard key was pressed
-KeyUp A keyboard key was released.
-ScrollWheel The scroll wheel was moved.
-Repaint A repaint event. One is sent every frame.
-Layout A layout event.
-DragUpdated Editor only: drag & drop operation updated.
-DragPerform Editor only: drag & drop operation performed.
-DragExited Editor only: drag & drop operation exited.
-Ignore Event should be ignored.
-Used Already processed event.
-ValidateCommand Validates a special command (e.g. copy & paste).
-ExecuteCommand Execute a special command (eg. copy & paste).
-ContextClick User has right-clicked (or control-clicked on the mac).
Unity GUI最近有了很大改进,如果你想以编程方式处理事情,它非常有用。如果你想在视觉上处理事情,我建议你看看heisenbug所指的插件。
如果您决定使用unity gui,我建议只使用一个ongui对象,让这个对象处理你所有的gui。