Unity3d的GUI.Button的内部工作原理

时间:2014-08-16 17:07:53

标签: unity3d

我还非常擅长Unity3D中的脚本编写,并且我正在使用GUI.Button()在屏幕上绘制按钮的教程。

我对这个功能的工作方式很感兴趣。通过documentation,正确使用GUI.Button是在if语句中调用函数,并在if语句块中按下按钮时调用要调用的代码。

我想知道的是,Unity3D"神奇地"延迟if语句中的代码,直到单击按钮为止?如果它作为回调函数或其他东西传入,那么我可以理解发生了什么。也许Unity正在使用延迟来延迟代码的执行,但后来我觉得它会导致if语句执行多次后的代码。我只是想了解我的代码是如何工作的,而且这个特殊功能仍然保持着“神奇”的感觉。对我来说。

2 个答案:

答案 0 :(得分:0)

我不知道这是否是正确的术语,但我通常将此类系统称为立即模式GUI

  

Unity3D如何“神奇地”延迟if语句中的代码直到   单击按钮后?

如果在最后一帧期间按钮边界内发生了单击事件,

GUI.Button只返回true。基本上调用该函数你是轮询:每个按钮的每一帧询问引擎是否发生了关于该按钮(屏幕区域)的事件。

  

如果它作为回调函数或其他东西传入,那么我   可以理解发生了什么

您可能习惯于MVC之类的模式,您可以在其中传递从view引发UI事件时调用的控制器委托。这是真的不同的东西。

  

也许Unity正在使用延续功能来延迟   执行代码,但后来我觉得它会导致代码   if语句要多次执行。

没有。该函数只是立即返回,只有在事件发生时才返回true。如果返回false,则if之后的代码根本不会被执行。

附注:

  • 这种系统很难维护,特别是对于复杂的结构化GUI。
  • 它具有非常严重的性能影响(内存分配,UI元素的1个drawcall)

除非您正在编写编辑器扩展或自定义检查器代码,否则我会远离它。如果你想构建一个菜单实现你自己的系统或使用外部插件(有几个好的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。