- Unity游戲案例開發大全
- 吳亞峰 杜化美 于復興編著
- 2467字
- 2019-01-02 05:50:20
3.5 游戲界面
上一節已經介紹了所有菜單界面的開發過程,本節將要介紹的游戲界面是本游戲開發的中心場景,其他的場景都是為此場景服務的,游戲場景的開發對于此游戲的可玩性有至關重要的作用。在本節中,將對此界面的開發進行進一步的介紹。
3.5.1 游戲關卡場景制作
搭建游戲界面場景的步驟比較繁瑣,由于篇幅的限制這里不能很詳細地介紹每一個細節,因此要求讀者對Unity的基礎知識有一定的了解。接下來以游戲關卡一為例,對游戲界面的開發步驟進行具體的介紹。
(1)新建場景。選擇“File”→“New Scene”,然后選擇“File”→“Save Scene”選項(或者Ctrl+S),在保存對話框中輸入場景名“GameScene”,如圖3-48所示。

▲圖3-48 新建場景
(2)創建定向光源。選擇“GameObject”→“Create Other”→“Directional Light”后會自動創建一個定向光源,如圖3-49所示。調整定向光源位置,如圖3-50所示。

▲圖3-49 創建定向光源

▲圖3-50 定向光源位置擺放
(3)導入迷宮模型。將迷宮模型拖入游戲場景,并為其貼圖,如圖3-51所示。調整其位置、姿態、大小,如圖3-52所示。

▲圖3-51 為迷宮貼圖

▲圖3-52 擺放迷宮位置
(4)小球和木箱的制作。在前面的章節已經詳細介紹,這里不再贅述,將小球命名為“Ball1”,置于迷宮中,調整位置、姿態、大小,如圖3-53所示。將木箱集體放入“Boxs”組中,置于迷宮的通道中,調整位置、姿態、大小,如圖3-54所示。

▲圖3-53 小球的大小和擺放

▲圖3-54 木箱的大小和擺放
(5)創建勝利的平面。選擇“GameObject”→“Create Other”→“Plane”選項,并命名為“PlaneTrigger”,如 圖3-55所示。然后調整平面位置、姿態和大小,置于“GameOneFloor”游戲對象內。由于該平面用于觸發游戲界面判定,所以需要勾選游戲對象屬性中“Is Trigger”后的單選框,其各項參數如圖3-56所示。

▲圖3-55 創建平面

▲圖3-56 平面參數
(6)創建地板的平面。選擇“GameObject”→“Create Other”→“Plane”選項,命名為“BallFallTrigger”,然后調整平面位置、姿態和大小,并為其貼圖,置于“GameOneFloor”游戲對象下方。由于該平面用于觸發游戲界面判定,所以需要勾選游戲對象屬性中“Is Trigger”后的單選框,其各項參數如圖3-57所示。
(7)添加盒子碰撞器。為木箱和迷宮的墻添加盒子碰撞器。首先選中“Boxs”組中的所有Cube游戲對象,和“GameOneFloor”地板中的“Box002”—“Box030”和“Box031”—“Box032”游戲對象,然后選擇“Component”→“Physics”→“Box Collider”,具體情況如圖3-58所示。

▲圖3-57 地板平面
(8)添加剛體。首先選中“Ball1”對象和“Boxs”組中的所有Cube游戲對象,以及“GameOneFloor”地板中的“Box002”—“Box030”和“Box031”—“Box032”游戲對象,然后選擇“Component”→“Physics”→“Rigidbody”選項,具體情況如圖3-59所示。

▲圖3-58 添加盒子碰撞器

▲圖3-59 添加剛體
(9)關卡二制作的簡要講解。由于其他關卡和關卡一制作類似,就不再贅述。關卡二的特點在于本關導入了一些裝飾模型,如圖3-60所示,這3棵樹木模型的位置大小如圖3-61、圖3-62、圖3-63所示。在本關卡中,還有勻速旋轉的木條作為路障,該木條的勻速旋轉將后續進行細致講解。

▲圖3-60 樹木模型

▲圖3-61 樹木模型大小位置1

▲圖3-62 樹木模型大小位置2

▲圖3-63 樹木模型大小位置3
(10)關卡3制作的簡要講解。關卡3的特點在于本關導入了鉛筆的裝飾模型,這兩個鉛筆模型的位置大小如圖3-64、圖3-65所示。本關卡是封閉型的迷宮,小球掉入縫隙也會導致游戲失敗,所以玩家需要借助木箱的鋪墊,才能順利到達終點。

▲圖3-64 鉛筆模型大小位置1

▲圖3-65 鉛筆模型大小位置2
(11)關卡4制作的簡要講解。關卡四的特點在于本關是兩個迷宮相連的形式,小球必須通過兩個迷宮相連的軌道,才能順利到達目的地,如圖3-66所示。

▲圖3-66 關卡四的軌道
3.5.2 多視角的制作與切換
上一小節已經介紹了游戲界面的搭建過程,本小節將向讀者介紹多視角的制作與切換。本游戲中主要有兩個攝像機,游戲運行時,攝像機根據玩家切換視角的情況只有一個處于激活狀態。具體的開發步驟如下。
(1)制作主攝像機。調整主攝像機“Main Camera”攝像機到適當位置,并設置“Field of View”屬性值為60,去掉屬性查看器中對象名稱前單選框中的對勾,如圖3-67所示。

▲圖3-67 制作主攝像機
(2)制作第一人稱攝像機。首先選擇“GameObject”→“Create Other”→“Camera”新建一個攝像機對象,命名為“FirstCamera”。然后調整攝像機到適當位置,可調整“Field of View”屬性值為60,如圖3-68所示。

▲圖3-68 制作第一人稱攝像機
(3)編寫第一人稱攝像機掛載腳本。該腳本主要負責繪制游戲關卡的界面,包括游戲關卡的返回按鈕,切換鏡頭按鈕和移動第一人稱攝像機位置的方向按鈕。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的GameLayer.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class GameLayer : MonoBehaviour { 4 public GameObject[] cameras; //攝像機列表 5 public GUIStyle[] buttonStyleOfGameLayer; //按鈕樣式 6 public static int curCam = 0; //當前攝像機編號 7 void Start () {} 8 void OnGUI(){ 9 if (GUI.Button(new Rect(90*Screen.width/100,1*Screen.height/100, 10 9*Screen.width/100,16*Screen.height/100), "", 11 buttonStyleOfGameLayer[ConstOfMenu.GAME_BACK])) { //繪制返回按鈕 12 Application.LoadLevel("GamesMenu"); //返回選擇關卡界面 13 } 14 if (GUI.Button(new Rect(11*Screen.width/100,65*Screen.height/100, 15 9*Screen.width/100,16*Screen.height/100), "", 16 buttonStyleOfGameLayer[ConstOfMenu.ANGLE_OF_VIEW])) {//繪制切換相機按鈕 17 ChangeCam(1); //切換至1號攝像機 18 } 19 if (GUI.Button(new Rect(11*Screen.width/100,47*Screen.height/100, 20 9*Screen.width/100,16*Screen.height/100), "", 21 buttonStyleOfGameLayer[ConstOfMenu.UP_BUTTON])) { //繪制向上按鈕 22 cameras[curCam].transform.Translate(new Vector3(0, 30* Time.deltaTime,0)); 23 } 24 if (GUI.Button(new Rect(11*Screen.width/100,83*Screen.height/100, 25 9*Screen.width/100,16*Screen.height/100), "", 26 buttonStyleOfGameLayer[ConstOfMenu.DOWN_BUTTON])) {//繪制向下按鈕 27 cameras[curCam].transform.Translate(new Vector3(0,-30*Time.deltaTime,0)); 28 } 29 if (GUI.Button(new Rect(1*Screen.width/100,65*Screen.height/100, 30 9*Screen.width/100,16*Screen.height/100), "", 31 buttonStyleOfGameLayer[ConstOfMenu.LEFT_BUTTON])) {//繪制向左按鈕 32 cameras[curCam].transform.Translate(new Vector3(-30* Time.deltaTime,0,0)); 33 } 34 if (GUI.Button(new Rect(21*Screen.width/100,65*Screen.height/100, 35 9*Screen.width/100,16*Screen.height/100), "", 36 buttonStyleOfGameLayer[ConstOfMenu.RIGHT_BUTTON])) { //繪制向右按鈕 37 cameras[curCam].transform.Translate(new Vector3(30 * Time.deltaTime,0,0)); 38 }} 39 void Update() { 40 if(Input.GetKeyDown(KeyCode.Escape)){ //如果按下返回鍵 41 Application.LoadLevel("GamesMenu"); //返回選擇關卡界面 42 }} 43 public void ChangeCam(int index){ //切換攝像機方法 44 cameras[curCam].SetActive(false); //設置當前攝像機不可用 45 cameras[index].SetActive(true); //啟用相應攝像機 46 }}
第4行~第6行聲明了游戲第一人稱視角界面的按鈕樣式、攝像機列表,以及當前攝像機索引。在這里,將第一人稱視角的攝像機和俯視攝像機分別編為0號和1號,方便操控。
第10行~第42行繪制了游戲第一人稱視角界面的五個按鈕,分別為返回選擇關卡按鈕,切換視角按鈕,和上、下、左、右4個方向移動當前攝像機的四個按鈕,以及按下按鈕的處理方法。
第43行~第45行表示當用戶在游戲界面按下返回鍵,則加載選擇關卡界面。同時介紹了切換攝像機的方法“ChangeCam”,在該方法中設置當前攝像機不可用,然后啟用另一個攝像機,以達到切換視角的目的。
(4)游戲第一人稱界面腳本的變量賦值。在這里,攝像機列表的Size輸入2,包括兩個攝像機互相切換。按鈕的Size輸入6,共有六個按鈕需要賦予相應貼圖。詳細如圖3-69所示。

▲圖3-69 游戲第一人稱界面腳本變量賦值
(5)編寫俯視攝像機掛載腳本。該攝像機能俯看整個迷宮地圖,但是在該視角下,不能拖動木箱。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的LookAllGameLayer.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class LookAllGameLayer : MonoBehaviour { 4 public GameObject[] cameras; //攝像機列表 5 public GUIStyle[] buttonStyleOfLookAllGameLayer; //按鈕樣式 6 public static int curCam = 1; //當前攝像機編號 7 void Start () {} 8 void Update () {} 9 void OnGUI(){ 10 if (GUI.Button(new Rect(91*Screen.width/100,1*Screen.height/100, 11 9*Screen.width/100,16*Screen.height/100), "", //繪制返回按鈕 12 buttonStyleOfLookAllGameLayer[ConstOfMenu.GAME_BACK])){ 13 Application.LoadLevel("GamesMenu"); //返回選擇關卡界面 14 } 15 if (GUI.Button(new Rect(81*Screen.width/100,1*Screen.height/100, 16 9*Screen.width/100,16*Screen.height/100), "", //繪制切換視角按鈕 17 buttonStyleOfLookAllGameLayer[ConstOfMenu.ANGLE_OF_VIEW])) { 18 ChangeCam(0); //切換攝像機 19 }} 20 public void ChangeCam(int index) { //切換攝像機方法 21 cameras[curCam].SetActive(false); //設置當前攝像機不可用 22 cameras[index].SetActive(true); //啟用相應攝像機 23 }}
第4行~第6行聲明了游戲俯視視角界面的按鈕樣式、攝像機列表,以及當前攝像機索引。在這里,將第一人稱視角的攝像機和俯視攝像機分別編為0號和1號,方便操控。
第9行~第18行繪制了返回按鈕,當用戶單擊該按鈕的時候,加載游戲選擇關卡界面。同時繪制了切換視角按鈕,當用戶單擊該按鈕的時候,從俯視角切換到第一人稱視角。
第20行~第22行介紹了切換攝像機的方法。在該方法中,將當前俯視視角的攝像機設置為不可用,同時激活第一人稱視角的攝像機。
(6)游戲俯視界面腳本的變量賦值。在這里,攝像機列表的Size輸入2,包括兩個攝像機互相切換。按鈕的Size輸入2,共有兩個按鈕需要賦予相應貼圖。詳細如圖3-70所示。

▲圖3-70 游戲俯視界面腳本變量賦值
3.5.3 游戲關卡腳本的編寫
上一小節已經介紹了游戲場景和游戲多視角的制作過程,本小節將向讀者介紹游戲界面繪制和功能完善的相關腳本。每個腳本負責游戲關卡不同的功能部分,詳細的編寫介紹如下。
(1)編寫重力小球腳本。該腳本主要負責四個游戲關卡中的小球如何隨著用戶終端傾斜而改變移動方向和速度,在4個關卡中,“Ball1”、“Ball2”、“Ball3”以及“Ball4”4個游戲對象都分別掛載了該腳本,具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的BallMove.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class BallMove : MonoBehaviour { 4 public float speed = 10.0f; //初始化速度 5 private Vector3 dir = Vector3.zero; //聲明方向向量 6 void Update() { 7 dir.x=Input.acceleration.x; //獲取X軸加速度 8 dir.z=Input.acceleration.y; //獲取Y軸加速度 9 this.rigidbody.AddForce(dir.x*speed,0,dir.z*speed); //移動小球 10 }}
說明
由于小球根據重力在迷宮平面上移動,因此將初始速度定為10.0f,同時聲明X,Y兩個方向向量。根據手機傾斜度,判斷小球重力加速度,然后調整小球位置。
(2)四個關卡中小球的初始位置以及大小分別如圖3-71、圖3-72、圖3-73和圖3-74所示。玩家需要根據整體地圖的路線,來選擇哪一條路最快最順利到達終點。

▲圖3-71 關卡一小球位置大小

▲圖3-72 關卡二小球位置大小

▲圖3-73 關卡三小球位置大小

▲圖3-74 關卡四小球位置大小
(3)編寫拖曳木箱腳本。該腳本主要負責在游戲迷宮中當作阻礙的木箱能被用戶用手指拖曳移動,四個關卡中的所有木箱游戲對象都分別掛載了該腳本,具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的DragObject.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class DragObject : MonoBehaviour { 4 private Vector3 screenPosition; //聲明屏幕坐標 5 private Vector3 position; //聲明游戲空間坐標 6 private Vector3 tempPosition; //聲明變換坐標 7 void OnMouseDown() { 8 screenPosition=Camera.main.WorldToScreenPoint (transform.position); 9 position=transform .position -Camera.main.ScreenToWorldPoint ( 10 new Vector3 (Input.mousePosition.x, //變換坐標 11 Input.mousePosition.y ,screenPosition.z)); //用戶單擊坐標 12 StartCoroutine (ChangePosition()); //改變位置 13 } 14 IEnumerator ChangePosition () { 15 while (Input .GetMouseButton(0)){ //根據用戶觸碰目標點 16 tempPosition = Camera.main.ScreenToWorldPoint( 17 new Vector3 (Input.mousePosition.x,Input.mousePosition.y ,screen Position.z)); 18 transform.position = tempPosition + position ; //改變木箱位置 19 yield return null; 20 }}}
第4地~第12行聲明了所需的3個坐標位置,由于用戶觸碰在手機上的點需要轉換為游戲空間中的坐標點,才能使木箱根據手指的移動而移動,在“OnMouseDown”方法中,便根據轉換坐標系,調用“ChangePosition”改變位置方法。
第14行~第19行介紹了“ChangePosition”改變位置方法,在該方法中,根據手指的移動位置,將木箱變換到指定位置,這樣便實現了木箱被拖曳的功能。
(4)下面介紹迷宮笑臉終點觸發游戲結果腳本。該腳本主要負責當小球順利通過迷宮,滾動到該處的時候,觸發游戲勝利結果,具體代碼如下。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的PlaneTrigger.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class PlaneTrigger : MonoBehaviour { 4 void OnTriggerEnter(Collider other){ //觸發結果方法 5 if(other.transform.name == "Ball1") { //若小球為Ball1 6 Application.LoadLevel("GameWin"); //加載游戲勝利場景 7 ConstOfMenu.GAMEONE_INDEX=1; //設置該索引為1 8 } 9 else if(other.transform.name == "Ball2"){ //若小球為Ball2 10 Application.LoadLevel("GameWin"); //加載游戲勝利場景 11 ConstOfMenu.GAMEONE_INDEX=2; //設置該索引為2 12 } 13 else if(other.transform.name == "Ball3"){ //若小球為Ball3 14 Application.LoadLevel("GameWin"); //加載游戲勝利場景 15 ConstOfMenu.GAMEONE_INDEX=3; //設置該索引為3 16 } 17 else if(other.transform.name == "Ball4"){ //若小球為Ball4 18 Application.LoadLevel("GameWin"); //加載游戲勝利場景 19 ConstOfMenu.GAMEONE_INDEX=4; //設置該索引為4 20 }}}
第4行~第20行為小球觸發結果方法,當小球滾動到指定笑臉位置,表示該關游戲勝利。由于每個關卡順利通過后,會顯示游戲勝利界面,在該界面會有“重玩”和“繼續”的按鈕,所以需要判斷當前通過的是哪關,這里為四個關卡的4個小球命名不同,便解決了這個問題。
第5行~第19行表示,當到達終點的小球為“Ball1”時,表示玩家將順利通過第一關,所以加載游戲勝利場景的同時會將索引“GAMEONE_INDEX”置為1。同樣地,其他游戲關卡也會因為不同的小球將索引置為不同數字,方便游戲結果界面使用該索引。
(5)游戲終點笑臉。4個關卡的終點笑臉有不同的貼圖素材,要根據每一關的主題風格,選擇合適的笑臉貼圖。游戲關卡1的笑臉位置大小在前面的章節已經詳細介紹過,這里不再贅述。游戲關卡2、關卡3和關卡4的笑臉大小、位置和貼圖效果如圖3-75、圖3-76和圖3-77所示。

▲圖3-75 關卡2笑臉終點位置大小

▲圖3-76 關卡3笑臉終點位置大小

▲圖3-77 關卡4笑臉終點位置大小
(6)編寫小球掉落觸發結果腳本。該腳本主要負責當小球從迷宮掉落出來落在地板上時,就要觸發游戲失敗結果,具體代碼如下。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的BallFallTrigger.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class BallFallTrigger : MonoBehaviour{ 4 void OnTriggerEnter(Collider other) { 5 if(other.transform.name == "Ball1") { //若小球索引為Ball1 6 Application.LoadLevel("GameLose"); //加載游戲失敗界面 7 ConstOfMenu.GAMEONE_INDEX=1; //將索引值設為1 8 } 9 else if(other.transform.name == "Ball2"){ //若小球索引為Ball2 10 Application.LoadLevel("GameLose"); //加載失敗界面 11 ConstOfMenu.GAMEONE_INDEX=2; //將索引值設為2 12 } 13 else if(other.transform.name == "Ball3") { //若小球索引為Ball3 14 Application.LoadLevel("GameLose"); //加載失敗界面 15 ConstOfMenu.GAMEONE_INDEX=3; //將索引值設為3 16 } 17 else if(other.transform.name == "Ball4"){ //若小球索引為Ball4 18 Application.LoadLevel("GameLose"); //加載失敗界面 19 ConstOfMenu.GAMEONE_INDEX=4; //將索引值設為4 20 }}}
第4行~第20行為小球觸發結果方法,當小球滾落到地板上,表示該關游戲失敗。由于每個關卡失敗后,會顯示游戲失敗界面,在該界面會有“重玩”的按鈕,所以需要判斷當前失敗的是哪關,這里為4個關卡的4個小球命名不同,便解決了這個問題。
第5行~第19行表示,當掉落的小球為“Ball1”時,表示玩家將第一關失敗,所以加載游戲失敗場景的同時會將索引“GAMEONE_INDEX”置為1。同樣地,其他游戲關卡也會因為不同的小球將索引置為不同數字,方便游戲結果界面使用該索引。
(7)編寫木塊勻速旋轉腳本。該腳本主要負責在游戲關卡2中,設計一塊勻速旋轉的木塊,用于阻礙小球順利通過迷宮,具體代碼如下。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的CubRotation.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class CubRotation : MonoBehaviour { 4 public GameObject cub; //聲明游戲對象 5 void Start () {} 6 void Update () { 7 cub.transform.Rotate(0,0,30 * Time.deltaTime); //勻速繞z軸旋轉 8 }}
說明
首先聲明了游戲對象cub木條,然后通過Rotate變換,勻速繞著z軸旋轉,形成了木條在迷宮地板上勻速旋轉的效果。
(8)游戲關卡2的木條,為了配合該關卡的綠地主題,該木條也被貼上樹干的素材貼圖,該木條在綠地上大小位置效果如圖3-78所示。

▲圖3-78 關卡2勻速旋轉木條
(9)編寫機械圓盤勻速旋轉腳本。該腳本主要負責在游戲關卡4中,設計一塊勻速旋轉的機械圓盤,用于阻礙小球順利通過迷宮,具體代碼如下。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的Cub2Rotation.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class Cub2Rotation : MonoBehaviour { 4 public GameObject cub; //聲明游戲對象 5 void Start () {} 6 void Update () { 7 cub.transform.Rotate(0,0, 40 * Time.deltaTime); //繞Z軸勻速旋轉 8 }}
說明
首先聲明了游戲對象cub,然后通過Rotate變換,勻速繞著z軸旋轉,形成了機械圓盤在迷宮地板上勻速旋轉的效果。
(10)游戲關卡4的圓盤,為了配合該關卡的綠地主題,該圓盤也被貼上樹干的素材貼圖,該圓盤在綠地上大小位置效果如圖3-79所示。

▲圖3-79 關卡4勻速旋轉圓盤
3.5.4 游戲結果場景
上一小節已經介紹了游戲場景的相關設計開發,本小節將向讀者介紹關于游戲結果場景的相關開發。游戲結果場景分為勝利場景和失敗場景,詳細開發過程如下。
(1)編寫游戲勝利場景腳本。在游戲勝利場景中有3個按鈕,分別為“重玩”、“繼續”和“返回”,當游戲勝利的時候,用戶可以選擇“繼續”玩下一關。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的GameWinLayer.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class GameWinLayer : MonoBehaviour { 4 public Texture backgroundOfWinLayer; //菜單界面背景圖片 5 public GUIStyle[] buttonStyleOfWinLayer; //菜單界面按鈕圖樣式 6 void Start () {} 7 void OnGUI(){ 8 GUI.DrawTexture(new Rect(0,0,1*Screen.width,1*Screen.height), 9 backgroundOfWinLayer); //繪制背景圖片 10 if (GUI.Button(new Rect(68*Screen.width/100,0*Screen.height/100, 11 21*Screen.width/100,32*Screen.height/100), "", //繪制界面按鈕 12 buttonStyleOfWinLayer[ConstOfMenu.GAMERESULT_BACK_BUTTON])) { 13 Application.LoadLevel("GamesMenu"); //返回選擇關卡界面 14 } 15 if (GUI.Button(new Rect(45*Screen.width/100,21*Screen.height/100, 16 18*Screen.width/100,40*Screen.height/100), "",//繪制重玩按鈕 17 buttonStyleOfWinLayer[ConstOfMenu.GAMERESULT_REPEAT_BUTTON])){ 18 if(ConstOfMenu.GAMEONE_INDEX==1){ //若當前為關卡1 19 Application.LoadLevel("GameOne"); //則重新加載關卡1場景 20 } 21 else if(ConstOfMenu.GAMEONE_INDEX==2){ //若當前為關卡2 22 Application.LoadLevel("GameTwo"); //則重新加載關卡2場景 23 } 24 else if(ConstOfMenu.GAMEONE_INDEX==3){ //若當前為關卡3 25 Application.LoadLevel("GameThree"); //則重新加載關卡3場景 26 } 27 else if(ConstOfMenu.GAMEONE_INDEX==4){ //若當前為關卡4 28 Application.LoadLevel("GameFour"); //則重新加載關卡4場景 29 }} 30 if (GUI.Button(new Rect(74*Screen.width/100,66*Screen.height/100, 31 14*Screen.width/100,31*Screen.height/100), "", //繪制下一關按鈕 32 buttonStyleOfWinLayer[ConstOfMenu.GAMERESULT_NEXT_BUTTON])){ 33 if(ConstOfMenu.GAMEONE_INDEX==1){ //若當前為關卡1 34 Application.LoadLevel("GameTwo"); //則加載下一關關卡2 35 } 36 else if(ConstOfMenu.GAMEONE_INDEX==2){ //若當前為關卡2 37 Application.LoadLevel("GameThree"); //則加載下一關關卡3 38 } 39 else if(ConstOfMenu.GAMEONE_INDEX==3){ //若當前為關卡3 40 Application.LoadLevel("GameFour"); //則加載下一關關卡4 41 } 42 else if(ConstOfMenu.GAMEONE_INDEX==4){ //若當前為關卡4 43 Application.LoadLevel("GameOne"); //則重新加載關卡1 44 }}}}
第4行~第9行主要聲明了菜單界面背景圖片素材,聲明了菜單界面按鈕圖樣式。同時繪制了菜單界面需要的背景圖片。
第10行~第14行主要負責繪制游戲勝利界面的返回按鈕,當用戶單擊該按鈕的時候,游戲會從勝利界面切換到選擇關卡界面。
第15行~第28行主要負責繪制“重玩”按鈕,根據“GAMEONE_INDEX”索引的數值,若數值為1,則當用戶選擇重玩按鈕的時候,重新加載游戲關卡1。若數值為2,重玩關卡加載關卡2,以此類推。
第30行~第43行主要負責繪制“繼續”按鈕,當用戶單擊該按鈕的時候,游戲根據“GAMEONE_INDEX”索引值,來判斷下一關為關卡幾。若索引值為1,則下一關為關卡2,便加載游戲關卡2,以此類推。
(2)游戲勝利腳本掛載和變量賦值。該場景中存在一個“Main Camera”攝像機,將游戲勝利腳本掛載在該攝像機上,變量賦值如圖3-80所示,場景最終呈現效果如圖3-81所示。

▲圖3-80 游戲勝利腳本變量賦值

▲圖3-81 游戲勝利場景
(3)游戲失敗場景。在游戲失敗場景中有兩個按鈕,分別為“重玩”和“返回”。當游戲失敗的時候,用戶可以選擇“重玩”來重新玩本關。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的GameLoseLayer.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class GameLoseLayer : MonoBehaviour { 4 public Texture backgroundOfLoseLayer; //菜單界面背景圖片 5 public GUIStyle[] buttonStyleOfLoseLayer; //菜單界面按鈕圖樣式 6 void Start () {} 7 void OnGUI(){ 8 GUI.DrawTexture(new Rect(0,0,1*Screen.width, 9 1*Screen.height), backgroundOfLoseLayer); //繪制背景圖片 10 if (GUI.Button(new Rect(68*Screen.width/100,0*Screen.height/100, 11 21*Screen.width/100,32*Screen.height/100), "", //繪制界面按鈕 12 buttonStyleOfLoseLayer[ConstOfMenu.GAMERESULT_BACK_BUTTON])) { 13 Application.LoadLevel("GamesMenu"); //返回選擇關卡界面 14 } 15 if (GUI.Button(new Rect(45*Screen.width/100,21*Screen.height/100, 16 18*Screen.width/100,40*Screen.height/100), "",//繪制重玩按鈕 17 buttonStyleOfLoseLayer[ConstOfMenu.GAMERESULT_REPEAT_BUTTON])){ 18 if(ConstOfMenu.GAMEONE_INDEX==1) { //若當前關卡為1 19 Application.LoadLevel("GameOne");//則重新加載關卡1 20 } 21 else if(ConstOfMenu.GAMEONE_INDEX==2) { //若當前關卡為2 22 Application.LoadLevel("GameTwo"); //則重新加載關卡2 23 } 24 else if(ConstOfMenu.GAMEONE_INDEX==3) { //若當前關卡為3 25 Application.LoadLevel("GameThree"); //則重新加載關卡3 26 } 27 else if(ConstOfMenu.GAMEONE_INDEX==4) { //則重新加載關卡4 28 Application.LoadLevel("GameFour"); //則重新加載關卡4 29 }}}}
第4行~第9行主要聲明了菜單界面背景圖片素材,聲明了菜單界面按鈕圖樣式。同時繪制了菜單界面需要的背景圖片。
第10行~第13行主要負責繪制游戲失敗界面的返回按鈕,當用戶單擊該按鈕的時候,游戲會從勝界面切換到選擇關卡界面。
第15行~第28行主要負責繪制了“重玩”按鈕,根據“GAMEONE_INDEX”索引的數值,若數值為1,則當用戶選擇重玩按鈕的時候,重新加載游戲關卡1。若數值為2,重玩關卡加載關卡2,以此類推。
(4)游戲失敗腳本掛載和變量賦值。該場景中存在一個“Main Camera”攝像機,將游戲失敗腳本掛載在該攝像機上,變量賦值如圖3-82所示,場景最終呈現效果如圖3-83所示。

▲圖3-82 游戲失敗腳本變量賦值

▲圖3-83 游戲失敗場景