目录
序 ............................................................................................................................................................. 2 GUI ......................................................................................................................................................... 2 GUI异军突起 ........................................................................................................................................ 6
序
Unity的GUI系统一直被人们所诟病,被批为落后的,过时的UI系统,笔者发现在我读的这本书上讲解的依然是这个菜单,所以笔者打算借着这个机会学习一下新的GUI系统,所以此篇读书笔记不会过多的在旧的gui系统上面花太多笔墨。
GUI
首先我其实是很反感这本书作者这样讲解游戏GUI的,这样讲解只是单纯的抄Unity文档,根本毫无意义,GUI重要的是方法和工作流。诚然我也是个初学者,我将在这篇读书笔记中讲述,我是如何使用旧的GUI系统来创建一个完整的简单的游戏标题菜单的。
Unity的旧GUI对于新手来说十分好用,快速方便,我们如果想使用一个按钮来判断事件,只需要在OnGUI中简单一句:
If(GUI.Button(Rect(Screen.width/c,Screen.height/d,Screen.width/beginwidthn,Screen.height/beginheightn),\{
//按下按钮你要做的操作 }
但是这对于大规模的游戏菜单来说绝对是毁灭性的灾难(要不然那么多的Unity游戏也不会总是使用NGUI插件了)。我尝试使用Unity的旧GUI写过菜单,我们来看看写一个简单的标题画面应该怎么做:
首先必须明白的是,标题画面最好实践是一个单独的scene,然后所有的关于菜单的操作都被放在这个空间中,无论你有多少子菜单。 下面我要做的就是这样一个菜单界面:
首先我要做的是准备这些菜单的字体,因为我在完成这个东西的时候unity并不支持显示中文,即使要支持也是相当麻烦的。于是乎,我准备了如下素材:
我的菜单无非就是这些图片的组合。
然后我创建了一个名叫title的场景,他里面只有一个Main Camera
我们要做的事情就是在这个相机的GUI层以既定的方式来绘制这些图片。在老的GUI系统为了更改GUI的风格,有个东西叫做GUISkin,这里面可是设置所有关于GUI的显示风格,包括按钮怎么显示,滚动条怎么显示等等
在这里面有一个东西叫做CustomStyle的下拉栏,在这里面可以自定义按钮风格,于是我把自己绘制的图片设置到这里面去:
这样一来,所有的东西都已经搞定了,然后我就需要开始写一个脚本来控制所有的GUI行为,JS代码如下:
#pragma strict
var titletext : GUISkin; var title : Texture; var about : Texture;
var begintextpos_xn = 1f; var begintextpos_yn = 1f; var beginwidthn = 1f; var beginheightn = 1f; var mode = 1; function OnGUI() {
GUI.skin = titletext; switch (mode) { case 1:
GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),title); var botton =
GUI.Button(Rect(Screen.width/begintextpos_xn,Screen.height/begintextpos_yn,Screen.width/beginwidthn,Screen.height/beginheightn),\
var botton1 =
GUI.Button(Rect(Screen.width/a,Screen.height/b,Screen.width/beginwidthn,Screen.height/beginheightn),\
var botton2 =
GUI.Button(Rect(Screen.width/e,Screen.height/f,Screen.width/beginwidthn,Screen.height/beginheightn),\
if(botton)
Application.LoadLevel (1);
if(botton1)
Application.Quit();
if(botton2)
mode = 2;
break;
case 2:
GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),about); var bottontomain =
GUI.Button(Rect(Screen.width/c,Screen.height/d,Screen.width/beginwidthn,Screen.height/beginheightn),\ }
}
break;
if(bottontomain||Input.GetKeyUp(KeyCode.Escape))
mode = 1;
也就是说每帧都要定义button每帧都要绘制,并且按钮和其逻辑是相互分离的,必须要由这段代码来联系起来。在这里,我们只有3个按钮,也许是非常清晰好管理的,但是如果