OnGUI方法应用与生命周期

OnGUI方法应用与生命周期

Why

主要用来创建调试工具、创建自定义属性面板、创建新的Editor窗口和工具达到扩展编辑器效果。

OnGUI不建议使用在项目UI中。因为效率的问题现在已经很少使用了,但在Editor脚本中,如果你需要扩展一下Unity编辑器的功能,那掌握该GUI的编写还是非常必要的。

官方给出了三种该UI的用途:

1.游戏中Debug时需要显示一些简单的UI;

2.给Component脚本创建一个自定义的Inspector;

3.创建一个Editor Window,扩展Unity本身。

有时候想要输出一些数据到屏幕上方便查看,新建一个UI对象又挺麻烦,用OnGUI()在屏幕上直接绘制UI比较方便。

GUI.Label(new Rect(100, 100, 200, 80), “aaa", style);

这条语句在屏幕中绘制了一个Label,第一个参数给出了位置和大小,第二个参数是要显示的内容,第三个参数可以省略,是所绘制Label的样式。

GUI.Label(new Rect(100, 100, 200, 80),"<color=#00ff00><size=30>"+"aaa"+"</size></color>", style);  

在要显示的内容前后加上标签同样也是支持的,但只支持color,size,b和i。

完整代码如下:

www.zeeklog.com  - OnGUI方法应用与生命周期
    private void OnGUI()
    {
        GUIStyle style = new GUIStyle
        {
            border = new RectOffset(10, 10, 10, 10),
            fontSize = 50,
            fontStyle = FontStyle.BoldAndItalic,
        };
        // normal:Rendering settings for when the component is displayed normally.
        style.normal.textColor = new Color(200/255f, 180/255f, 150/255f);    // 需要除以255,因为范围是0-1
        GUI.Label(new Rect(100, 100, 200, 80), “aaa", style);
        GUI.Label(new Rect(Screen.width - 100, Screen.height - 100, 200, 80),
            "<color=#00ff00><size=30>"+"aaa"+"</size></color>", style);    // 支持标记语言(什么富文本?
        // 只支持color,size,b,i
    }
www.zeeklog.com  - OnGUI方法应用与生命周期

OnGUI()函数生命周期

OnGUI()函数是每帧执行一次吗

Update()和OnGUI()有什么区别?

OnGUI() 会在渲染和处理GUI时间时调用,

简单理解就是分线程执行,执行先后顺序是:Awake线程->Start线程->FixedUpdate线程->Update线程->LateUpdate线程->OnGUI线程.
(注意:OnGUI 可以每帧调用多次,小心使用 , )

可以做個實驗:

public class GuiTest : MonoBehaviour
{
private int gui_counter = 0;
private int update_counter = 0;

void OnGUI()
{
gui_counter++;
Debug.Log ("OnGUI.." + gui_counter + "," + update_counter);
}

void Update()
{
update_counter++;
Debug.Log ("Update.." + gui_counter + "," + update_counter);
}
}

就可以發現,OnGUI 雖然會不斷被調用,但是並不是每一幀調用一次,而是會調用多次,這是因為有多次GUI Event的原因。

你操作越多次產生GUI Event 有關的行為(例如在屏幕上操作滑鼠),OnGUI 就會被調用越多次。

造成的影響就是,每一次 OnGUI ()被調用時,Time.deltaTime 並不是每次 OnGUI 的間隔時間,這點要小心。

也就是如果OnGUI()里面事件方法一直在调用的话,OnGUI就会被重复调用

發生時可能一幀執行多次。它是依據事件,與幀無關。

http://docs.unity3d.com/Script|