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。
完整代码如下:
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
}
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就会被重复调用
發生時可能一幀執行多次。它是依據事件,與幀無關。