C#開發Unity遊戲教程之遊戲物件的屬性變數

大學霸發表於2015-07-07

C#開發Unity遊戲教程之遊戲物件的屬性變數

Unity遊戲物件的屬性——變數

透過對上一章的學習,讀者應該瞭解到了,遊戲物件上的屬性與指令碼中的變數,建立聯絡的方式就是將指令碼賦予遊戲物件。上一章只是簡單的介紹了指令碼中的變數,讀者一定不過癮,現在好了,作者將使用一整章的篇幅介紹變數與屬性。

Unity遊戲物件的屬性

Unity中,遊戲場景中游戲物件的屬性,可以在Inspector檢視裡檢視,想看哪個遊戲物件的屬性,就使用滑鼠選中哪個遊戲物件即可。例如,要檢視遊戲場景中Main Camera物件的屬性,只需在Hierarchy檢視裡選中Main Camera,然後Inspector檢視就會顯示出它的所有屬性,如圖3-1所示。


3-1  Inspector檢視裡檢視Main Camera物件的屬性

透過上一章節的學習,讀者應該瞭解到,屬性是顯示在元件之下的,元件的本質是類,而屬性的本質就是變數,只不過使用者是無法檢視Unity這些內建元件類的程式碼的。因此,下面以自己編寫的指令碼來說明元件之於指令碼中定義的類,屬性之於指令碼中的變數,它們之間的對應關係。

1Project檢視裡,單擊Create|C# Script命令,建立指令碼並命名為MyScript,使用滑鼠雙擊開啟指令碼,並在指令碼中新增下面程式碼:


  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03    
  • 04     public class MyScript : MonoBehaviour
  • 05     {
  • 06              public int iValue;
  • 07              public string strValue;
  • 08              public float fValue;
  • 09     }


提示:新建立的指令碼,裡面有很多Unity自動新增的程式碼,對於沒有實際意義的程式碼,讀者可以將其刪除。

2MyScript指令碼拖動到Main Camera物件上,再次使用Inspector檢視檢視Main Camera物件的屬性,如圖3-2所示,會發現指令碼也變成了元件,成為了Main Camera物件的一部分,並且這個元件下顯示的屬性,就是指令碼中的變數。


3-2  指令碼之於元件,變數之於屬性

Unity中指代資料的名稱

既然遊戲物件屬性的本質就是變數,那麼指令碼中的變數又是什麼?在上一章曾向讀者說明過,變數實際上就是一個儲存資料的單元,而讀者在指令碼中所看到的“變數”,準確的說應該是“變數名”。“變數名”顧名思義就是指變數的名稱,它的作用是指代變數,或者說是指代變數中的資料。就上一節的示例而言,指令碼中的變數名是iValuestrValuefValue,如圖3-3所示。


3-3  指令碼中的變數名

Unity變數命名規則

指令碼中的變數名,看起來就是一串字母,但它是有自己的命名規則的,這個規則是被C#語法所規定的,即:變數名只能由字母、數字和下劃線組成,且只能以字母或者下劃線開頭。對這個規則的解釋如下:


  • q  同一字母的大小寫,對於變數名是不同的。例如,iValue和IValue是不同的變數名;
  • q  不能以數字開頭。例如,iValue和_Value是合法的,但是1Value是不合法的;


Unity變數命名約定

“規則”是必須遵守的,有強制性,不遵守的話就會出現語法上的錯誤。而“約定”則是要看意願的,讀者可以不遵守約定,也不會犯任何語法上的錯誤。雖然它沒有強制性,但是讀者也最好了解一下,因為遵守約定,利於程式碼的閱讀,以及遊戲程式設計人員協同工作。

1.選擇有意義的名稱

最好為變數選擇有意義的名稱,否則讀者會在很長一段時間以後,忘記當初為什麼要命這樣一個變數名,以及這個變數名想要指代一個什麼樣的資料。下面以一個例子來說明:


  • public bool theBearMakesBigPottyInTheWoods = true;


這個變數名可真長!但它確實清楚的描述了自己,因此即時讀者在10年後看到這個變數,仍然能從它的名字上了解到當初什麼要命這樣一個變數名,以及這個變數名想要指代一個什麼樣的資料。現在給這個變數換另一個簡單點的名字:


  • public bool potty = true;


這個名字確實簡潔多了!畢竟缺少了好多描述性的資訊。也許讀者在為變數命名的時候,還記得它的作用,但是過幾周之後就不一定了。到時候,讀者將不得不閱讀更多的程式碼,來推測這個變數名的作用。

2.小寫字母開頭

使用小寫字母作為變數名的首字母,是為了讓變數名與類名區別開來,從而使得程式碼閱讀者可以輕鬆地從名稱上,得知名稱是變數名還是類名。因為類名通常是使用大些字母開頭的,因此最好讓變數名以小寫字母開頭。例如:


  • Transform;                                             //類名
  • transform;                                                        //變數名


如果嚴格的遵守了命名的約定的話,就可以很容易的得知,第一個是類名,第二個是變數名。

提示:在本書後面的章節,讀者會看到類的命名約定,那個時候作者會告訴你類名最好以大寫字母開頭。讀者也可以使用其它的命名約定,但是無論使用何種命名約定,目的都是一致的,就是為了提高程式碼的可讀性,便於多名遊戲程式設計人員的協作。

Unity變數名與屬性名的些許不同

透過本章第一節的學習,讀者已經瞭解到,遊戲物件上屬性的本質就是變數,而屬性名與變數名也是一致的。但是細心的讀者可能發現了,屬性名與變數名並非完全一致,至少首字母的大小寫就不同,如圖3-4所示。


3-4  變數名與屬性名不完全一致

其實同樣的問題,也發生在了指令碼名(類名)與元件名的不一致上。例如,MyScript(指令碼名、類名)的元件名是My Script。這或許是微不足道的,但它卻體現出了Unity的體貼、周到,讀者難道不覺得,Unity所做的這些變動,使得變數名在變成了屬性名以後,更加的易讀了嗎?事實就是如此。

Unity屬性名的可見性

讀者千萬不要認為,只要指令碼中有變數,就會在指令碼成為元件以後,出現在元件下的屬性列表中。這種想法是錯誤的,因為決定變數是否會出現在元件下,成為屬性的因素是,修飾變數的是public,還是private。本章前面部分演示的示例,變數前面都有public修飾,所以才會顯示在元件下的屬性中,如圖3-5所示。


3-5  變數前的修飾部分——public

如果將strValue前的修飾public,換成private,在儲存對指令碼程式碼的修改以後,再次檢視元件下的屬性,就會發現名為Str Value的屬性不見了,如圖3-6所示。


3-6  private修飾的屬性不見了

注意:指令碼中可以省略對變數的修飾,也就是說不書寫publicprivate也不會有語法上的錯誤。此時,Unity會預設變數是被private修飾的,因此此變數同樣不會以屬性的形式顯示在元件下,如圖3-7所示。


3-7  省略了修飾的變數

C#語法規定,被public修飾的變數,可以被外界訪問和修改,也就是說變數儲存的資料,允許在指令碼外被修改。因此開發者才可以在Unity中,透過屬性修改指令碼中變數儲存的資料。被private修飾的變數與public剛好相反,拒絕被外界訪問和修改。因此變數中的資料無法被外界修改,Unity也就不會將此類變數作為屬性顯示在Inspector檢視中。這麼看來,這是一個很明智的決策!

Unity設定屬性的資料型別

屬性就是變數,它們二者只是同一事物在不同場景下的不同稱呼而已。在Unity中,應該說屬性有不同的資料型別,但是如果在指令碼中,就只能說變數有不同的資料型別了。資料型別是什麼?讀者實際上已經在指令碼中見過的,如圖3-8所示。


3-8  指令碼中的3種資料型別

Unity中的資料型別

計算機可以儲存各種各樣的資料,而計算機對於不同型別的資料的儲存和處理方式是不同的。因此,為了讓計算機更好的處理指定的資料,最好為資料指定型別。C#中的資料型別可以分為圖3-9所示的幾大類。


3-9  資料型別的分類

Unity中常用的資料型別是簡單值型別,如表3.1所示。

3.1  簡單值型別


為變數或者說屬性設定型別的依據是,看看資料處於哪一個範圍。例如,262只能使用long型別儲存,但是對於50,可以使用所有的整型型別儲存,這時就要看哪個型別最合適了。

 Unity屬性資料型別的體現形式

對於屬性而言,不同資料型別的屬性可以儲存的資料種類不同,因此它在Inspector裡的資料輸入形式就會不同,如圖3-10所示。


3-10  Inspector檢視裡,不同種類的屬性


  • q  int、float、double型別的資料都是數值,因此在未指定iValue、fValue和dValue所指代資料的具體值時,Unity會自動為屬性賦值0;
  • q  string型別的資料是字元,因此在未指定strValue所指代資料的具體值時,Unity會自動為屬性賦值“空字元”;
  • q  bool型別的值只可能是true或者false,因此Unity使用了一個核取方塊表示bValue所指代的資料,且預設設定其為false,當核取方塊被複選時,表示值為true;


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

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

相關文章