本章前面說了那麼多關於變量的知識,那麼在腳本中要如何編寫關於變量的代碼,有規章可循嗎?答案是有的。本節會依次講解變量的聲明、初始化、賦值和運算。學習
要想在腳本中使用變量,就必須先聲明(declare)。這就意味着,須要先告訴Unity,有這樣一個變量存在,而後才能夠在Unity中使用這個變量。那麼,該如何將這個變量存在的事實告知Unity呢?答案就是聲明。實際上,讀者已經在本章見過屢次變量的聲明瞭,沒錯就是圖3-11所示的樣子。spa
圖3-11 腳本中聲明變量的代碼orm
對於變量的聲明,必須知足下面的3個條件:對象
q 必須指定變量能夠存儲的數據的類型;教程
q 必須指定一個變量名;遊戲
q 必須以一個分號「;」結束;ip
聲明變量的形式以下:作用域
數據類型 變量名;遊戲開發
例如:開發
int number1;
這樣的聲明方式符合要求,由於:
q 語句指定了變量能夠存儲的數據類型是int,也就是說能夠存儲整數;
q 語句指定了變量名,即number1;
q 語句最後以分號「;」結尾;
對於這樣一個聲明語句,Unity會按照下面的方式去理解:
q 聲明語句沒有明確的說明是public,仍是private,所以就看成private處理;
q 此變量將不會出如今腳本的屬性中,並且也沒法被其它腳本訪問;
q 變量名number1,默認指代的數據是0;
在聲明變量的同時,爲變量指定值,在C#中就被稱爲變量的初始化。被初始化的值,一樣會顯示在遊戲對象屬性的輸入框中,如圖3-12所示。
圖3-12 屬性輸入框中是變量被初始化的值
在腳本中使用變量時,一般會對變量作些運算,或者說是對變量中的數據作某些算術處理,而處理的結果有時會進入新的運算中,有時則會做爲遊戲的結果而輸出。只要是對變量中的數據作處理,就須要用到運算符。C#中的運算符大致能夠分爲4類:算術運算符、自增自減運算符、複合運算符和位運算符,如表3.2所示。
表3.2 運算符
目前爲止,示例腳本中聲明的變量,也被稱爲「成員變量」(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視圖裏,輸出了變量的運算結果
變量的做用域(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~20、08~19和13~18。而變量的做用域,將從它被聲明的位置開始,一直到它所處的做用域的末尾處。
q 腳本中一共聲明瞭3個string類型的變量,分別位於腳本的06、10和16行。
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 在做用域外使用變量,所致使的錯誤的信息提示
學習過英語的人,都該知道「語句」。由於書寫英語文章的時候,咱們一般使用點「.」做爲英語語句的結束標誌。同理,當你書寫一行代碼的時候,能夠將分號「;」置於代碼的末尾處,這用於表示這是一條代碼語句。
一行代碼就是一條語句嗎?答案是否認的。C#語法規定,語句是以分號「;」爲結束標誌的。例如:
public int number1 = 2;
這行代碼的做用是聲明一個名爲number1的變量,存儲的數據是2。這是一行代碼,它以分號「;」結尾,所以它也是一條語句!再看下面的代碼:
public
int
number1
=
2;
雖然代碼被分紅了5行書寫,可是由於只出現了一個分號,因此這也是一條語句。讀者可使用這條語句,替換上面的那條語句,運行效果是沒有絲毫區別的。
提示:儘管在語法上是正確的,可是不推薦讀者使用這種方法。由於寫成這樣的代碼會佔用更多的視覺空間。也就是說,一次能夠看到的語句數量減小了,最終使得腳本代碼變得極難閱讀。推薦讀者將一個語句寫到一行,語句太長的話,再考慮分紅兩行來寫。
本章學習了那麼多關於變量的知識,那麼到底在遊戲中有什麼實際意義嗎?讀者能夠先從變量着手,進而發覺它對於遊戲的意義。變量的做用是存儲數據,而這個數據在腳本代碼中會被用於作其它處理,進而影響到遊戲場景中游戲對象的行爲。若是這個腳本被賦予了某一個具體的遊戲對象,那麼就能夠經過設置腳本組件下的屬性值,進而改變腳本代碼中操做的數據,這一樣會影響到遊戲對象的行爲。這麼說果真仍是太抽象了,下面將以一個示例說明。
(1)爲遊戲項目裏的遊戲場景添加2個遊戲對象:Cube和Directional,前者是腳本打算操做的遊戲對象,後者是負責遊戲場景照明的遊戲對象。調整遊戲場景中3個遊戲對象的位置,使得Game視圖達到最佳的效果,如圖3-16所示。
提示:3個遊戲對象?難道不是2個嗎?但願讀者沒有忘記Unity爲遊戲場景自動添加的Main Camera,此對象決定了Game視圖的成像效果。
圖3-16 Unity裏的Scene和Game視圖
(2)在Project視圖裏,新建一個腳本,命名爲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 Speed、Rota Speed和Scale吧,手動修改它們的屬性值,而後再單擊按鈕試試,怎樣效果不同了吧,如圖3-20所示,以屬性Scale的修改成例。
圖3-20 經過修改屬性Scale的值,進而改變立方體的縮放倍數
本章站在腳本變量的角度上,全方位的向讀者介紹了組件的屬性。內容包括:屬性名(變量名)的本質就是一個指代,它並不是真正的數據;並不是全部的變量在組件的屬性都是可見的;即時一樣是屬性,也存在不一樣的類型;腳本中變量的編寫規則。最後,本章以一個簡單的遊戲收尾,用以凸顯變量,或者說屬性之於遊戲的重要做用。
本文選自:C#遊戲開發快速入門大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!