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

▲圖3-48 新建場(chǎng)景
(2)創(chuàng)建定向光源。選擇“GameObject”→“Create Other”→“Directional Light”后會(huì)自動(dòng)創(chuàng)建一個(gè)定向光源,如圖3-49所示。調(diào)整定向光源位置,如圖3-50所示。

▲圖3-49 創(chuàng)建定向光源

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

▲圖3-51 為迷宮貼圖

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

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

▲圖3-54 木箱的大小和擺放
(5)創(chuàng)建勝利的平面。選擇“GameObject”→“Create Other”→“Plane”選項(xiàng),并命名為“PlaneTrigger”,如 圖3-55所示。然后調(diào)整平面位置、姿態(tài)和大小,置于“GameOneFloor”游戲?qū)ο髢?nèi)。由于該平面用于觸發(fā)游戲界面判定,所以需要勾選游戲?qū)ο髮傩灾小癐s Trigger”后的單選框,其各項(xiàng)參數(shù)如圖3-56所示。

▲圖3-55 創(chuàng)建平面

▲圖3-56 平面參數(shù)
(6)創(chuàng)建地板的平面。選擇“GameObject”→“Create Other”→“Plane”選項(xiàng),命名為“BallFallTrigger”,然后調(diào)整平面位置、姿態(tài)和大小,并為其貼圖,置于“GameOneFloor”游戲?qū)ο笙路健S捎谠撈矫嬗糜谟|發(fā)游戲界面判定,所以需要勾選游戲?qū)ο髮傩灾小癐s Trigger”后的單選框,其各項(xiàng)參數(shù)如圖3-57所示。
(7)添加盒子碰撞器。為木箱和迷宮的墻添加盒子碰撞器。首先選中“Boxs”組中的所有Cube游戲?qū)ο螅汀癎ameOneFloor”地板中的“Box002”—“Box030”和“Box031”—“Box032”游戲?qū)ο螅缓筮x擇“Component”→“Physics”→“Box Collider”,具體情況如圖3-58所示。

▲圖3-57 地板平面
(8)添加剛體。首先選中“Ball1”對(duì)象和“Boxs”組中的所有Cube游戲?qū)ο螅约啊癎ameOneFloor”地板中的“Box002”—“Box030”和“Box031”—“Box032”游戲?qū)ο螅缓筮x擇“Component”→“Physics”→“Rigidbody”選項(xiàng),具體情況如圖3-59所示。

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

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

▲圖3-60 樹木模型

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

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

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

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

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

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

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

▲圖3-68 制作第一人稱攝像機(jī)
(3)編寫第一人稱攝像機(jī)掛載腳本。該腳本主要負(fù)責(zé)繪制游戲關(guān)卡的界面,包括游戲關(guān)卡的返回按鈕,切換鏡頭按鈕和移動(dòng)第一人稱攝像機(jī)位置的方向按鈕。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的GameLayer.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class GameLayer : MonoBehaviour { 4 public GameObject[] cameras; //攝像機(jī)列表 5 public GUIStyle[] buttonStyleOfGameLayer; //按鈕樣式 6 public static int curCam = 0; //當(dāng)前攝像機(jī)編號(hào) 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"); //返回選擇關(guān)卡界面 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])) {//繪制切換相機(jī)按鈕 17 ChangeCam(1); //切換至1號(hào)攝像機(jī) 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"); //返回選擇關(guān)卡界面 42 }} 43 public void ChangeCam(int index){ //切換攝像機(jī)方法 44 cameras[curCam].SetActive(false); //設(shè)置當(dāng)前攝像機(jī)不可用 45 cameras[index].SetActive(true); //啟用相應(yīng)攝像機(jī) 46 }}
第4行~第6行聲明了游戲第一人稱視角界面的按鈕樣式、攝像機(jī)列表,以及當(dāng)前攝像機(jī)索引。在這里,將第一人稱視角的攝像機(jī)和俯視攝像機(jī)分別編為0號(hào)和1號(hào),方便操控。
第10行~第42行繪制了游戲第一人稱視角界面的五個(gè)按鈕,分別為返回選擇關(guān)卡按鈕,切換視角按鈕,和上、下、左、右4個(gè)方向移動(dòng)當(dāng)前攝像機(jī)的四個(gè)按鈕,以及按下按鈕的處理方法。
第43行~第45行表示當(dāng)用戶在游戲界面按下返回鍵,則加載選擇關(guān)卡界面。同時(shí)介紹了切換攝像機(jī)的方法“ChangeCam”,在該方法中設(shè)置當(dāng)前攝像機(jī)不可用,然后啟用另一個(gè)攝像機(jī),以達(dá)到切換視角的目的。
(4)游戲第一人稱界面腳本的變量賦值。在這里,攝像機(jī)列表的Size輸入2,包括兩個(gè)攝像機(jī)互相切換。按鈕的Size輸入6,共有六個(gè)按鈕需要賦予相應(yīng)貼圖。詳細(xì)如圖3-69所示。

▲圖3-69 游戲第一人稱界面腳本變量賦值
(5)編寫俯視攝像機(jī)掛載腳本。該攝像機(jī)能俯看整個(gè)迷宮地圖,但是在該視角下,不能拖動(dòng)木箱。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的LookAllGameLayer.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class LookAllGameLayer : MonoBehaviour { 4 public GameObject[] cameras; //攝像機(jī)列表 5 public GUIStyle[] buttonStyleOfLookAllGameLayer; //按鈕樣式 6 public static int curCam = 1; //當(dāng)前攝像機(jī)編號(hào) 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"); //返回選擇關(guān)卡界面 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); //切換攝像機(jī) 19 }} 20 public void ChangeCam(int index) { //切換攝像機(jī)方法 21 cameras[curCam].SetActive(false); //設(shè)置當(dāng)前攝像機(jī)不可用 22 cameras[index].SetActive(true); //啟用相應(yīng)攝像機(jī) 23 }}
第4行~第6行聲明了游戲俯視視角界面的按鈕樣式、攝像機(jī)列表,以及當(dāng)前攝像機(jī)索引。在這里,將第一人稱視角的攝像機(jī)和俯視攝像機(jī)分別編為0號(hào)和1號(hào),方便操控。
第9行~第18行繪制了返回按鈕,當(dāng)用戶單擊該按鈕的時(shí)候,加載游戲選擇關(guān)卡界面。同時(shí)繪制了切換視角按鈕,當(dāng)用戶單擊該按鈕的時(shí)候,從俯視角切換到第一人稱視角。
第20行~第22行介紹了切換攝像機(jī)的方法。在該方法中,將當(dāng)前俯視視角的攝像機(jī)設(shè)置為不可用,同時(shí)激活第一人稱視角的攝像機(jī)。
(6)游戲俯視界面腳本的變量賦值。在這里,攝像機(jī)列表的Size輸入2,包括兩個(gè)攝像機(jī)互相切換。按鈕的Size輸入2,共有兩個(gè)按鈕需要賦予相應(yīng)貼圖。詳細(xì)如圖3-70所示。

▲圖3-70 游戲俯視界面腳本變量賦值
3.5.3 游戲關(guān)卡腳本的編寫
上一小節(jié)已經(jīng)介紹了游戲場(chǎng)景和游戲多視角的制作過程,本小節(jié)將向讀者介紹游戲界面繪制和功能完善的相關(guān)腳本。每個(gè)腳本負(fù)責(zé)游戲關(guān)卡不同的功能部分,詳細(xì)的編寫介紹如下。
(1)編寫重力小球腳本。該腳本主要負(fù)責(zé)四個(gè)游戲關(guān)卡中的小球如何隨著用戶終端傾斜而改變移動(dòng)方向和速度,在4個(gè)關(guān)卡中,“Ball1”、“Ball2”、“Ball3”以及“Ball4”4個(gè)游戲?qū)ο蠖挤謩e掛載了該腳本,具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第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); //移動(dòng)小球 10 }}
說明
由于小球根據(jù)重力在迷宮平面上移動(dòng),因此將初始速度定為10.0f,同時(shí)聲明X,Y兩個(gè)方向向量。根據(jù)手機(jī)傾斜度,判斷小球重力加速度,然后調(diào)整小球位置。
(2)四個(gè)關(guān)卡中小球的初始位置以及大小分別如圖3-71、圖3-72、圖3-73和圖3-74所示。玩家需要根據(jù)整體地圖的路線,來選擇哪一條路最快最順利到達(dá)終點(diǎn)。

▲圖3-71 關(guān)卡一小球位置大小

▲圖3-72 關(guān)卡二小球位置大小

▲圖3-73 關(guān)卡三小球位置大小

▲圖3-74 關(guān)卡四小球位置大小
(3)編寫拖曳木箱腳本。該腳本主要負(fù)責(zé)在游戲迷宮中當(dāng)作阻礙的木箱能被用戶用手指拖曳移動(dòng),四個(gè)關(guān)卡中的所有木箱游戲?qū)ο蠖挤謩e掛載了該腳本,具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的DragObject.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class DragObject : MonoBehaviour { 4 private Vector3 screenPosition; //聲明屏幕坐標(biāo) 5 private Vector3 position; //聲明游戲空間坐標(biāo) 6 private Vector3 tempPosition; //聲明變換坐標(biāo) 7 void OnMouseDown() { 8 screenPosition=Camera.main.WorldToScreenPoint (transform.position); 9 position=transform .position -Camera.main.ScreenToWorldPoint ( 10 new Vector3 (Input.mousePosition.x, //變換坐標(biāo) 11 Input.mousePosition.y ,screenPosition.z)); //用戶單擊坐標(biāo) 12 StartCoroutine (ChangePosition()); //改變位置 13 } 14 IEnumerator ChangePosition () { 15 while (Input .GetMouseButton(0)){ //根據(jù)用戶觸碰目標(biāo)點(diǎn) 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個(gè)坐標(biāo)位置,由于用戶觸碰在手機(jī)上的點(diǎn)需要轉(zhuǎn)換為游戲空間中的坐標(biāo)點(diǎn),才能使木箱根據(jù)手指的移動(dòng)而移動(dòng),在“OnMouseDown”方法中,便根據(jù)轉(zhuǎn)換坐標(biāo)系,調(diào)用“ChangePosition”改變位置方法。
第14行~第19行介紹了“ChangePosition”改變位置方法,在該方法中,根據(jù)手指的移動(dòng)位置,將木箱變換到指定位置,這樣便實(shí)現(xiàn)了木箱被拖曳的功能。
(4)下面介紹迷宮笑臉終點(diǎn)觸發(fā)游戲結(jié)果腳本。該腳本主要負(fù)責(zé)當(dāng)小球順利通過迷宮,滾動(dòng)到該處的時(shí)候,觸發(fā)游戲勝利結(jié)果,具體代碼如下。
代碼位置:見隨書光盤中源代碼/第03章/PlayBox/Assets/Scripts/GameScript目錄下的PlaneTrigger.cs。
1 using UnityEngine; 2 using System.Collections; 3 public class PlaneTrigger : MonoBehaviour { 4 void OnTriggerEnter(Collider other){ //觸發(fā)結(jié)果方法 5 if(other.transform.name == "Ball1") { //若小球?yàn)锽all1 6 Application.LoadLevel("GameWin"); //加載游戲勝利場(chǎng)景 7 ConstOfMenu.GAMEONE_INDEX=1; //設(shè)置該索引為1 8 } 9 else if(other.transform.name == "Ball2"){ //若小球?yàn)锽all2 10 Application.LoadLevel("GameWin"); //加載游戲勝利場(chǎng)景 11 ConstOfMenu.GAMEONE_INDEX=2; //設(shè)置該索引為2 12 } 13 else if(other.transform.name == "Ball3"){ //若小球?yàn)锽all3 14 Application.LoadLevel("GameWin"); //加載游戲勝利場(chǎng)景 15 ConstOfMenu.GAMEONE_INDEX=3; //設(shè)置該索引為3 16 } 17 else if(other.transform.name == "Ball4"){ //若小球?yàn)锽all4 18 Application.LoadLevel("GameWin"); //加載游戲勝利場(chǎng)景 19 ConstOfMenu.GAMEONE_INDEX=4; //設(shè)置該索引為4 20 }}}
第4行~第20行為小球觸發(fā)結(jié)果方法,當(dāng)小球滾動(dòng)到指定笑臉位置,表示該關(guān)游戲勝利。由于每個(gè)關(guān)卡順利通過后,會(huì)顯示游戲勝利界面,在該界面會(huì)有“重玩”和“繼續(xù)”的按鈕,所以需要判斷當(dāng)前通過的是哪關(guān),這里為四個(gè)關(guān)卡的4個(gè)小球命名不同,便解決了這個(gè)問題。
第5行~第19行表示,當(dāng)?shù)竭_(dá)終點(diǎn)的小球?yàn)椤癇all1”時(shí),表示玩家將順利通過第一關(guān),所以加載游戲勝利場(chǎng)景的同時(shí)會(huì)將索引“GAMEONE_INDEX”置為1。同樣地,其他游戲關(guān)卡也會(huì)因?yàn)椴煌男∏驅(qū)⑺饕脼椴煌瑪?shù)字,方便游戲結(jié)果界面使用該索引。
(5)游戲終點(diǎn)笑臉。4個(gè)關(guān)卡的終點(diǎn)笑臉有不同的貼圖素材,要根據(jù)每一關(guān)的主題風(fēng)格,選擇合適的笑臉貼圖。游戲關(guān)卡1的笑臉位置大小在前面的章節(jié)已經(jīng)詳細(xì)介紹過,這里不再贅述。游戲關(guān)卡2、關(guān)卡3和關(guān)卡4的笑臉大小、位置和貼圖效果如圖3-75、圖3-76和圖3-77所示。

▲圖3-75 關(guān)卡2笑臉終點(diǎn)位置大小

▲圖3-76 關(guān)卡3笑臉終點(diǎn)位置大小

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

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

▲圖3-79 關(guān)卡4勻速旋轉(zhuǎn)圓盤
3.5.4 游戲結(jié)果場(chǎng)景
上一小節(jié)已經(jīng)介紹了游戲場(chǎng)景的相關(guān)設(shè)計(jì)開發(fā),本小節(jié)將向讀者介紹關(guān)于游戲結(jié)果場(chǎng)景的相關(guān)開發(fā)。游戲結(jié)果場(chǎng)景分為勝利場(chǎng)景和失敗場(chǎng)景,詳細(xì)開發(fā)過程如下。
(1)編寫游戲勝利場(chǎng)景腳本。在游戲勝利場(chǎng)景中有3個(gè)按鈕,分別為“重玩”、“繼續(xù)”和“返回”,當(dāng)游戲勝利的時(shí)候,用戶可以選擇“繼續(xù)”玩下一關(guān)。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第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"); //返回選擇關(guān)卡界面 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){ //若當(dāng)前為關(guān)卡1 19 Application.LoadLevel("GameOne"); //則重新加載關(guān)卡1場(chǎng)景 20 } 21 else if(ConstOfMenu.GAMEONE_INDEX==2){ //若當(dāng)前為關(guān)卡2 22 Application.LoadLevel("GameTwo"); //則重新加載關(guān)卡2場(chǎng)景 23 } 24 else if(ConstOfMenu.GAMEONE_INDEX==3){ //若當(dāng)前為關(guān)卡3 25 Application.LoadLevel("GameThree"); //則重新加載關(guān)卡3場(chǎng)景 26 } 27 else if(ConstOfMenu.GAMEONE_INDEX==4){ //若當(dāng)前為關(guān)卡4 28 Application.LoadLevel("GameFour"); //則重新加載關(guān)卡4場(chǎng)景 29 }} 30 if (GUI.Button(new Rect(74*Screen.width/100,66*Screen.height/100, 31 14*Screen.width/100,31*Screen.height/100), "", //繪制下一關(guān)按鈕 32 buttonStyleOfWinLayer[ConstOfMenu.GAMERESULT_NEXT_BUTTON])){ 33 if(ConstOfMenu.GAMEONE_INDEX==1){ //若當(dāng)前為關(guān)卡1 34 Application.LoadLevel("GameTwo"); //則加載下一關(guān)關(guān)卡2 35 } 36 else if(ConstOfMenu.GAMEONE_INDEX==2){ //若當(dāng)前為關(guān)卡2 37 Application.LoadLevel("GameThree"); //則加載下一關(guān)關(guān)卡3 38 } 39 else if(ConstOfMenu.GAMEONE_INDEX==3){ //若當(dāng)前為關(guān)卡3 40 Application.LoadLevel("GameFour"); //則加載下一關(guān)關(guān)卡4 41 } 42 else if(ConstOfMenu.GAMEONE_INDEX==4){ //若當(dāng)前為關(guān)卡4 43 Application.LoadLevel("GameOne"); //則重新加載關(guān)卡1 44 }}}}
第4行~第9行主要聲明了菜單界面背景圖片素材,聲明了菜單界面按鈕圖樣式。同時(shí)繪制了菜單界面需要的背景圖片。
第10行~第14行主要負(fù)責(zé)繪制游戲勝利界面的返回按鈕,當(dāng)用戶單擊該按鈕的時(shí)候,游戲會(huì)從勝利界面切換到選擇關(guān)卡界面。
第15行~第28行主要負(fù)責(zé)繪制“重玩”按鈕,根據(jù)“GAMEONE_INDEX”索引的數(shù)值,若數(shù)值為1,則當(dāng)用戶選擇重玩按鈕的時(shí)候,重新加載游戲關(guān)卡1。若數(shù)值為2,重玩關(guān)卡加載關(guān)卡2,以此類推。
第30行~第43行主要負(fù)責(zé)繪制“繼續(xù)”按鈕,當(dāng)用戶單擊該按鈕的時(shí)候,游戲根據(jù)“GAMEONE_INDEX”索引值,來判斷下一關(guān)為關(guān)卡幾。若索引值為1,則下一關(guān)為關(guān)卡2,便加載游戲關(guān)卡2,以此類推。
(2)游戲勝利腳本掛載和變量賦值。該場(chǎng)景中存在一個(gè)“Main Camera”攝像機(jī),將游戲勝利腳本掛載在該攝像機(jī)上,變量賦值如圖3-80所示,場(chǎng)景最終呈現(xiàn)效果如圖3-81所示。

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

▲圖3-81 游戲勝利場(chǎng)景
(3)游戲失敗場(chǎng)景。在游戲失敗場(chǎng)景中有兩個(gè)按鈕,分別為“重玩”和“返回”。當(dāng)游戲失敗的時(shí)候,用戶可以選擇“重玩”來重新玩本關(guān)。具體代碼如下所示。
代碼位置:見隨書光盤中源代碼/第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"); //返回選擇關(guān)卡界面 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) { //若當(dāng)前關(guān)卡為1 19 Application.LoadLevel("GameOne");//則重新加載關(guān)卡1 20 } 21 else if(ConstOfMenu.GAMEONE_INDEX==2) { //若當(dāng)前關(guān)卡為2 22 Application.LoadLevel("GameTwo"); //則重新加載關(guān)卡2 23 } 24 else if(ConstOfMenu.GAMEONE_INDEX==3) { //若當(dāng)前關(guān)卡為3 25 Application.LoadLevel("GameThree"); //則重新加載關(guān)卡3 26 } 27 else if(ConstOfMenu.GAMEONE_INDEX==4) { //則重新加載關(guān)卡4 28 Application.LoadLevel("GameFour"); //則重新加載關(guān)卡4 29 }}}}
第4行~第9行主要聲明了菜單界面背景圖片素材,聲明了菜單界面按鈕圖樣式。同時(shí)繪制了菜單界面需要的背景圖片。
第10行~第13行主要負(fù)責(zé)繪制游戲失敗界面的返回按鈕,當(dāng)用戶單擊該按鈕的時(shí)候,游戲會(huì)從勝界面切換到選擇關(guān)卡界面。
第15行~第28行主要負(fù)責(zé)繪制了“重玩”按鈕,根據(jù)“GAMEONE_INDEX”索引的數(shù)值,若數(shù)值為1,則當(dāng)用戶選擇重玩按鈕的時(shí)候,重新加載游戲關(guān)卡1。若數(shù)值為2,重玩關(guān)卡加載關(guān)卡2,以此類推。
(4)游戲失敗腳本掛載和變量賦值。該場(chǎng)景中存在一個(gè)“Main Camera”攝像機(jī),將游戲失敗腳本掛載在該攝像機(jī)上,變量賦值如圖3-82所示,場(chǎng)景最終呈現(xiàn)效果如圖3-83所示。

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

▲圖3-83 游戲失敗場(chǎng)景
- Core Data應(yīng)用開發(fā)實(shí)踐指南
- 嵌入式系統(tǒng)開發(fā)之道:菜鳥成長(zhǎng)日志與項(xiàng)目經(jīng)理的私房菜
- 掌握分布式跟蹤:微服務(wù)和復(fù)雜系統(tǒng)性能分析
- 架構(gòu)基礎(chǔ):從需求到架構(gòu)
- 3D打印創(chuàng)意小創(chuàng)客
- 微服務(wù)架構(gòu)原理與開發(fā)實(shí)戰(zhàn)
- 每天5分鐘玩轉(zhuǎn)OpenStack
- Unity AR/VR開發(fā):從新手到專家
- 大規(guī)模組織DevOps實(shí)踐(第2版)
- 嵌入式軟件測(cè)試:方法、案例與模板詳解
- 現(xiàn)代交換技術(shù)(第3版)
- 實(shí)時(shí)分析實(shí)戰(zhàn):構(gòu)建實(shí)時(shí)流處理應(yīng)用和分析系統(tǒng)
- Scrum捷徑:敏捷策略、工具與技巧
- Serverless核心技術(shù)和大規(guī)模實(shí)踐
- 大數(shù)據(jù)測(cè)試技術(shù)與實(shí)踐