3.4 菜单界面

前一小节介绍了游戏的整体架构,从本节开始将介绍本案例场景的开发。首先介绍本案例的主菜单场景,该场景在游戏开始时呈现,控制所有界面之间的跳转,主要开发步骤介绍如下。

3.4.1 创建项目

在这一小节首先对项目的新建以及资源的准备进行详细的介绍,读者可以通过一些基本的操作,对该游戏的开发有一个较好的开始。详细步骤如下。

(1)新建项目文件夹。首先在电脑的某个磁盘下新建一个空的文件夹“Table3D”,笔者的项目文件夹新建在“F:\U3D”文件夹下,如图3-20所示。

▲图3-20 新建项目文件夹

(2)新建工程。双击桌面的Unity快捷方式打开Unity,选择“Create New Project”,然后单击“Browse...”按钮选择刚刚新建的“PlayBox”空文件夹,最后单击“Create”按钮,如图3-21所示。

▲图3-21 新建工程

(3)导入资源。将本游戏所要用到的资源分类整理好,然后将分类好的资源都复制到项目文件夹下的“Assets”文件夹下,如图3-22所示。

▲图3-22 导入资源

说明

本游戏中所有的资源文件都已经整理好了,放在“第03章/资源包”文件夹下。读者可自行将“第03章/资源包”文件夹下的所有文件夹复制到项目文件夹下的“Assets”文件夹下。

(4)创建脚本文件夹。在项目资源列表中,单击鼠标右键,在弹出的菜单中选择“Create”→“Folder”,创建脚本文件夹,命名为“Scripts”,如 图3-23所示。并用同样的方法,在Scripts文件夹下创建“MenuScript”脚本文件夹和“GameScript”脚本文件夹,如图3-24所示。

▲图3-23 创建脚本文件夹

▲图3-24 创建两个文件夹

(5)创建脚本。单击项目资源列表中的MenuScript文件夹,单击鼠标右键,在弹出的菜单中选择“Create”→“C# Script”,创建脚本,如图3-25所示。将脚本命名为“ConstOfMenu.cs”,如图3-26所示。创建好脚本后,就可以根据游戏开发的相应需要进行编写了。

▲图3-25 创建脚本

▲图3-26 脚本

(6)保存场景。单击菜单栏“File”→“Save Scene”,如图3-27所示。在弹出的界面中选择路径,后输入“MainMenus”,单击“保存”按钮,如图3-28所示,即成功保存下一个主菜单场景。

▲图3-27 选择保存

▲图3-28 保存场景

3.4.2 主菜单场景

前一小节,大家已经对项目的初始化有了很好的理解,下面开始介绍主菜单界面的开发,以及本游戏主菜单界面的开发所需要的各个脚本的功能。

(1)创建点光源。由于本游戏主菜单背景为一个3D立体房间,所以需要一个点光源,使画面清晰明亮。选择“GameObject”→“Create Other”→“Point Light”,如 图3-29所示。调整点光源位置,如图3-30所示。

▲图3-29 创建点光源

▲图3-30 点光源位置摆放

(2)创建房间。本游戏开发的主菜单界面背景是一个3D立体房间,并存在小球和三个木箱。首先创建房间所需的Cue,然后调整位置、姿态、大小,如图3-31所示。

▲图3-31 创建房间

(3)为房间贴纹理。将房间纹理拖曳到房间模型上,如图3-32所示。其中,房间背景墙与其他四面墙的贴图不同。

▲图3-32 房间贴纹理

(4)创建小球和木箱。选择“GameObject”→“Create Other”→“ Sphere”,并命名为“Ball”,如图3-33所示。创建四个木箱,选择“GameObject”→“Create Other”→“Cube”,并命名为“Box”,如图3-34所示。调整它们的位置姿态大小,如图3-35所示。

▲图3-33 创建小球

▲图3-34 创建木箱

▲图3-35 小球木箱摆放位置

(5)添加球体碰撞器。由于球桌需发生碰撞并反弹,所以要为其添加球体碰撞器。首先选中“Ball”游戏对象,然后选择“Component”→“Physics”→“Sphere Collider”,Material则选择为Bouncy。具体情况如图3-36所示。

▲图3-36 添加球体碰撞器

(6)添加刚体。首先选中四个“Box”对象,然后选择“Component”→“Physics”→“Rigidbody”选项,具体情况如图3-37所示。

▲图3-37 添加刚体

(7)编写常量类脚本。双击“ConstOfMenu.cs”脚本,进入“MonoDevelop”编辑器中,开始脚本的编写。该脚本主要负责初始化游戏开发所需用的各类常量。详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的ConstOfMenu.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class ConstOfMenu : MonoBehaviour
      4    {
      5         public static float desiginWidth = 854.0f;           //标准屏宽度
      6         public static float desiginHeight = 480.0f;          //标准屏高度
      7         public static int START_BUTTON = 0;                  //开始按钮图片索引
      8         public static int MUSSIC_BUTTON = 1;                 //音乐设置按钮图片索引
      9         public static int HELP_BUTTON = 2;                   //帮助按钮图片索引
      10              public static int ABOUT_BUTTON = 3;             //关于按钮图片索引
      11              public static int QUIT_BUTTON = 4;              //退出游戏按钮图片索引
      12              public static int BACK_BUTTON = 0;              //返回按钮图片索引
      13              public static int ONE_BUTTON = 0;               //关卡一按钮图片索引
      14              public static int TWO_BUTTON = 1;               //关卡二按钮图片索引
      15              public static int GAME_BACK=0;                  //返回按钮图片索引
      16              public static int ANGLE_OF_VIEW=1;              //视角切换按钮图片索引
      17              public static int UP_BUTTON = 2;                //向上按钮图片索引
      18              public static int DOWN_BUTTON = 3;              //向下按钮图片索引
      19              public static int LEFT_BUTTON = 4;              //向左按钮图片索引
      20              public static int RIGHT_BUTTON = 5;             //向右按钮图片索引
      21              public static int HELP_BACK=0;                  //返回按钮图片索引
      22              public static int HELP_DOWN=1;                  //向下翻页按钮图片索引
      23              public static int HELP_UP=1;                    //向上翻页按钮图片索引
      24              public static int GAMERESULT_BACK_BUTTON = 0;  //返回按钮图片索引
      25              public static int GAMERESULT_REPEAT_BUTTON = 1;//重玩按钮图片索引
      26              public static int GAMERESULT_NEXT_BUTTON = 2;  //继续按钮图片索引
      27              public static int GAMEONE_INDEX;                //索引
      28    }

第4行~第15行声明了标准屏的高度宽度,有便于后续代码开发使用。同时声明了主界面菜单的五个按钮,分别为开始游戏按钮、退出游戏按钮、音乐设置按钮、帮助按钮和关于按钮。同时声明了关卡返回按钮等。

第16行~第20行声明了游戏关卡界面中调整视野范围的按钮,包括将摄像头向上、向下、向左和向右移动的按钮,以及俯瞰和近视两个界面的切换按钮。

第21行~第27行声明了帮助界面上下翻页的两个按钮,和返回主界面按钮索引。同时声明了游戏胜利和游戏结束两个界面的返回按钮、重玩按钮以及继续按钮。

(8)挂载常量类脚本。将Project界面内的常量脚本拖曳到游戏对象“Main Cemera”上,如图3-38和图3-39所示的脚本挂载。

▲图3-38 脚本挂载1

▲图3-39 脚本挂载2

(9)编写主菜单界面脚本“MainLayer.cs”,该脚本主要负责绘制主菜单界面上的按钮。创建脚本以及脚本挂载过程前面已经详细介绍,这里不再赘述。详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的MainLayer.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class MainLayer : MonoBehaviour {
      4         public Texture backgroundOfMainMenu;                      //菜单界面背景图片
      5         public GUIStyle[] buttonStyleOfMain;                      //菜单界面按钮图样式
      6         void Start () {}
      7         void OnGUI()
      8         {
      9               GUI.DrawTexture(newRect(18*Screen.width/100,8*Screen.height/100, //绘制背景图片
      10                 66*Screen.width/100,35*Screen.height/100), backgroundOfMainMenu);
      11              DrawMainMenu();                                      //调用绘制界面方法
      12         }
      13         void DrawMainMenu()                                       //绘制主菜单界面
      14         {
      15              if (GUI.Button(new Rect(91*Screen.width/100,0*Screen.height/100,
      16                    9*Screen.width/100,16*Screen.height/100), "",
      17                    buttonStyleOfMain[ConstOfMenu.QUIT_BUTTON])) {//绘制退出游戏按钮
      18                         Application.Quit();                       //退出程序
      19              }
      20              if (GUI.Button(new Rect(45*Screen.width/100,42*Screen.height/100,
      21                    14*Screen.width/100,25*Screen.height/100), "",
      22                    buttonStyleOfMain[ConstOfMenu.START_BUTTON])) {//绘制开始按钮
      23                         Application.LoadLevel("GamesMenu");      //加载选择关卡界面
      24                         Destroy(this);
      25              }
      26              if (GUI.Button(new Rect(1*Screen.width/100,46*Screen.height/100,
      27                    9*Screen.width/100,16*Screen.height/100), "",
      28                    buttonStyleOfMain[ConstOfMenu.MUSSIC_BUTTON])) {  //绘制设置按钮
      29                         Application.LoadLevel("SetMusic");       //加载设置界面
      30                         Destroy(this);
      31              }
      32              if (GUI.Button(new Rect(1*Screen.width/100,64*Screen.height/100,
      33                    9*Screen.width/100,16*Screen.height/100),"",
      34                    buttonStyleOfMain[ConstOfMenu.HELP_BUTTON])) {//绘制帮助按钮
      35                         Application.LoadLevel("HelpGames");      //加载帮助界面
      36                         Destroy(this);
      37              }
      38              if (GUI.Button(new Rect(1*Screen.width/100,82*Screen.height/100,
      39                    9*Screen.width/100,16*Screen.height/100),
      40                    "", buttonStyleOfMain[ConstOfMenu.ABOUT_BUTTON])){//绘制关于按钮
      41                          Application.LoadLevel("AboutGames");    //加载关于界面
      42                               Destroy(this);
      43         }}
      44         void Update() {
      45              if(Input.GetKeyDown(KeyCode.Escape)){                 //如果按下返回键
      46                    Application.Quit();                            //游戏退出
      47   }}}

第4行~第12行声明菜单界面背景图片以及菜单界面按钮样式,同时在“OnGUI”方法中绘制背景图片,并调用绘制界面方法,绘制主菜单界面。

第13行~第31行绘制了退出游戏按钮、开始游戏按钮以及设置按钮。用户单击退出游戏按钮,便会退出游戏。用户单击开始游戏按钮,便会加载选择关卡界面。用户单击“设置”按钮,加载音乐开关设置界面。

第32行~第46行绘制了帮助界面按钮、关于界面按钮和返回键按钮。用户单击帮助按钮,便加载帮助界面,用户可以查看相关操作内容。单击关于按钮,可以查看游戏相关信息。单击返回键,就会退出游戏。

(10)主菜单界面脚本变量赋值。在该脚本中,需要为游戏标题选择贴图以及五个按钮。首先打开Select Texture列表,然后选择相应贴图,如图3-40所示。

▲图3-40 主菜单界面脚本变量赋值

(11)编写背景音乐脚本。该脚本主要负责开始游戏后背景音乐的播放与否。根据音乐设置界面传递的参数,判断音乐开关与否,详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的StartMusic.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class StartMusic : MonoBehaviour {
      4         public AudioSource MyAudioSource;                         //声明游戏背景音
      5         void Start () {
      6               DontDestroyOnLoad(transform.gameObject);            //保留游戏对象
      7               if(PlayerPrefs.GetInt("offMusic") == 0)             //若音乐索引为0
      8               {
      9                     MyAudioSource.Play();                          //播放音乐
      10         }}
      11         void Update () {
      12              if(PlayerPrefs.GetInt("offMusic") != 0) {           //若音乐索引为1
      13                    this.audio.Pause();                            //音乐暂停
      14              }
      15              var cameras=GameObject.FindGameObjectsWithTag("themain");//摄像机列表
      16              if(cameras.Length>1) {                               //若摄像机多于1个
      17                    GameObject.Destroy(cameras[0]);               //多余的删除
      18   }}}

第4行~第9行声明了游戏背景素材索引,脚本开始方法中,保留挂载音乐的游戏对象,若音乐索引为0,就开始播放音乐。

第11行~第17行判断音乐索引为1,音乐就暂停。同时索取当前场景的摄像机列表,将多余的摄像机游戏对象删除,这样就能保留一个音乐轨道。

(12)编写小球滚动脚本。该脚本主要负责小球根据重力移动。由于手机倾斜度不同,小球不是匀速移动,因此要根据重力加速度为其施加不同速度。详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的BallWalk.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class BallWalk : MonoBehaviour {
      4         public float speed = 10.0f;                          //声明速度
      5         private Vector3 dir = Vector3.zero;                  //声明三维方向向量
      6         void Start () {}
      7         void Update () {
      8               dir.x=Input.acceleration.x;                     //获取X轴重力
      9               dir.z=Input.acceleration.y;                     //获取Z轴重力
      10              dir.y=Input.acceleration.y;                     //获取Y轴重力
      11              this.rigidbody.AddForce(dir.x*speed,dir.y*speed,dir.z*speed);//为小球施加力
      12    }}

说明

由于小球根据重力移动,将初始速度定为10.0f,同时声明X,Y和Z3个方向向量。根据手机倾斜度,判断小球重力加速度,然后调整小球位置。

3.4.3 菜单界面其他场景

前一小节详细介绍了主菜单场景的设计、脚本编写、变量赋值和挂载的主要步骤,下面开始介绍几个子菜单场景的开发,这几个子菜单场景设计较简单,但也是游戏开发的重要部分。

(1)音乐设置场景脚本编写。该脚本主要负责绘制和控制游戏背景音乐开关设置,脚本详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的MusicLayer.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class MusicLayer : MonoBehaviour
      4    {
      5         public Texture backgroundOfMusicLayer;                   //菜单界面背景图片
      6         public Texture2D[] musicBtns;                             //声明音乐按钮数组
      7         public Texture2D musicTex;                                //声音按钮对应的图片
      8         public Texture2D[] effectBtns;                            //声明音效按钮数组
      9         public Texture2D effectTex;                               //音效按钮对应的图片
      10         private int effectIndex;                                  //音效索引
      11         private int musicIndex;                                   //音乐索引
      12         public GUIStyle btStyle;                                  //按钮样式
      13         public GUIStyle[] buttonStyleOfMusicLayer;               //菜单界面按钮图样式
      14         void Start(){
      15              effectIndex = PlayerPrefs.GetInt("offEffect");      //初始化音效索引
      16              musicIndex = PlayerPrefs.GetInt("offMusic");        //初始化音乐索引
      17         }
      18         void OnGUI()
      19         {
      20              GUI.DrawTexture(new Rect(0,0,1*Screen.width,
      21                  1*Screen.height), backgroundOfMusicLayer);      //绘制背景图片
      22              GUI.DrawTexture(new Rect(30*Screen.width/100,15*Screen.height/100,
      23                  30*Screen.width/100,20*Screen.height/100), musicTex);
      24              if (GUI.Button(new Rect(65*Screen.width/100,14*Screen.height/100,
      25                  13*Screen.width/100,20*Screen.height/100),
      26                  musicBtns[musicIndex % 2], btStyle)){
      27                      musicIndex++;                               //按钮索引加一
      28                      PlayerPrefs.SetInt("offMusic", musicIndex % 2);
                                                                  //将新的按钮索引存入prefer中
      29              }
      30              GUI.DrawTexture(new Rect(30*Screen.width/100,40*Screen.height/100,
                                                                            //绘制显示图片
      31                  30*Screen.width/100,20*Screen.height/100), effectTex);
      32              if (GUI.Button(new Rect(65*Screen.width/100,40*Screen.height/100,
      33                  13*Screen.width/100,20*Screen.height/100),
      34                  effectBtns[effectIndex % 2], btStyle)){
      35                        effectIndex++;                             //按钮索引加一
      36                        PlayerPrefs.SetInt("offEffect", effectIndex % 2);
                                                                  //将新的按钮索引存入prefer中
      37              }
      38              if (GUI.Button(new Rect(91*Screen.width/100,0*Screen.height/100,
      39                  9*Screen.width/100,16*Screen.height/100),       //绘制返回按钮
      40                  "", buttonStyleOfMusicLayer[ConstOfMenu.BACK_BUTTON])){
      41                        Application.LoadLevel("MainMenus");       //返回主菜单界面
      42         }}
      43         void Update() {
      44              if(Input.GetKeyDown(KeyCode.Escape)){               //如果按下返回键
      45                    Application.LoadLevel("MainMenus");           //加载主菜单界面
      46   }}}

第5行~第13行声明了菜单界面背景图片、音乐按钮数组和音乐按钮对应的图片、音效按钮数组和音效按钮对应的图片,以及音乐音效的索引和菜单界面按钮图样式。

第14行~第23行表示在“Start”方法中初始化音乐索引和音效索引,这些索引用于判断游戏初始化的时候音乐音效是开启或者关闭。同时在“OnGUI”方法中绘制了该界面的背景图片。

第24行~第41行绘制了音乐按钮数组和音乐按钮对应的图片、音效按钮数组和音效按钮对应的图片,当用户单击的时候,每个按钮索引加1,表示随时切换对应图片,同时将索引存入PlayerPrefs。方便其他代码部分使用。

第43行~第45行表示当用户按下返回键的时候,游戏退出音乐设置界面,返回主菜单界面,并且加载主菜单界面的场景。

(2)设置场景脚本变量赋值和挂载。该脚本挂载在“Main Camera”摄像机游戏对象上,脚本变量赋值如图3-41所示,挂载步骤在前面详细介绍过,这里不再赘述。

▲图3-41 设置场景脚本变量赋值

(3)帮助场景脚本编写。该场景主要负责介绍游戏相关玩法。在该场景中有两个“Plane”对象,贴图为帮助界面背景素材图。同时有一个“Main Camera”摄像机游戏对象,在该游戏对象上挂载了“HelpLayer”脚本组件,脚本详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的HelpLayer.cs。

        1    using UnityEngine;
        2    using System.Collections;
        3    public class HelpLayer : MonoBehaviour {
        4         public GameObject[] cameras;                         //摄像机列表
        5         public GUIStyle[] buttonStyleOfHelpLayer;            //菜单界面按钮图样式
        6         public static int curCam = 0;                        //当前摄像机编号
        7         void Start () {}
        8         void OnGUI(){
        9               if (GUI.Button(new Rect(91*Screen.width/100,0*Screen.height/100,
        10                    9*Screen.width/100,16*Screen.height/100), "",     //绘制返回按钮
        11                    buttonStyleOfHelpLayer[ConstOfMenu.HELP_BACK])) {//若选择返回按钮
        12                          Application.LoadLevel("MainMenus"); //返回主菜单界面
        13              }
        14              if (GUI.Button(new Rect(91*Screen.width/100,18*Screen.height/100,
        15                    9*Screen.width/100,16*Screen.height/100), "", //绘制向下翻页按钮
        16                    buttonStyleOfHelpLayer[ConstOfMenu.HELP_DOWN])) { //若选择该按钮
        17                    ChangeCam(1);                             //切换摄像机
        18         }}
        19         public void ChangeCam(int index){                    //切换摄像机方法
        20              cameras[curCam].SetActive(false);               //设置当前摄像机不可用
        21              cameras[index].SetActive(true);                 //启用相应摄像机
        22         }
        23         void Update() {
        24              if(Input.GetKeyDown(KeyCode.Escape)){           //若按下返回键
      25                    Application.LoadLevel("MainMenus");       //返回主菜单界面
      26   }}}

第4行~第6行声明了摄像机列表,存在两个摄像机,用于切换镜头,实现帮助界面翻页功能。同时声明了菜单界面按钮图样式和当前摄像机编号。

第8行~第18行绘制了帮助界面的返回按钮,用于返回主菜单界面,以及向下翻页按钮,用于实现翻页功能。在用户按下翻页按钮的同时,会切换当前摄像机。

第19行~第25行是切换摄像机的方法,即关闭当前摄像机,激活另一个编号的摄像机。由于两个摄像机所对应的画面不同,也就间接实现了帮助界面的翻页功能。

(4)在帮助场景中,为了实现用户单击翻页按钮,进行翻页的功能,该场景有一个“Camera”摄像机游戏对象,并被挂载了“HelpLayerBack”脚本组件,脚本详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的HelpLayerBack.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class HelpLayer : MonoBehaviour {
      4         public GameObject[] cameras;                              //摄像机列表
      5         public GUIStyle[]buttonStyleOfHelpLayerBack;             //菜单界面按钮图样式
      6         public static int curCam = 0;                             //当前摄像机编号
      7         void Start () {}
      8         void OnGUI(){
      9               if (GUI.Button(new Rect(91*Screen.width/100,0*Screen.height/100,
      10                    9*Screen.width/100,16*Screen.height/100), "", //绘制返回按钮
      11                    buttonStyleOfHelpLayerBack [ConstOfMenu.HELP_BACK])){//若选择返回按钮
      12                         Application.LoadLevel("MainMenus");      //返回主菜单界面
      13              }
      14              if (GUI.Button(new Rect(91*Screen.width/100,18*Screen.height/100,
      15                    9*Screen.width/100,16*Screen.height/100), "", //绘制向上翻页按钮
      16                    buttonStyleOfHelpLayerBack [ConstOfMenu.HELP_DOWN])) { //若选择该按钮
      17                    ChangeCam(0);                                  //切换摄像机
      18         }}
      19         public void ChangeCam(int index) {                       //切换摄像机方法
      20              cameras[curCam].SetActive(false);                   //设置当前摄像机不可用
      21              cameras[index].SetActive(true);                     //启用相应摄像机
      22         }
      23         void Update() {
      24              if(Input.GetKeyDown(KeyCode.Escape)){               //若按下返回键
      25                    Application.LoadLevel("MainMenus");           //返回主菜单界面
      26   }}}

第4行~第6行声明了摄像机列表,存在两个摄像机,用于切换镜头,实现帮助界面翻页功能。同时声明了菜单界面按钮图样式和当前摄像机编号。

第8行~第17行绘制了帮助界面的返回按钮,用于返回主菜单界面,以及向上翻页按钮,用于实现翻页功能。在用户按下翻页按钮的同时,会切换当前摄像机。

第20行~第25行是切换摄像机的方法,即关闭当前摄像机,激活另一个编号的摄像机。由于两个摄像机所对应的画面不同,也就间接实现了帮助界面的翻页功能。

(5)帮助场景翻页设计。由于在帮助场景中实现了翻页的功能,所以两个摄像机游戏对象的设置不同,要去掉“Camera”游戏对象属性查看器中对象名称前单选框中的对勾,保留“Main Camera” 对象名称前单选框中的对勾,如图3-42、图3-43所示。

▲图3-42 去掉单选框的对勾

▲图3-43 保留单选框的对勾

(6)帮助场景脚本变量赋值。“HelpLayer.cs”和“HelpLayerBack.cs”两个脚本分别挂载在“Main Camera”摄像机游戏对象和“Camera”摄像机游戏对象上,脚本变量赋值如图3-44、图3-45所示。

▲图3-44 脚本变量赋值

▲图3-45 脚本变量赋值

(7)关于场景制作。该场景主要负责介绍游戏相关版权等。在该场景中有一个“Main Camera”摄像机游戏对象,在该游戏对象上挂载了“AboutLayer”脚本组件,脚本详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的AboutLayer.cs。

        1    using UnityEngine;
        2    using System.Collections;
        3    public class AboutLayer : MonoBehaviour {
        4         public Texture aboutOfAboutLayer;                         //关于界面背景图片
        5         public GUIStyle[] buttonStyleOfAboutLayer;               //菜单界面按钮图样式
        6         void Start () {}
        7         void OnGUI()                                               //绘制方法
        8         {
        9               GUI.DrawTexture(new Rect(0,0,1*Screen.width,
        10                  1*Screen.height), aboutOfAboutLayer);           //绘制背景图片
        11              if (GUI.Button(new Rect(1*Screen.width/100,75*Screen.height/100,
        12                  17*Screen.width/100,20*Screen.height/100), "",
        13                  buttonStyleOfAboutLayer[ConstOfMenu.BACK_BUTTON])){//如果选择返回键
        14                       Application.LoadLevel("MainMenus");        //返回主菜单界面
        15         }}
        16         void Update() {
        17              If(Input.GetKeyDown(KeyCode.Escape)){               //如果按下返回键
        18                    Application.LoadLevel("MainMenus");           //返回主菜单界面
        19   }}}

第4行~第10行声明了关于界面的背景图片以及该界面的按钮样式,同时在“OnGUI”绘制方法中,绘制了关于界面的背景图片。

第11行~第18行绘制了返回按钮图片,同时当用户单击该按钮的时候加载主菜单界面。当用户按下返回键的时候,游戏返回主菜单界面。

(8)关于场景脚本变量赋值。该脚本挂载在“Main Camera”摄像机游戏对象上,脚本变量赋值如图3-46所示。挂载步骤在前面详细介绍过,这里不再赘述。

▲图3-46 关于场景脚本变量赋值

(9)选择关卡场景制作。该场景主要负责用户选择游戏关卡。在该场景中有一个“Main Camera”摄像机游戏对象,在该游戏对象上挂载了“ChoiceLayer”脚本组件,脚本详细代码如下。

代码位置:见随书光盘中源代码/第03章/PlayBox/Assets/Scripts/MenuScript目录下的ChoiceLayer.cs。

      1    using UnityEngine;
      2    using System.Collections;
      3    public class ChoiceLayer : MonoBehaviour {
      4         public Texture backgroundOfChoiceMenu;                   //菜单界面背景图片
      5         public GUIStyle[] buttonStyleOfChoice;                   //菜单界面按钮图样式
      6         public GUIStyle[] buttonStyleOfChoiceLayer;              //菜单界面按钮图样式
      7         void OnGUI()
      8         {
      9               GUI.DrawTexture(new Rect(0, 0,1*Screen.width,1*Screen.height),
      10                  backgroundOfChoiceMenu);                        //绘制背景图片
      11              if (GUI.Button(new Rect(19*Screen.width/100,19*Screen.height/100,
      12                  20*Screen.width/100,30*Screen.height/100), "", buttonStyleOfChoice[0])){
      13                  Application.LoadLevel("GameOne");               //加载游戏关卡一
      14              }
      15              if (GUI.Button(new Rect(45*Screen.width/100,19*Screen.height/100,
      16                  20*Screen.width/100,30*Screen.height/100), "", buttonStyleOfChoice[1])){
      17                  Application.LoadLevel("GameTwo");               //加载关卡二
      18         }
      19              if (GUI.Button(new Rect(19*Screen.width/100,54*Screen.height/100,
      20                  20*Screen.width/100,30*Screen.height/100), "", buttonStyleOfChoice[2])){
      21                  Application.LoadLevel("GameThree");             //加载关卡三
      22         }
      23              if (GUI.Button(new Rect(45*Screen.width/100,54*Screen.height/100,
      24                  20*Screen.width/100,30*Screen.height/100), "", buttonStyleOfChoice[3])){
      25                  Application.LoadLevel("GameFour");              //加载关卡四
      26         }
      27              if (GUI.Button(new Rect(91*Screen.width/100,0*Screen.height/100,
      28                    9*Screen.width/100,16*Screen.height/100), "",
      29                    buttonStyleOfChoiceLayer[ConstOfMenu.BACK_BUTTON])) { //返回按钮
      30                    Application.LoadLevel("MainMenus");           //加载主菜单界面
      31         }}
      32         void Update() {
      33              if(Input.GetKeyDown(KeyCode.Escape)){               //如果按下返回键
      34             Application.LoadLevel("MainMenus");                  //返回主菜单界面
      35   }}}

第4行~第10行声明了选择关卡界面的背景图片以及该界面的按钮样式和关卡按钮的按钮样式。同时在“OnGUI”绘制方法中,绘制了该界面的背景图片。

第11行~第30行绘制了四个关卡的关卡按钮图片,当用户单击相应按钮的时候,会加载相应关卡的游戏场景。

第27行~第34行绘制了返回按钮,当用户按下返回按钮的时候,该游戏返回主菜单界面。当用户按下返回键的时候,同样返回主菜单界面。

(10)选择关卡场景脚本变量赋值。该脚本挂载在“Main Camera”摄像机游戏对象上,脚本变量赋值如图3-47所示。挂载步骤在前面详细介绍过,这里不再赘述。

▲图3-47 选择关卡场景脚本变量赋值