官术网_书友最值得收藏!

  • 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)景

主站蜘蛛池模板: 鹰潭市| 高平市| 龙门县| 中牟县| 海原县| 霍山县| 惠东县| 新巴尔虎左旗| 怀集县| 叙永县| 郁南县| 芦山县| 台前县| 九台市| 司法| 白水县| 景德镇市| 白山市| 马龙县| 临海市| 柞水县| 许昌县| 武隆县| 双鸭山市| 广河县| 克东县| 华坪县| 肥东县| 楚雄市| 正镶白旗| 象州县| 综艺| 黑龙江省| 石景山区| 磐安县| 宾川县| 镇宁| 曲水县| 兴隆县| 湘乡市| 屏山县|