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

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

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

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

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

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

  • q  如何在腳本中存儲和引用這大量的數據,若是使用變量,顯然要聲明大量的變量,這樣作顯然不妥;spa

  • q  若是已經獲得了大量的數據,該使用什麼方式去一一判別呢,難道說要使用大量if語句,去對數據一一判別,這樣作顯然也不妥;orm

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

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

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

1.數組遊戲

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

  • 數據類型[ ] 數組名;ip

  • q  全部經常使用的數據類型,在本書第3章中已經使用表格列出了;

  • q  數據類型後面跟着的是一對中括號「[ ]」;

  • q  數組名與變量名同樣,必須遵循C#的命名規定;

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

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

讀者應該能夠從這條語句中看出,聲明的是int類型的數組,數組名爲myIntArray,存儲了5int類型的數據,分別是13579

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

  • 數組名[下標];

  • 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  腳本1314行,引用列表數據的方式以下:

  • 09                       myIntList[0]

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

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

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 ("字典中key10的數據是:" + myDic[10]);                   //引用字典中的數據

  • 14                        Debug.Log ("字典中key20的數據是:" + myDic[20]);

  • 15                       myDic[40] = "Thursday";

  • 16                        Debug.Log ("字典中key40的數據:" + 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  腳本131416行,字典引用數據的形式與數組和列表一致,可是中括號「[ ]」裏的數字可不是「下標」,而是「鍵」。

  • 13                        myDic[10]

Unity中遍歷大量的數據

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

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  腳本081522行的代碼,分別聲明瞭數組、列表和字典,而且爲它們初始化了3組數據;

  • q  腳本091624行的代碼,則分別開始使用foreach語句遍歷數組、列表和字典。以09行的語句爲例:

  • 09                       foreach(string myStrArray in myArray)                                        //循環遍歷數組

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

  • foreach(數據類型 變量名 in 數組名)

  • q  腳本111826行的代碼,分別使用if語句判斷變量中的數據,是不是指定的數據。以11行的代碼爲例:

  • 11                                 if(myStrArray == "Monday")

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

  • q  腳本121927行的代碼,則表示當使用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視圖中輸出列表中的全部數據;1213行的代碼,是一個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  判斷語句,包括ifif-elseif-else-ifswitch

  • q  數據存儲方式,包括數組(array)、列表(list)和字典(dictionary);

  • q  大量數據的遍歷方式,包括foreachforwhile

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

Unity遊戲運行效果

本遊戲想要實現的效果是:遊戲會要求玩家按照順序依次按下指定的幾個按鍵,若是玩家成功的按下這組按鍵,就給出表示成功的圖片提示;反之,就給出表示失敗的圖片提示。遊戲運行效果如圖5-195-205-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。本節所建立的遊戲示例,因爲是經過界面的繪製實現的,所以不須要讀者繼續往遊戲場景裏添加其它遊戲對象了。

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

Unity遊戲腳本的編寫

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

1.聲明變量

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

  •          public Texture[] image;

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

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

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

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

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

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個空格鍵。

3Unity每幀調用的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個指定按鍵的圖片,即successfail所表示的圖片;

  • 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     }

小結

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

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

相關文章
相關標籤/搜索