此游戏是根据书上一步一步敲的。是一个入门级别的游戏。
游戏状态机
说到游戏状态机,就不得不提到开发中最常用的MVC模式。
MVC模式的全称是Model-View-Control,他将整个游戏划分为三大模块:模型组件,视图组件和控制器组件。
模型组件是视图组件与控制器组件之间通信的桥梁,比如:在控制主角移动时,系统先通过控制器输入键盘事件并将具体操作信息发送给模型组件,然后模型组件通过一系列的逻辑计
算,得到主角移动后的位置,并将相关信息发送给视图组件,最后视图组件接收消息并将主角的位置正确的显示在屏幕中。
游戏状态机对游戏进行模块化,并且将其划分为很多不同的游戏状态,在脚本最上层用一个变量来记录当前的游戏状态,这样,游戏逻辑与游戏渲染就可以根据当前的
游戏状态来执行各自的任务了。因为这个变量凌驾于MVC模式之上。所以在各自循环中都可以判断当前的游戏状态。
1 using UnityEngine; 2 using System.Collections; 3 4 public class nq01 : MonoBehaviour 5 { 6 7 //游戏界面状态机 8 9 //主菜单界面 10 public const int STATE_MAINMENU = 0; 11 //开始游戏界面 12 public const int STATE_STARTGAME = 1; 13 //游戏设置界面 14 public const int STATE_OPTION = 2; 15 //游戏帮助界面 16 public const int STATE_HELP = 3; 17 //游戏退出界面 18 public const int STATE_EXIT = 4; 19 //GUI皮肤 20 public GUISkin mySkin; 21 22 //游戏背景贴图 23 public Texture textureBG; 24 //开始菜单贴图 25 public Texture tex_startInfo; 26 //帮助菜单贴图 27 public Texture tex_helpInfo; 28 29 //游戏音乐资源 30 public AudioSource music; 31 //当前游戏状态 32 private int gameState; 33 34 // Use this for initialization 35 void Start() 36 { 37 //初始化游戏状态为主菜单界面 38 gameState = STATE_MAINMENU; 39 } 40 41 // Update is called once per frame 42 void Update() 43 { 44 45 } 46 void OnGUI() 47 { 48 switch (gameState) 49 { 50 case STATE_MAINMENU: 51 //绘制主菜单界面 52 RenderMainMenu(); 53 break; 54 case STATE_STARTGAME: 55 //绘制游戏开始界面 56 RenderStart(); 57 break; 58 case STATE_OPTION: 59 //绘制游戏设置界面 60 RenderOption(); 61 break; 62 case STATE_HELP: 63 //绘制游戏帮助界面 64 RenderHelp(); 65 break; 66 case STATE_EXIT: 67 //绘制游戏退出界面 68 //目前直接关闭并退出游戏 69 break; 70 default: 71 break; 72 } 73 } 74 /// <summary> 75 /// 绘制游戏帮助界面 76 /// </summary> 77 private void RenderHelp() 78 { 79 GUI.skin = mySkin; 80 GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), tex_helpInfo); 81 //返回按钮 82 if (GUI.Button(new Rect(0, 500, 403, 78), "", "back")) 83 { 84 gameState = STATE_MAINMENU; 85 } 86 } 87 /// <summary> 88 /// 绘制游戏设置界面 89 /// </summary> 90 private void RenderOption() 91 { 92 GUI.skin = mySkin; 93 GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), textureBG); 94 95 //开启音乐按钮 96 if (GUI.Button(new Rect(0, 0, 403, 75), "", "music_on")) 97 { 98 if (!music.isPlaying) 99 { 100 //播放音乐 101 music.Play(); 102 } 103 } 104 //关闭音乐按钮 105 if (GUI.Button(new Rect(0, 200, 403, 75), "", "music_off")) 106 { 107 //关闭音乐 108 music.Stop(); 109 } 110 //返回按钮 111 if (GUI.Button(new Rect(0, 500, 403, 78), "", "back")) 112 { 113 gameState = STATE_MAINMENU; 114 } 115 } 116 /// <summary> 117 /// 绘制游戏开始界面 118 /// </summary> 119 private void RenderStart() 120 { 121 GUI.skin = mySkin; 122 GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), tex_startInfo); 123 if (GUI.Button(new Rect(0, 500, 403, 78), "", "back")) 124 { 125 gameState = STATE_MAINMENU; 126 } 127 } 128 /// <summary> 129 /// 绘制主菜单界面 130 /// </summary> 131 private void RenderMainMenu() 132 { 133 //设置界面皮肤 134 GUI.skin = mySkin; 135 //绘制游戏背景图 136 GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), textureBG); 137 138 //开始游戏按钮 139 if (GUI.Button(new Rect(0, 30, 623, 153), "", "start")) 140 { 141 //进入开始游戏状态 142 //由于目前处于测试阶段 143 //后期会在这里重新载入新的游戏场景 144 gameState = STATE_STARTGAME; 145 } 146 //游戏设置按钮 147 if (GUI.Button(new Rect(0, 180, 623, 153), "", "option")) 148 { 149 //处于开始游戏状态 150 gameState = STATE_OPTION; 151 } 152 //游戏帮助按钮 153 if (GUI.Button(new Rect(0, 320, 623, 153), "", "help")) 154 { 155 //进入游戏帮助状态 156 gameState = STATE_HELP; 157 } 158 //游戏退出按钮 159 if (GUI.Button(new Rect(0, 470, 623, 153), "", "exit")) 160 { 161 //退出游戏 162 Application.Quit(); 163 } 164 } 165 }