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

2021-09-08 11:10:15 字數 4235 閱讀 9986

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

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

圖3-1  在inspector檢視裡檢視main camera物件的屬性

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

(1在project檢視裡,單擊create|c# script命令,建立指令碼並命名為myscript,使用滑鼠雙擊開啟指令碼,並在指令碼中新增下面**:

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

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

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

圖3-3  指令碼中的變數名

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

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

1.選擇有意義的名稱

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

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

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

2.小寫字母開頭

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

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

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

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

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

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

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

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

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

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

圖3-7  省略了修飾的變數

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

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

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

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

圖3-9  資料型別的分類

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

表3.1  簡單值型別

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

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

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

C 開發Unity遊戲教程之Unity中方法的引數

出現在指令碼中的方法,無論是在定義的時候,還是使用的時候,後面都跟著一對括號 有意義嗎?看起來最多也就是起個快速識別方法的作用吧。既然c 的語法規定方法就應該這麼寫,肯定是有一定道理的。如果是上公升到戰略意義的道理,連作者也不是很明白,但是作者知道這對括號裡可以新增 引數 要說明引數的作用,就必須從...

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

本章前面說了那麼多關於變數的知識,那麼在指令碼中要如何編寫關於變數的 有規章可循嗎?答案是有的。本節會依次講解變數的宣告 初始化 賦值和運算。要想在指令碼中使用變數,就必須先宣告 declare 這就意味著,需要先告訴unity,有這樣乙個變數存在,然後才可以在unity中使用這個變數。那麼,該如何...

C 開發Unity遊戲教程之判斷語句

玩家在遊戲時,無時無刻不在通過判斷做出選擇。例如,正是因為玩家做出的選擇不同,才導致遊戲朝著不同的劇情發展,因此乙個玩家可以對乙個遊戲百玩不厭!既然提到了這一點,藉此機會本章就來說明,在指令碼中實現遊戲為玩家提供更多選擇的方法。圖5 1 仙劍奇俠傳 遊戲的劇情與攻擊方式的選擇 玩家在玩遊戲的過程中,...