C#開發Unity遊戲教程之使用指令碼變數

大學霸發表於2015-07-08

C#開發Unity遊戲教程之使用指令碼變數

使用指令碼變數

本章前面說了那麼多關於變數的知識,那麼在指令碼中要如何編寫關於變數的程式碼,有規章可循嗎?答案是有的。本節會依次講解變數的宣告、初始化、賦值和運算。

Unity指令碼中宣告變數

要想在指令碼中使用變數,就必須先宣告(declare)。這就意味著,需要先告訴Unity,有這樣一個變數存在,然後才可以在Unity中使用這個變數。那麼,該如何將這個變數存在的事實告知Unity呢?答案就是宣告。實際上,讀者已經在本章見過多次變數的宣告瞭,沒錯就是圖3-11所示的樣子。


3-11  指令碼中宣告變數的程式碼

對於變數的宣告,必須滿足下面的3個條件:

  • q  必須指定變數可以儲存的資料的型別;

  • q  必須指定一個變數名;

  • q  必須以一個分號“;”結束;

宣告變數的形式如下:

  • 資料型別 變數名;

例如:

  • int number1;

這樣的宣告方式符合要求,因為:

  • q  語句指定了變數可以儲存的資料型別是int,也就是說可以儲存整數;

  • q  語句指定了變數名,即number1

  • q  語句最後以分號“;”結尾;

對於這樣一個宣告語句,Unity會按照下面的方式去理解:

  • q  宣告語句沒有明確的說明是public,還是private,因此就當作private處理;

  • q  此變數將不會出現在指令碼的屬性中,而且也無法被其它指令碼訪問;

  • q  變數名number1,預設指代的資料是0

Unity變數的初始化

在宣告變數的同時,為變數指定值,在C#中就被稱為變數的初始化。被初始化的值,同樣會顯示在遊戲物件屬性的輸入框中,如圖3-12所示。



3-12  屬性輸入框中是變數被初始化的值

Unity變數的運算

在指令碼中使用變數時,通常會對變數做些運算,或者說是對變數中的資料做某些算術處理,而處理的結果有時會進入新的運算中,有時則會作為遊戲的結果而輸出。只要是對變數中的資料做處理,就需要用到運算子。C#中的運算子大體可以分為4類:算術運算子、自增自減運算子、複合運算子和位運算子,如表3.2所示。

3.2  運算子 

 

Unity成員變數

目前為止,示例指令碼中宣告的變數,也被稱為“成員變數”(member variables)。因為它們被宣告在類MyScript大括號的裡面,方法大括號的外面。提及“成員變數”這個概念是因為,只有成員變數才可以作為元件的屬性顯示在元件下。

提示:成員變數宣告的位置,因人而異,作者喜歡把它們寫在類中所有方法的前面,並且寫在一起,這樣的話類中有哪些成員變數一目瞭然,例如:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class MyScript : MonoBehaviour

  • 05     {

  • 06              public int number1 = 2;

  • 07              public float number2 = 4.7f;

  • 08              public float number3 = 6.12f;

  • 09              void Start()

  • 10              {

  • 11                       AddTwoNumbers();

  • 12                       SubTwoNumbers();

  • 13              }

  • 14              void AddTwoNumbers()

  • 15              {

  • 16                       Debug.Log (number1 + number2);

  • 17              }

  • 18              void SubTwoNumbers()

  • 19              {

  • 20                       Debug.Log(number3 - number2);

  • 21              }

  • 22     }

  • 但是也有人喜歡將成員變數分開寫在它們第一次被方法使用的方法名的前面,例如:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class MyScript : MonoBehaviour

  • 05     {

  • 06              public int number1 = 2;

  • 07              public float number2 = 4.7f;

  • 08              void Start()

  • 09              {

  • 10                       AddTwoNumbers();

  • 11                       SubTwoNumbers();

  • 12              }

  • 13              void AddTwoNumbers()

  • 14              {

  • 15                       Debug.Log (number1 + number2);

  • 16              }

  • 17              public float number3 = 6.12f;

  • 18              void SubTwoNumbers()

  • 19              {

  • 20                       Debug.Log(number3 - number2);

  • 21              }

  • 22     }

因人而異,讀者可以選擇自己喜歡的方式。以上兩個指令碼中實現的功能是一樣的,即宣告變數、初始化變數,最後將變數的運算結果輸出到Console檢視裡,如圖3-13所示。


3-13  Console檢視裡,輸出了變數的運算結果

Unity變數的作用域

變數的作用域(scope),可以被理解成“變數在指令碼中的存在範圍”。例如,對於下面的指令碼:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class MyScript: MonoBehaviour

  • 05     {

  • 06              private string block1 = "Block 1 text";

  • 07              void Start()

  • 08              {

  • 09                       Debug.Log (block1);

  • 10                       string block2 = "Block 2 text";

  • 11                       Debug.Log (block2);

  • 12    

  • 13                       {

  • 14                                 Debug.Log (block1);

  • 15                                 Debug.Log (block2);

  • 16                                 string block3 = "Block 3 text";

  • 17                                Debug.Log (block3);

  • 18                       }

  • 19              }

  • 20     }

指令碼中一共有3個作用域,分別以3個大括號為邊界,即3個作用域的範圍是:05~2008~1913~18。而變數的作用域,將從它被宣告的位置開始,一直到它所處的作用域的末尾處。

  • q  指令碼中一共宣告瞭3string型別的變數,分別位於指令碼的061016行。

  • q  變數block1的作用域是07~20行;

  • q  變數block2的作用域是11~19行;

  • q  變數block3的作用域是16~18行;

Unity中,執行遊戲,然後在Console檢視裡檢視輸出結果,如圖3-14所示。


3-14  Console檢視的輸出結果

如果指令碼中,不小心在變數的作用域外使用了變數的話,Console檢視會提示錯誤,錯誤資訊大致是告訴你“變數在宣告前不能使用”,即變數是不存在的。例如,在指令碼09行插入下面的程式碼,Console檢視提示的錯誤資訊,如圖3-15所示。

  • 09                       Debug.Log (block2);


3-15  在作用域外使用變數,所導致的錯誤的資訊提示

Unity中的指令碼語句

學習過英語的人,都該知道“語句”。因為書寫英語文章的時候,我們通常使用點“.”作為英語語句的結束標誌。同理,當你書寫一行程式碼的時候,可以將分號“;”置於程式碼的末尾處,這用於表示這是一條程式碼語句。

一行程式碼就是一條語句嗎?答案是否定的。C#語法規定,語句是以分號“;”為結束標誌的。例如:

  • public int number1 = 2;

這行程式碼的作用是宣告一個名為number1的變數,儲存的資料是2。這是一行程式碼,它以分號“;”結尾,因此它也是一條語句!再看下面的程式碼:

  • public

  • int

  • number1

  • =

  • 2;

雖然程式碼被分成了5行書寫,但是因為只出現了一個分號,所以這也是一條語句。讀者可以使用這條語句,替換上面的那條語句,執行效果是沒有絲毫區別的。

提示:儘管在語法上是正確的,但是不推薦讀者使用這種方法。因為寫成這樣的程式碼會佔用更多的視覺空間。也就是說,一次可以看到的語句數量減少了,最終使得指令碼程式碼變得極難閱讀。推薦讀者將一個語句寫到一行,語句太長的話,再考慮分成兩行來寫。

Unity遊戲示例

本章學習了那麼多關於變數的知識,那麼到底在遊戲中有什麼實際意義嗎?讀者可以先從變數著手,進而發覺它對於遊戲的意義。變數的作用是儲存資料,而這個資料在指令碼程式碼中會被用於做其它處理,進而影響到遊戲場景中游戲物件的行為。如果這個指令碼被賦予了某一個具體的遊戲物件,那麼就可以透過設定指令碼元件下的屬性值,進而改變指令碼程式碼中操作的資料,這同樣會影響到遊戲物件的行為。這麼說果然還是太抽象了,下面將以一個示例說明。

1為遊戲專案裡的遊戲場景新增2個遊戲物件:CubeDirectional,前者是指令碼打算操作的遊戲物件,後者是負責遊戲場景照明的遊戲物件。調整遊戲場景中3個遊戲物件的位置,使得Game檢視達到最佳的效果,如圖3-16所示。

提示:3個遊戲物件?難道不是2個嗎?希望讀者沒有忘記Unity為遊戲場景自動新增的Main Camera,此物件決定了Game檢視的成像效果。


3-16  Unity裡的SceneGame檢視

2Project檢視裡,新建一個指令碼,命名為MyScript,開啟此指令碼並新增下面的程式碼:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class MyScript : MonoBehaviour

  • 05     {

  • 06              //宣告4個變數

  • 07              public GameObject myCube;

  • 08              public int transSpeed = 100;

  • 09              public float rotaSpeed = 10.5f;

  • 10              public float scale = 3;

  • 11              void OnGUI()

  • 12              {

  • 13                        if( GUILayout.Button ("移動立方體") )

  • 14                       {

  • 15                                 myCube.transform.Translate (Vector3.forward*transSpeed*Time.deltaTime,Space.World);

  • 16                       }

  • 17                        if( GUILayout.Button ("旋轉立方體") )

  • 18                       {

  • 19                                 myCube.transform.Rotate (Vector3.up*rotaSpeed,Space.World);

  • 20                       }

  • 21                        if( GUILayout.Button ("縮放立方體") )

  • 22                       {

  • 23                                 myCube.transform.localScale = new Vector3(scale,scale,scale);

  • 24                       }

  • 25              }       

  • 26     }

指令碼的07~10行,一共宣告瞭4個變數,且都使用public修飾,所以它們可以作為屬性,出現在元件下。後3個變數還被初始化了,除了第1個變數的資料型別讀者無需在意外,後3個變數的型別在本章中都有介紹。

提示:讀者只要體會變數在指令碼中的書寫形式,以及對於遊戲的作用效果就可以了,無需太過關注其它部分。其它部分不是本章講解的重點,但它們幫助實現了遊戲的效果。

3將指令碼MyScript賦予Main Camera,指令碼就會作為元件出現在Main Camera物件的Inspector檢視中,如圖3-17所示。


3-17  Main Camera物件的Inspector檢視 3-18  為屬性My Cube賦值

指令碼元件下的屬性名與指令碼中宣告的變數名基本一致,且屬性框中已經有值了,這個值是在變數初始化時指定的。

提示:My Cube屬性的值需要讀者手動新增,新增的方法是,將Hierarchy檢視裡的Cube物件,拖動到My Cube屬性的屬性框中,如圖3-18所示。 

4執行遊戲,在Game檢視的左上角會出現3個按鈕:移動立方體、旋轉立方體和縮放立方體。單擊按鈕,即可完成對立方體物件的指定操作,如圖3-19所示。


3-19  透過單擊遊戲檢視上的按鈕,操縱遊戲中的立方體

5讀者可能要問了,變數對於遊戲的意義還沒有體現出來了,別急,現在就體現變數的作用。讀者如果要在Unity中尋找變數的話,可能就要失望了,因為變數早就轉變成屬性了。因此對屬性的操作,就是對變數的操作。

讀者多“玩”會兒這個遊戲就會發現,立方體的移動速度、旋轉速度,甚至是縮放倍數是固定的!如果讀者想要改變它們的話應該怎麼辦?讀者想的沒錯,這個時候屬性就派上用場了,還記得那3個屬性Trans SpeedRota SpeedScale吧,手動修改它們的屬性值,然後再單擊按鈕試試,怎樣效果不一樣了吧,如圖3-20所示,以屬性Scale的修改為例。


3-20  透過修改屬性Scale的值,進而改變立方體的縮放倍數

小結

本章站在指令碼變數的角度上,全方位的向讀者介紹了元件的屬性。內容包括:屬性名(變數名)的本質就是一個指代,它並非真正的資料;並非所有的變數在元件的屬性都是可見的;即時同樣是屬性,也存在不同的型別;指令碼中變數的編寫規則。最後,本章以一個簡單的遊戲收尾,用以凸顯變數,或者說屬性之於遊戲的重要作用。

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1726276/,如需轉載,請註明出處,否則將追究法律責任。

相關文章