不少時候,遊戲在玩家作出判斷之後,遊戲程序會遍歷玩家身上大量的所需數據,而後作出判斷,即首先斷定玩家是否有權限作出這種選擇,而後才決定是否爲玩家執行此選擇。例如,《仙劍奇俠傳》這款遊戲,進入劇情「荷葉迷宮時」,會要求玩家擊碎迷宮裏的5尊雕塑,如圖5-12所示。可是擊碎的前提是,玩家身上必須攜帶有「錘子」。也就是說系統會遍歷玩家身上全部的資源,若是有錘子才能擊碎雕塑。數組
圖5-12 《仙劍奇俠傳》,荷葉迷宮全圖網絡
判斷是否有指定的數據,可使用本章前面所學的if語句來解決。可是目前還存在兩個其它的問題:學習
q 如何在腳本中存儲和引用這大量的數據,若是使用變量,顯然要聲明大量的變量,這樣作顯然不妥;spa
q 若是已經獲得了大量的數據,該使用什麼方式去一一判別呢,難道說要使用大量if語句,去對數據一一判別,這樣作顯然也不妥;orm
C#卻是提供了兩種機制,能夠頗有效的解決以上的兩個問題,本節會逐個詳解介紹它們。對象
C#指定了3種存儲與引用大量數據的方法,分別是:數組、列表和字典。本小節會使用簡單的小示例依次講解它們,至於大的遊戲示例,會在本章講解完全部的知識點之後給出。教程
1.數組遊戲
數組能夠存儲大量同類型的數據,它的聲明格式爲:圖片
數據類型[ ] 數組名;ip
q 全部經常使用的數據類型,在本書第3章中已經使用表格列出了;
q 數據類型後面跟着的是一對中括號「[ ]」;
q 數組名與變量名同樣,必須遵循C#的命名規定;
例如,下面的代碼語句聲明,而且初始化了數組:
int[] myIntArray = {1,3,5,7,9};
讀者應該能夠從這條語句中看出,聲明的是int類型的數組,數組名爲myIntArray,存儲了5個int類型的數據,分別是1、3、5、7和9。
引用數組中指定數據的格式爲:
數組名[下標];
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 腳本13、14行,引用列表數據的方式以下:
09 myIntList[0]
單從編寫樣式上看,它的引用方式與數組引用自身數據的方式如出一轍,並且它的下標也是從0開始,表示存儲的第1個數據,其它數據的存儲下標以此類推。
q 腳本16、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 腳本13、14和16行,字典引用數據的形式與數組和列表一致,可是中括號「[ ]」裏的數字可不是「下標」,而是「鍵」。
13 myDic[10]
若是須要在腳本中使用一樣的操做去一一判別大量的數據,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 腳本08、15和22行的代碼,分別聲明瞭數組、列表和字典,而且爲它們初始化了3組數據;
q 腳本09、16和24行的代碼,則分別開始使用foreach語句遍歷數組、列表和字典。以09行的語句爲例:
09 foreach(string myStrArray in myArray) //循環遍歷數組
foreach後括號「( )」裏的語句,表示的含義是:要遍歷的是myArray數組,而數組中的每一個數據都將先被存儲於同類型的myStrArray變量中。語句的書寫格式以下:
foreach(數據類型 變量名 in 數組名)
q 腳本11、18和26行的代碼,分別使用if語句判斷變量中的數據,是不是指定的數據。以11行的代碼爲例:
11 if(myStrArray == "Monday")
if後括號「( )」裏的語句,是一個關係表達式,當變量myStrArray裏的數據字符串是Monday時,表達式的值纔是true。
q 腳本12、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視圖中輸出列表中的全部數據;12、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循環的示例同樣,這裏就不作重複說明了。
本章前後學習了C#語法裏,3個部分的內容。這3個部分是:
q 判斷語句,包括if、if-else、if-else-if和switch;
q 數據存儲方式,包括數組(array)、列表(list)和字典(dictionary);
q 大量數據的遍歷方式,包括foreach、for和while;
爲了更方便的說明各部分的語法實現,以及書寫方式,前面多以非遊戲的示例來講明。可是讀者也許並不知道它們在遊戲中的應用是怎樣的,所以本節應用本章所學習的知識編寫了本節的遊戲示例。
本遊戲想要實現的效果是:遊戲會要求玩家按照順序依次按下指定的幾個按鍵,若是玩家成功的按下這組按鍵,就給出表示成功的圖片提示;反之,就給出表示失敗的圖片提示。遊戲運行效果如圖5-19、5-20、5-21所示。
圖5-19 遊戲視圖中給出了3組預約義的組合鍵
圖5-20 按照組合鍵2的提示 圖5-21 沒有按照任何組合鍵的提示
補充:此遊戲示例的靈感來源於,《拳皇》打鬥時的組合鍵。玩過此遊戲的讀者,應該知道在此種遊戲中,只有玩家按下了指定的按鍵之後,角色纔會打出絕技!如圖5-22所示。
圖5-22 《拳皇》中,按下指定的按鍵之後,所展現出的絕技
雖然本遊戲示例沒有這麼精彩的打鬥畫面,可是卻和它有着同樣的對特定按鍵組合的判斷,也就是說,程序首先須要知道玩家是否按下了指定的組合鍵,而後才決定是否展現特定的特技。而本示例就是運用了本節所學的知識,實現了前一部分的功能。
遊戲的具體實現步驟以下:
(1)爲遊戲項目導入6張圖片,其中4個是用於表示方向的,2個是用於表示成功和失敗時的表情的。本遊戲示例導入的6張圖片,如圖5-23所示。
圖5-23 爲遊戲項目導入的6張圖片
(2)新建遊戲項目時,新的遊戲場景也被建立了,並且此遊戲場景中還有一個遊戲對象——Main Camera。本節所建立的遊戲示例,因爲是經過界面的繪製實現的,所以不須要讀者繼續往遊戲場景裏添加其它遊戲對象了。
(3)在Project視圖裏,新建一個腳本,命名爲MyScript。本遊戲的全部運行邏輯都將在此腳本中實現。此腳本將被賦予Main Camera遊戲對象。
腳本的代碼,涉及了遊戲的全部運行邏輯,內容較多,就將其劃分紅了一個小節。本小節也所以得覺得讀者詳細介紹腳本代碼的思考和編寫過程。
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人!