C#開發Unity遊戲教程循環遍歷作出判斷及Unity遊戲示例

C#開發Unity遊戲教程循環遍歷作出判斷及Unity遊戲示例

Unity中循環遍歷每一個數據,並作出判斷

不少時候,遊戲在玩家作出判斷之後,遊戲程序會遍歷玩家身上大量的所需數據,而後作出判斷,即首先斷定玩家是否有權限作出這種選擇,而後才決定是否爲玩家執行此選擇。例如,《仙劍奇俠傳》這款遊戲,進入劇情「荷葉迷宮時」,會要求玩家擊碎迷宮裏的5尊雕塑,如圖5-12所示。可是擊碎的前提是,玩家身上必須攜帶有「錘子」。也就是說系統會遍歷玩家身上全部的資源,若是有錘子才能擊碎雕塑。數組

 

圖5-12  《仙劍奇俠傳》,荷葉迷宮全圖網絡

判斷是否有指定的數據,可使用本章前面所學的if語句來解決。可是目前還存在兩個其它的問題:學習

 

  • q  如何在腳本中存儲和引用這大量的數據,若是使用變量,顯然要聲明大量的變量,這樣作顯然不妥;
  • q  若是已經獲得了大量的數據,該使用什麼方式去一一判別呢,難道說要使用大量if語句,去對數據一一判別,這樣作顯然也不妥;

 

C#卻是提供了兩種機制,能夠頗有效的解決以上的兩個問題,本節會逐個詳解介紹它們。3d

Unity中大量數據的存儲與引用

C#指定了3種存儲與引用大量數據的方法,分別是:數組、列表和字典。本小節會使用簡單的小示例依次講解它們,至於大的遊戲示例,會在本章講解完全部的知識點之後給出。對象

1.數組blog

數組能夠存儲大量同類型的數據,它的聲明格式爲:教程

 

  • 數據類型[ ] 數組名;
  • q  全部經常使用的數據類型,在本書第3章中已經使用表格列出了;
  • q  數據類型後面跟着的是一對中括號「[ ]」;
  • q  數組名與變量名同樣,必須遵循C#的命名規定;

 

例如,下面的代碼語句聲明,而且初始化了數組:遊戲

 

  • int[] myIntArray = {1,3,5,7,9};

 

讀者應該能夠從這條語句中看出,聲明的是int類型的數組,數組名爲myIntArray,存儲了5個int類型的數據,分別是一、三、五、7和9。圖片

引用數組中指定數據的格式爲:ip

 

  • 數組名[下標];
  • q  下標是從0開始的整數,當下標爲0時,表示引用的是數組中的第1個數據;若爲3時,表示引用的是數組中的第4個數據;其它數據的引用方式依此類推;

 

爲腳本MyScript添加下面的代碼:

 

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              private int[] myIntArray = {1,3,5,7,9};                //數組的聲明和初始化
  • 07              void Start()
  • 08              {
  • 09                        Debug.Log ("數組中的第1個數據是:" + myIntArray[0]);          //數組數據的引用
  • 10                        Debug.Log ("數組中的第5個數據是:" + myIntArray[4]);          //數組數據的引用
  • 11              }
  • 12     }

 

運行遊戲,在Console視圖裏查看腳本輸出的信息,如圖5-13所示。

 

 

圖5-13  使用數組的示例

2.列表

列表與數組相似,一樣用於存儲大量同類的數據。可是彷佛C#開發人員相對於數組,更偏心列表一些。除非逼不得已,不然他們不會從列表和數組兩者間選擇後者,基本上是由於下面的幾個緣由:

 

  • q  數組在被聲明瞭之後,存儲的數據的個數就是固定的了,而列表則比較靈活,沒有這方面的限制,若是開發者須要,它還能夠存儲更多的數據;
  • q  列表能夠更方便的增長和刪除存儲於其中的數據;

 

此次做者打算在演示一個示例之後,在具體介紹列表的聲明和使用等等。爲腳本MyScript添加下面的代碼:

 

  • 01     using UnityEngine;
  • 02     using System.Collections.Generic;                                                                 //必須添加的語句
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              private List<int> myIntList = new List<int>();                                       //聲明列表
  • 07              void Start()
  • 08              {
  • 09                       myIntList.Add (1);                                                                               //添加數據到列表
  • 10                       myIntList.Add (3);
  • 11                       myIntList.Add (5);
  • 12                        Debug.Log ("列表中總共存儲的數據個數是:" + myIntList.Count);
  • 13                        Debug.Log ("列表中第1個數據是:" + myIntList[0]);                 //引用列表中的數據
  • 14                        Debug.Log ("列表中第3個數據是:" + myIntList[2]);
  • 15    
  • 16                       myIntList.Add (7);
  • 17                        Debug.Log ("列表中第4個數據是:" + myIntList[3]);
  • 18              }
  • 19     }

 

運行遊戲,在Console視圖裏查看腳本輸出的信息,如圖5-14所示。

 

 

圖5-14  使用列表的示例

 

  • q  腳本02行的語句,與以往不一樣,須要讀者主動修改爲這個樣子,此語句是在腳本中使用列表的前提,順便說起新建腳本時,語句是下面的這個樣子:
  • 02     using System.Collections;
  • q  腳本06行的語句以下:
  • 06              private List<int> myIntList = new List<int>();                                       //聲明列表

 

此語句聲明瞭列表,其名爲myIntList,目前尚未存儲任何數據;和數組同樣,聲明列表時也須要指定指定列表中能夠存儲的數據的類型,本示例中存儲的類型是int。

 

  • q  腳本09~11行編寫了相似於下面的語句:
  • 09                       myIntList.Add (1);                                                                               //添加數據到列表

 

經過這種方式,一個int類型的數據1,才被存儲到了列表中。

 

  • q  腳本1三、14行,引用列表數據的方式以下:
  • 09                       myIntList[0]

 

單從編寫樣式上看,它的引用方式與數組引用自身數據的方式如出一轍,並且它的下標也是從0開始,表示存儲的第1個數據,其它數據的存儲下標以此類推。

 

  • q  腳本1六、17行,是列表區別於數組的使用方法,由於列表中能夠存儲的數據的個數是沒有限定的;

 

3.字典

字典的使用方法與列表相似,可是它的聲明須要指定一對數據類型,即鍵(Key)和值(Value)這兩個數據的數據類型。使用字典最大的好處就是,能夠經過Key,找到與之對應的Value。對於遊戲的實際意義是,一個網絡遊戲必定須要存儲大量用戶的遊戲信息,而遊戲程序定位這些信息的方式一般是使用ID。也就是說,一個玩家就有一個ID,而ID關聯了用戶的全部信息,因此只要知道用戶的ID,就不愁找不到玩家的其它遊戲信息了。

在講解字典的語法前,一樣先演示一個示例,爲腳本MyScript添加下面的代碼:

 

  • 01     using UnityEngine;
  • 02     using System.Collections.Generic;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              private Dictionary<int,string> myDic = new Dictionary<int,string>();              //聲明字典
  • 07              void Start()
  • 08              {
  • 09                       myDic.Add(10,"Monday");                                   //添加數據到字典
  • 10                       myDic.Add(20,"Tuesday");
  • 11                       myDic[30] = "Wednesday";
  • 12                        Debug.Log ("字典中總共存儲的數據個數是:" + myDic.Count);
  • 13                        Debug.Log ("字典中key爲10的數據是:" + myDic[10]);                   //引用字典中的數據
  • 14                        Debug.Log ("字典中key爲20的數據是:" + myDic[20]);
  • 15                       myDic[40] = "Thursday";
  • 16                        Debug.Log ("字典中key爲40的數據:" + myDic[40]);
  • 17              }
  • 18     }

 

運行遊戲,在Console視圖裏查看腳本輸出的信息,如圖5-15所示。

 

 

圖5-15  使用字典的示例

 

  • q  腳本02行的語句,對於在腳本中使用字典一樣是不可缺乏的,
  • q  腳本06行的語句:
  • 06              private Dictionary<int,string> myDic = new Dictionary<int,string>();

 

是字典的聲明部分,從格式上來看與列表的聲明方式十分相近。只不過聲明字典須要同時指定鍵和值兩個數據的數據類型。

 

  • q  腳本09~10行,爲字典添加數據的方式與列表類似:
  • 09                       myDic.Add(10,"Monday");                                   //添加數據到字典

 

可是字典還有其它的方式,即腳本11行的代碼

 

  • 11                       myDic[30] = "Wednesday";

 

這種方式,乍看之下與數組存儲數據的方式同樣,可是此種方式裏,中括號「[ ]」裏的數字可不是「下標」,而是「鍵」。

 

  • q  腳本1三、14和16行,字典引用數據的形式與數組和列表一致,可是中括號「[ ]」裏的數字可不是「下標」,而是「鍵」。
  • 13                        myDic[10]

 

Unity中遍歷大量的數據

若是須要在腳本中使用一樣的操做去一一判別大量的數據,C#卻是提供了一種不錯的機制,讀者或許會有興趣,就是「循環」。C#裏有3種用於實現循環的語句,分別是:foreach、for和while。本小節打算依次介紹它們的使用方法,最後再將這種機制應用到遊戲中。

1.foreach循環

爲了更好的說明foreach循環的使用方法,下面將演示一個示例,此示例會使用foreach循環遍歷數組、列表和字典裏的全部數據,並使用if語句選擇所需的數據。爲MyScript腳本添加下面的代碼:

 

  • 01     using UnityEngine;
  • 02     using System.Collections.Generic;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              void Start()
  • 07              {
  • 08                       string[] myArray = new string[] {"Monday","Tuesday","Wednessday"};
  • 09                       foreach(string myStrArray in myArray)                                        //循環遍歷數組
  • 10                       {
  • 11                                 if(myStrArray == "Monday")
  • 12                                          Debug.Log("There is "+myStrArray+" in array.");
  • 13                       }
  • 14    
  • 15                       List<string> myList = new List<string> {"Monday","Tuesday","Wednessday"};
  • 16                       foreach(string myStrList in myList)                                              //循環遍歷列表
  • 17                       {
  • 18                                 if(myStrList == "Tuesday")
  • 19                                          Debug.Log("There is "+myStrList+" in list.");
  • 20                       }
  • 21    
  • 22                       Dictionary<int,string> myDict = new Dictionary<int,string>
  • 23                                          {{10,"Monday"},{20,"Tuesday"},{30,"Wednessday"}};
  • 24                       foreach(KeyValuePair<int,string> myStrDic in myDict)          //循環遍歷字典
  • 25                       {
  • 26                                 if(myStrDic.Key == 30)
  • 27                                          Debug.Log ("There is "+myStrDic.Value+" in dictionary");
  • 28                       }
  • 29              }
  • 30     }

 

運行遊戲,在Console視圖裏查看腳本輸出的信息,如圖5-16所示。

 

 

圖5-16  使用foreach循環的示例

 

  • q  腳本0八、15和22行的代碼,分別聲明瞭數組、列表和字典,而且爲它們初始化了3組數據;
  • q  腳本0九、16和24行的代碼,則分別開始使用foreach語句遍歷數組、列表和字典。以09行的語句爲例:
  • 09                       foreach(string myStrArray in myArray)                                        //循環遍歷數組

 

foreach後括號「( )」裏的語句,表示的含義是:要遍歷的是myArray數組,而數組中的每一個數據都將先被存儲於同類型的myStrArray變量中。語句的書寫格式以下:

 

  • foreach(數據類型 變量名 in 數組名)
  • q  腳本十一、18和26行的代碼,分別使用if語句判斷變量中的數據,是不是指定的數據。以11行的代碼爲例:
  • 11                                 if(myStrArray == "Monday")

 

if後括號「( )」裏的語句,是一個關係表達式,當變量myStrArray裏的數據字符串是Monday時,表達式的值纔是true。

 

  • q  腳本十二、19和27行的代碼,則表示當使用if語句判斷出數組、列表和字典中存在指定數據時,會輸出文字信息到Console視圖。以12行的代碼爲例:
  • 12                                          Debug.Log("There is "+myStrArray+" in array.");

 

若是數組中存在數據「Monday」,則會在Console視圖裏輸出「There is Monday in array」。

2.for循環

for循環也能夠遍歷數組、列表與字典中的全部數據,可是它與foreach語句的些許區別在於,for循環表達的含義更像是:讓一段代碼執行指定的次數。例如,執行5次輸出語句,作10次一樣的操做等等。下面是使用for循環的一個簡單示例:

 

  • 01     using UnityEngine;
  • 02     using System.Collections.Generic;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              void Start()
  • 07              {
  • 08                       List<string> myList = new List<string> {"Monday","Tuesday","Wednessday"};
  • 09                       for(int i = 0;i < myList.Count;i++)
  • 10                       {
  • 11                                 Debug.Log(myList[i]);
  • 12                                 if(myList[i] == "Tuesday")
  • 13                                          Debug.Log("There is "+myList[i]+" in list.");
  • 14                       }
  • 15              }
  • 16     }

 

運行遊戲,在Console視圖裏查看腳本輸出的信息,如圖5-17所示。

 

 

圖5-17  使用for循環的示例

 

  • q  腳本08行的代碼,聲明瞭一個列表,且爲列表添加了3組數據
  • q  腳本09行的代碼,就是一個for語句,以下:
  • 09                       for(int i = 0;i < myList.Count;i++)

 

for後面括號裏的語句,所表示的含義是:一共要循環myList.Count次。變量i相似於一個計數器,記錄着當前循環的次數。例如,要循環15次,可使用下面的for循環語句:

 

  • for(int i = 0;i < 15;i++)
  • q  腳本11~13行的多條語句,是要執行指定循環次數的代碼。其中11行的語句用於在Console視圖中輸出列表中的全部數據;十二、13行的代碼,是一個if語句,用於判斷列表中是否存在指定的數據,若是存在就會輸出相應的信息到Console視圖;

 

3.while循環

while循環與for循環的操做效果是相同的,即讓循環執行必定的次數。但不一樣的是,從for循環的語句中能夠很明確的看出循環的次數,在達到指定次數之後就中止。while循環表達的沒有這麼明確,但它會明確的告訴Unity,何時中止循環。下面的腳本代碼,是將for循環的示例改寫成了while循環,以下:

 

  • 01     using UnityEngine;
  • 02     using System.Collections.Generic;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              void Start()
  • 07              {
  • 08                       List<string> myList = new List<string> {"Monday","Tuesday","Wednessday"};
  • 09                       int i = 0;
  • 10                       while(i < myList.Count)
  • 11                       {
  • 12                                 Debug.Log(myList[i]);
  • 13                                 if(myList[i] == "Tuesday")
  • 14                                          Debug.Log("There is "+myList[i]+" in list.");
  • 15                                 i++;
  • 16                       }
  • 17              }
  • 18     }

 

運行遊戲,在Console視圖裏查看腳本輸出的信息,如圖5-18所示。

 

 

圖5-18  使用while循環的示例

 

  • q  腳本10行的語句,就是while循環語句,它後面的括號裏,只有一個關係表達式,此關係表達式決定了循環在何時結束;

 

其它部分與for循環的示例同樣,這裏就不作重複說明了。

Unity遊戲示例

本章前後學習了C#語法裏,3個部分的內容。這3個部分是:

 

  • q  判斷語句,包括if、if-else、if-else-if和switch;
  • q  數據存儲方式,包括數組(array)、列表(list)和字典(dictionary);
  • q  大量數據的遍歷方式,包括foreach、for和while;

 

爲了更方便的說明各部分的語法實現,以及書寫方式,前面多以非遊戲的示例來講明。可是讀者也許並不知道它們在遊戲中的應用是怎樣的,所以本節應用本章所學習的知識編寫了本節的遊戲示例。

Unity遊戲運行效果

本遊戲想要實現的效果是:遊戲會要求玩家按照順序依次按下指定的幾個按鍵,若是玩家成功的按下這組按鍵,就給出表示成功的圖片提示;反之,就給出表示失敗的圖片提示。遊戲運行效果如圖5-1九、5-20、5-21所示。

 

 

圖5-19  遊戲視圖中給出了3組預約義的組合鍵

 

圖5-20  按照組合鍵2的提示                        圖5-21  沒有按照任何組合鍵的提示

補充:此遊戲示例的靈感來源於,《拳皇》打鬥時的組合鍵。玩過此遊戲的讀者,應該知道在此種遊戲中,只有玩家按下了指定的按鍵之後,角色纔會打出絕技!如圖5-22所示。

 

 

圖5-22  《拳皇》中,按下指定的按鍵之後,所展現出的絕技

雖然本遊戲示例沒有這麼精彩的打鬥畫面,可是卻和它有着同樣的對特定按鍵組合的判斷,也就是說,程序首先須要知道玩家是否按下了指定的組合鍵,而後才決定是否展現特定的特技。而本示例就是運用了本節所學的知識,實現了前一部分的功能。

Unity遊戲實現步驟

遊戲的具體實現步驟以下:

(1爲遊戲項目導入6張圖片,其中4個是用於表示方向的,2個是用於表示成功和失敗時的表情的。本遊戲示例導入的6張圖片,如圖5-23所示。

 

 

圖5-23  爲遊戲項目導入的6張圖片

(2新建遊戲項目時,新的遊戲場景也被建立了,並且此遊戲場景中還有一個遊戲對象——Main Camera。本節所建立的遊戲示例,因爲是經過界面的繪製實現的,所以不須要讀者繼續往遊戲場景裏添加其它遊戲對象了。

(3在Project視圖裏,新建一個腳本,命名爲MyScript。本遊戲的全部運行邏輯都將在此腳本中實現。此腳本將被賦予Main Camera遊戲對象。

Unity遊戲腳本的編寫

腳本的代碼,涉及了遊戲的全部運行邏輯,內容較多,就將其劃分紅了一個小節。本小節也所以得覺得讀者詳細介紹腳本代碼的思考和編寫過程。

1.聲明變量

(1遊戲項目中有6張圖片,腳本會操做這6張圖片,而後按照指定的遊戲邏輯,將它們顯示在遊戲視圖中。所以腳本中須要聲明存儲這6張圖片(數據)的變量,以下:

 

  •          public Texture[] image;

 

既然都是圖片,聯想到本章所學的知識,就很容易想到使用數組,固然讀者也能夠選擇使用列表。

提示:Texture在Unity腳本中是表示用於存儲圖片這種數據的數據類型。

由於變量被public修飾,因此它會以屬性的形式,出如今Inspector視圖的組件下。讀者須要在此視圖裏,將圖片做爲屬性值,賦予這個數組。具體的賦值方式就是拖動,即將圖片從Project視圖,拖動到Inspector視圖,如圖5-24所示。

 

 

圖5-24  腳本組件屬性的設置

提示:讀者必定要注意數組各圖片數據的排列順序,由於後面要編寫的腳本代碼將直接使用下標,引用數組中存儲的圖片數據。對於本示例,圖片數組中的存儲順序是:up、down、left、right、success和fail。

(2一樣須要聲明數組的地方,還有表示預約義的3組組合鍵的數據,以下:

 

  •          int[,] Sample =
  •          {
  •                    //上+下+左+右+空格
  •                    {KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_SPACE},
  •                    //上+下+上+下+空格
  •                    {KEY_UP,KEY_DOWN,KEY_UP,KEY_DOWN,KEY_SPACE},
  •                    //左+右+左+右
  •                    {KEY_LEFT,KEY_RIGHT,KEY_LEFT,KEY_RIGHT,KEY_SPACE},
  •          };

 

代碼中聲明的是「二維數組」,而本節詳細介紹的是「一維數組」,關於二維數組的介紹讀者能夠參考專業的書籍。實際上,讀者能夠簡單的將「二維數組」看做是「一維數組中存儲的數據是一維數組」。這段代碼在聲明二維數組的時候,還對數組進行了初始化。初始化的數據是預約義的3組組合鍵,從代碼的註釋中,讀者很容易就能夠看出哪些按鍵,及其順序構成了組合鍵。可是,讀者也許對於那些大些字母感到陌生,它們其實是「整型常量」,一樣須要聲明在MyScript腳本中,以下:

 

  •          public const int KEY_UP = 0;
  •          public const int KEY_DOWN = 1;
  •          public const int KEY_LEFT = 2;
  •          public const int KEY_RIGHT = 3;
  •          public const int KEY_SPACE = 4;

 

(3腳本還須要聲明的變量有:

 

  • q  實時記錄玩家按下了哪些按鍵的變量,因爲玩家確定會按下不僅一個按鍵,所以這裏選擇列表存儲這類數據,以下:
  •          private List<int> playerInput;
  • q  玩家在一個時間點,按下的是何種按鍵:
  •          private int currentKeyDown;
  • q  玩家是否成功的按下了一組組合按鍵:
  •          private bool isSuccess = false;

 

2.定義方法

(1在聲明表示列表的變量,並不意味着就爲列表變量分配了存儲空間。所以,腳本須要在被初始化時,爲列表分配存儲空間,以下:

 

  •          void Start()
  •          {
  •                    playerInput = new List<int>();
  •          }

 

Start()方法是Unity定義的方法,此方法會在腳本被初始化時調用,所以將爲列表分配存儲空間的代碼置於此方法中,再合適不過。

(2在腳本中,本身定義一個方法,用於記錄每個時刻,玩家按下的指定按鍵,以下:

 

  •          void UpdateKey()
  •          {
  •                    if(Input.GetKeyDown (KeyCode.UpArrow))
  •                             currentKeyDown = KEY_UP;
  •                    if(Input.GetKeyDown (KeyCode.DownArrow))
  •                             currentKeyDown = KEY_DOWN;
  •                    if(Input.GetKeyDown (KeyCode.LeftArrow))
  •                             currentKeyDown = KEY_LEFT;
  •                    if(Input.GetKeyDown (KeyCode.RightArrow))
  •                             currentKeyDown = KEY_RIGHT;
  •                    if(Input.GetKeyDown (KeyCode.Space))
  •                             currentKeyDown = KEY_SPACE;
  •          }

 

判斷玩家是否按下了指定按鍵,可使用if語句,若是按下的話,就將表示此按鍵的數據存儲於變量currentKeyDown中。if語句的判斷部分,是用於檢測鍵盤上的按鍵是否被按下的Unity定義的方法。今後段代碼中能夠看出,遊戲檢測的按鍵有5個,包括鍵盤上的4個方向鍵和1個空格鍵。

(3在Unity每幀調用的Update()方法中,添加表示下列用途的代碼:

 

  • q  要想確保前面定義的方法UpdateKey(),在遊戲中的每一個時刻都被調用,最好藉助於Update()方法;
  • q  腳本還須要時刻將玩家按下的按鍵,存儲於列表中;
  • q  當列表中有5個數據的時候,就去與預約義的組合鍵作比較,若是一致就表示輸入成功,不一致就表示輸入失敗;
  • q  不管失敗與否,都須要將列表清空,由於列表還須要存儲下一輪玩家按下的按鍵。

 

具體的代碼實現過程以下:

 

  • 01              void Update()
  • 02              {
  • 03                        //檢測當前玩家按下的按鍵
  • 04                       UpdateKey ();
  • 05                        //當前有任何按鍵被按下的時候
  • 06                       if(Input.anyKeyDown)
  • 07                       {
  • 08                                 if(isSuccess)
  • 09                                 {
  • 10                                          isSuccess = false;
  • 11                                          playerInput.Clear ();
  • 12                                 }
  • 13                                 //將玩家按下的方向鍵添加到列表中
  • 14                                 playerInput.Add (currentKeyDown);
  • 15                                 //獲取當前列表數據個數
  • 16                                 int listCount = playerInput.Count;
  • 17                                 //若是已經按下了5個鍵,就判斷是不是組合鍵
  • 18                                 if(listCount == 5)
  • 19                                 {
  • 20                                          for(int i = 0;i < 3;i++)
  • 21                                          {
  • 22                                                   int SuccessCount = 0;
  • 23                                                   for(int j = 0;j < 5;j++)
  • 24                                                   {
  • 25                                                             int tempKey = playerInput[j];
  • 26                                                             if(tempKey == Sample[i,j])
  • 27                                                                      SuccessCount++;
  • 28                                                   }
  • 29                                                   if(SuccessCount == 5)
  • 30                                                             isSuccess = true;
  • 31                                          }
  • 32                                 }
  • 33                                 if(listCount > 5)
  • 34                                          playerInput.Clear();
  • 35                       }
  • 36              }

 

(4對於本遊戲示例,遊戲視圖須要實時顯示的元素有,如圖5-25所示。

 

  • q  玩家此時按下了哪些預約義的按鍵,即「上、下、左、右」4個方向鍵中的哪個,至於「空格」按鍵嘛,因爲沒有表示此按鍵的圖片,因此就不顯示了;
  • q  表示玩家是否按下了5個指定按鍵的圖片,即success和fail所表示的圖片;
  • q  用於提示玩家有哪些組合按鍵的文字信息;

 

 

 

圖5-25  遊戲視圖上,各元素的顯示

由於Unity是經過調用OnGUI()方法來決定,在遊戲視圖上繪製哪些界面元素的,所以須要將顯示上面所列元素的代碼,置於此方法中,以下:

 

  • 01              void OnGUI()
  • 02              {
  • 03                       GUILayout.BeginHorizontal();
  • 04                        //表示鏈表中存儲的數據個數
  • 05                       int listCount = playerInput.Count;
  • 06                        //遍歷鏈表中的全部數據
  • 07                       for(int i = 0;i < listCount;i++)
  • 08                       {
  • 09                                 //顯示方向按鍵對應的圖片到遊戲視圖
  • 10                                 int key = playerInput[i];
  • 11                                 Texture tempTex = null;
  • 12                                 switch(key)
  • 13                                 {
  • 14                                 case KEY_UP:
  • 15                                          tempTex = image[0];
  • 16                                          break;
  • 17                                 case KEY_DOWN:
  • 18                                          tempTex = image[1];
  • 19                                          break;
  • 20                                 case KEY_LEFT:
  • 21                                          tempTex = image[2];
  • 22                                          break;
  • 23                                 case KEY_RIGHT:
  • 24                                          tempTex = image[3];
  • 25                                          break;
  • 26                                 }
  • 27                                 if(tempTex != null)
  • 28                                          GUILayout.Label (tempTex,GUILayout.Width (70),GUILayout.Height (70));
  • 29                       }
  • 30                       if(isSuccess)
  • 31                                 GUILayout.Label (image[4],GUILayout.Width (70),GUILayout.Height (70));
  • 32                       else if(!isSuccess && listCount == 5)
  • 33                                 GUILayout.Label (image[5],GUILayout.Width (70),GUILayout.Height (70));
  • 34                       GUILayout.EndHorizontal();
  • 35                       GUILayout.Space (20);
  • 36                        GUILayout.Label ("組合鍵1:上、下、左、右、空格");
  • 37                        GUILayout.Label ("組合鍵2:上、下、上、下、空格");
  • 38                        GUILayout.Label ("組合鍵3:左、右、左、右、空格");
  • 39              }

 

3.腳本代碼概覽

前面已經詳細的介紹了在腳本中,方法的聲明、方法的定義,以及變量和方法對於遊戲效果的意義。可是讀者也許還沒法將它們組合成一個總體,相信下面的腳本代碼概覽對讀者有幫助,以下:

 

  • 01     using UnityEngine;
  • 02     using System.Collections.Generic;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              //4個方向圖片,2個表示按鍵成功和失敗的圖標
  • 07              public Texture[] image;
  • 08              //自定義方向鍵的存儲值
  • 09              public const int KEY_UP = 0;
  • 10              public const int KEY_DOWN = 1;
  • 11              public const int KEY_LEFT = 2;
  • 12              public const int KEY_RIGHT = 3;
  • 13              public const int KEY_SPACE = 4;
  • 14              //表示各組合鍵
  • 15              int[,] Sample =
  • 16              {
  • 17                        //上+下+左+右+空格
  • 18                       {KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_SPACE},
  • 19                        //上+下+上+下+空格
  • 20                       {KEY_UP,KEY_DOWN,KEY_UP,KEY_DOWN,KEY_SPACE},
  • 21                        //左+右+左+右
  • 22                       {KEY_LEFT,KEY_RIGHT,KEY_LEFT,KEY_RIGHT,KEY_SPACE},
  • 23              };
  • 24              //記錄玩家按下的全部鍵
  • 25              private List<int> playerInput;
  • 26              //記錄當前的按鍵
  • 27              private int currentKeyDown;
  • 28              //表示是否成功的按下了組合鍵
  • 29              private bool isSuccess = false;
  • 30              //初始化腳本
  • 31              void Start()
  • 32              {
  • 33                       playerInput = new List<int>();
  • 34              }
  • 35              //獲取玩家按下的方向鍵
  • 36              void UpdateKey()
  • 37              {
  • 38                        …                                                                       //省略
  • 39              }
  • 40              void Update()
  • 41              {
  • 42                        …                                                                       //省略
  • 43              }
  • 44              //繪製遊戲視圖的界面元素
  • 45              void OnGUI()
  • 46              {
  • 47                        …                                                                       //省略
  • 48              }
  • 49     }

 

小結

一款遊戲,玩家能夠百玩不厭,究其緣由就在於遊戲容許玩家經過選擇,進而左右遊戲劇情的發展。遊戲自己則須要判斷玩家作出了怎樣的選擇,判斷的方式就是使用判斷語句,所以本章介紹了if、switch。又因爲玩家有時須要從大量的數據中作出選擇,例如,玩家的角色會數十種技能,要從中選擇一個技能。這又涉及到大量數據的存儲,所以本章介紹了數組、列表和字典。遊戲自己要從大量數據中判斷出玩家選擇的是哪個數據,所以最後介紹了遍歷大量數據的方式,即foreach、for和while循環。本章的末尾,還以一個較大的遊戲示例,展現了本章所學知識在遊戲中的應用。

本文選自:C#遊戲開發快速入門大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!

相關文章
相關標籤/搜索