CR开发笔记-3GUI界面制作
今天是第三篇
今天主要是做UI界面,非常容易,我也不用NGUI直接上好了!
直接上代码!
using UnityEngine; using System.Collections; public class Startmenu : MonoBehaviour { float fullWidth; float fullHeight; Rect rtFullscreen; Rect rtBeginBtn; //窗口定义 //这个玩意的效果就是只让一个窗口存在 bool WindowsExist; //关于窗口 Rect rtInfoBtn; Rect rtInfoWin; bool stInfoWin; Rect rtInfoWinBtn; //设置窗口 Rect rtSetupBtn; Rect rtSetupWin; bool stSetupWin; Rect rtSetupWinBtn; //关卡窗口 Rect rtLevelBtn; Rect rtLevelWin; bool stLevelWin; Rect rtLevelWinBtn; // Use this for initialization void Start () { WindowsExist = false; fullWidth=Screen.width; fullHeight=Screen.height; rtFullscreen = new Rect(0, 0, fullWidth, fullHeight); rtBeginBtn = new Rect(fullWidth/2, (float)(fullHeight*0.382), (float)(fullWidth * 0.309), (float)(fullHeight * 0.2)); rtLevelBtn = new Rect(fullWidth / 2, (float)(fullHeight * 0.25), (float)(fullWidth * 0.2), (float)(fullHeight * 0.132)); rtSetupBtn = new Rect(fullWidth/2,(float)(fullHeight*0.582),(float)(fullWidth*0.2),(float)(fullHeight*0.118)); rtInfoBtn = new Rect (fullWidth/2,(float)(fullHeight*0.7),(float)(fullWidth*0.15),(float)(fullHeight*0.1)); //米娜桑,为什么要在这里这么干呢,明明可以在下面直接用new的,这是为了提高运作效率 //但是这是有缺点的,就是你不能在游戏中拉伸画面,因为这个代码只运行一遍,也就是一开始就订好了宽长 //关于窗口 rtInfoWin = new Rect(fullWidth / 4, fullHeight / 4, fullWidth / 2, fullHeight / 2); stInfoWin = false; rtInfoWinBtn = new Rect(0, (float)(rtInfoWin.height * 0.75), rtInfoWin.width, (float)(rtInfoWin.height * 0.25)); //设置窗口 rtSetupWin = new Rect(fullWidth / 4, fullHeight / 4, fullWidth / 2, fullHeight / 2); stSetupWin = false; rtSetupWinBtn = new Rect(0, (float)(rtSetupWin.height * 0.75), rtSetupWin.width, (float)(rtSetupWin.height * 0.25)); //关卡窗口 rtLevelWin = new Rect(0, 0, fullWidth, fullHeight); stLevelWin = false; rtLevelWinBtn = new Rect(0, (float)(rtLevelWin.height*0.85), rtLevelWin.width, (float)(rtLevelWin.height * 0.15)); } // Update is called once per frame void Update () { } void OnGUI() { GUI.Box(rtFullscreen, "hehe"); if(GUI.Button(rtBeginBtn, "try")) { Application.LoadLevel("startscene"); } //关卡窗口 if (GUI.Button(rtLevelBtn, "Level")) { if (WindowsExist == false) { stLevelWin = true; WindowsExist = true; } } if (stLevelWin) { GUI.Window(2, rtLevelWin, doWindow,"gege"); } //设置窗口 if (GUI.Button(rtSetupBtn, "setup")) { if (WindowsExist == false) { stSetupWin = true; WindowsExist = true; } } if (stSetupWin) { GUI.Window(3, rtSetupWin, doWindow, "hehe"); } //关于窗口 if (GUI.Button(rtInfoBtn, "hehe")) { if (WindowsExist == false) { stInfoWin = true; WindowsExist = true; } } if (stInfoWin) { GUI.Window(4, rtInfoWin, doWindow, "hehe"); } } //窗口事件 void doWindow(int winID) { if (winID == 4) { if (GUI.Button(rtInfoWinBtn, "hehe")) { stInfoWin = false; WindowsExist = false; } } if (winID == 3) { if (GUI.Button(rtSetupWinBtn, "hehe")) { stSetupWin = false; WindowsExist = false; } } if (winID == 2) { if (GUI.Button(rtLevelWinBtn,"gege")) { stLevelWin = false; WindowsExist = false; } } } }
效果图
这些我们暂且不提了
除了上面的一大堆东西,我也就不解释什么了。。。明天画画还要交作业。(我的七个姐姐和八个妹妹问我为什么跪倒在数位板面前)
有几个需要注意一下的地方
1、基本上任何数字*0.几几都会自动转化为double,但是double效率非常慢,一般要转为float,这点需要注意。(括号很重要)
2、也不知道什么原因,可能是图层的问题,于是很多情况下,虽然有弹出窗口,但是在窗口下面点击之后就会弹出另外一个弹出窗口。。。这时候需要一个开关,使得只存在一个弹出窗口。
3、切换关卡问题 Application.LoadLevel("startscene"); 需要在file—buildset里进行设置才可以使用并且加载,这里可以探讨一下unity的运行机制,其实可以使用异步加载,以后再说。
基本就是这些。
下一次将会带来一些美工性质的工作,建飞机模型或者是UI什么的,插一个进度,要不太没意思了。估计要写到30章去啊!