Unity3d GUI 的内部工作原理。按钮



我在Unity3D中编写脚本仍然很新,我正在跟随一个使用GUI.Button()在屏幕上绘制按钮的教程。

我对这个函数的工作原理很感兴趣。翻看文档,正确使用GUI。Button是在if语句中调用函数,并将按下按钮时调用的代码放在if语句的块中。

我想知道的是,Unity3D如何"神奇地"延迟if语句中的代码,直到按钮被点击之后?如果它是作为回调函数或其他东西传入的,那么我就能理解发生了什么。也许Unity在底层使用延续来延迟代码的执行,但我觉得这会导致if语句之后的代码被执行多次。我只是想了解我的代码是如何工作的,这个特殊的函数对我来说仍然是"神奇的"。

我不知道这个术语是否正确,但我通常将这种系统称为即时模式GUI

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

GUI。如果在上一帧的按钮边界内发生了单击事件,则Button返回true。基本上调用该函数,你是轮询:每帧每个按钮询问引擎是否发生了与按钮(屏幕区域)有关的事件。

如果它是作为回调函数或其他东西传入的,那么I能理解发生了什么

你可能习惯了一个MVC类似的模式,在那里你传递一个控制器委托,当一个UI事件从view引发时被调用。这是非常不同的东西。

也许Unity在底层使用延续来延迟执行代码,但之后我觉得它会导致代码要多次执行的if语句

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

指出:

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

除非你正在编写编辑器扩展或自定义检查器代码,否则我会远离它。如果你想建立一个菜单实现你自己的系统或使用外部插件(有几个很好的NGUI, EZGUI,…)。Unity已经发布了一个新的集成UI系统,应该很快就会发布。

问得好。unity3d gui经历了几个事件阶段,或者在文档

事件对应于用户输入(按键,鼠标动作),或者是UnityGUI布局或渲染事件。

对于在脚本中调用OnGUI的每个事件;所以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。