本章前面說了那麼多關於變數的知識,那麼在指令碼中要如何編寫關於變數的**,有規章可循嗎?答案是有的。本節會依次講解變數的宣告、初始化、賦值和運算。
要想在指令碼中使用變數,就必須先宣告(declare)。這就意味著,需要先告訴unity,有這樣乙個變數存在,然後才可以在unity中使用這個變數。那麼,該如何將這個變數存在的事實告知unity呢?答案就是宣告。實際上,讀者已經在本章見過多次變數的宣告了,沒錯就是圖3-11所示的樣子。
圖3-11 指令碼中宣告變數的**
對於變數的宣告,必須滿足下面的3個條件:
宣告變數的形式如下:
例如:這樣的宣告方式符合要求,因為:
對於這樣乙個宣告語句,unity會按照下面的方式去理解:
在宣告變數的同時,為變數指定值,在c#中就被稱為變數的初始化。被初始化的值,同樣會顯示在遊戲物件屬性的輸入框中,如圖3-12所示。
圖3-12 屬性輸入框中是變數被初始化的值
在指令碼中使用變數時,通常會對變數做些運算,或者說是對變數中的資料做某些算術處理,而處理的結果有時會進入新的運算中,有時則會作為遊戲的結果而輸出。只要是對變數中的資料做處理,就需要用到運算子。c#中的運算子大體可以分為4類:算術運算子、自增自減運算子、復合運算子和位運算子,如表3.2所示。
表3.2 運算子
目前為止,示例指令碼中宣告的變數,也被稱為「成員變數」(member variables)。因為它們被宣告在類myscript大括號的裡面,方法大括號的外面。提及「成員變數」這個概念是因為,只有成員變數才可以作為元件的屬性顯示在元件下。
因人而異,讀者可以選擇自己喜歡的方式。以上兩個指令碼中實現的功能是一樣的,即宣告變數、初始化變數,最後將變數的運算結果輸出到console檢視裡,如圖3-13所示。
圖3-13 console檢視裡,輸出了變數的運算結果
變數的作用域(scope),可以被理解成「變數在指令碼中的存在範圍」。例如,對於下面的指令碼:
指令碼中一共有3個作用域,分別以3個大括號為邊界,即3個作用域的範圍是:05~20、08~19和13~18。而變數的作用域,將從它被宣告的位置開始,一直到它所處的作用域的末尾處。
在unity中,執行遊戲,然後在console檢視裡檢視輸出結果,如圖3-14所示。
圖3-14 console檢視的輸出結果
如果指令碼中,不小心在變數的作用域外使用了變數的話,console檢視會提示錯誤,錯誤資訊大致是告訴你「變數在宣告前不能使用」,即變數是不存在的。例如,在指令碼09行插入下面的**,console檢視提示的錯誤資訊,如圖3-15所示。
圖3-15 在作用域外使用變數,所導致的錯誤的資訊提示
學習過英語的人,都該知道「語句」。因為書寫英語文章的時候,我們通常使用點「.」作為英語語句的結束標誌。同理,當你書寫一行**的時候,可以將分號「;」置於**的末尾處,這用於表示這是一條**語句。
一行**就是一條語句嗎?答案是否定的。c#語法規定,語句是以分號「;」為結束標誌的。例如:
這行**的作用是宣告乙個名為number1的變數,儲存的資料是2。這是一行**,它以分號「;」結尾,因此它也是一條語句!再看下面的**:
雖然**被分成了5行書寫,但是因為只出現了乙個分號,所以這也是一條語句。讀者可以使用這條語句,替換上面的那條語句,執行效果是沒有絲毫區別的。
本章學習了那麼多關於變數的知識,那麼到底在遊戲中有什麼實際意義嗎?讀者可以先從變數著手,進而發覺它對於遊戲的意義。變數的作用是儲存資料,而這個資料在指令碼**中會被用於做其它處理,進而影響到遊戲場景中遊戲物件的行為。如果這個指令碼被賦予了某乙個具體的遊戲物件,那麼就可以通過設定指令碼元件下的屬性值,進而改變指令碼**中操作的資料,這同樣會影響到遊戲物件的行為。這麼說果然還是太抽象了,下面將以乙個示例說明。
(1)為遊戲專案裡的遊戲場景新增2個遊戲物件:cube和directional,前者是指令碼打算操作的遊戲物件,後者是負責遊戲場景照明的遊戲物件。調整遊戲場景中3個遊戲物件的位置,使得game檢視達到最佳的效果,如圖3-16所示。
圖3-16 unity裡的scene和game檢視
(2)在project檢視裡,新建乙個指令碼,命名為myscript,開啟此指令碼並新增下面的**:
指令碼的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賦值
指令碼元件下的屬性名與指令碼中宣告的變數名基本一致,且屬性框中已經有值了,這個值是在變數初始化時指定的。
(4)執行遊戲,在game檢視的左上角會出現3個按鈕:移動立方體、旋轉立方體和縮放立方體。單擊按鈕,即可完成對立方體物件的指定操作,如圖3-19所示。
圖3-19 通過單擊遊戲檢視上的按鈕,操縱遊戲中的立方體
(5)讀者可能要問了,變數對於遊戲的意義還沒有體現出來了,別急,現在就體現變數的作用。讀者如果要在unity中尋找變數的話,可能就要失望了,因為變數早就轉變成屬性了。因此對屬性的操作,就是對變數的操作。
讀者多「玩」會兒這個遊戲就會發現,立方體的移動速度、旋轉速度,甚至是縮放倍數是固定的!如果讀者想要改變它們的話應該怎麼辦?讀者想的沒錯,這個時候屬性就派上用場了,還記得那3個屬性trans speed、rota speed和scale吧,手動修改它們的屬性值,然後再單擊按鈕試試,怎樣效果不一樣了吧,如圖3-20所示,以屬性scale的修改為例。
圖3-20 通過修改屬性scale的值,進而改變立方體的縮放倍數
本章站在指令碼變數的角度上,全方位的向讀者介紹了元件的屬性。內容包括:屬性名(變數名)的本質就是乙個指代,它並非真正的資料;並非所有的變數在元件的屬性都是可見的;即時同樣是屬性,也存在不同的型別;指令碼中變數的編寫規則。最後,本章以乙個簡單的遊戲收尾,用以凸顯變數,或者說屬性之於遊戲的重要作用。
C 開發Unity遊戲教程之Unity中方法的引數
出現在指令碼中的方法,無論是在定義的時候,還是使用的時候,後面都跟著一對括號 有意義嗎?看起來最多也就是起個快速識別方法的作用吧。既然c 的語法規定方法就應該這麼寫,肯定是有一定道理的。如果是上公升到戰略意義的道理,連作者也不是很明白,但是作者知道這對括號裡可以新增 引數 要說明引數的作用,就必須從...
C 開發Unity遊戲教程之遊戲物件的屬性變數
通過對上一章的學習,讀者應該了解到了,遊戲物件上的屬性與指令碼中的變數,建立聯絡的方式就是將指令碼賦予遊戲物件。上一章只是簡單的介紹了指令碼中的變數,讀者一定不過癮,現在好了,作者將使用一整章的篇幅介紹變數與屬性。在unity中,遊戲場景中遊戲物件的屬性,可以在inspector檢視裡檢視,想看哪個...
C 開發Unity遊戲教程之判斷語句
玩家在遊戲時,無時無刻不在通過判斷做出選擇。例如,正是因為玩家做出的選擇不同,才導致遊戲朝著不同的劇情發展,因此乙個玩家可以對乙個遊戲百玩不厭!既然提到了這一點,藉此機會本章就來說明,在指令碼中實現遊戲為玩家提供更多選擇的方法。圖5 1 仙劍奇俠傳 遊戲的劇情與攻擊方式的選擇 玩家在玩遊戲的過程中,...