出如今腳本中的方法,不管是在定義的時候,仍是使用的時候,後面都跟着一對括號「( )」,有意義嗎?看起來最多也就是起個快速識別方法的做用吧。既然C#的語法規定方法就應該這麼寫,確定是有必定道理的。若是是上升到戰略意義的道理,連做者也不是很明白,可是做者知道這對括號裏能夠添加「參數」。spa
要說明參數的做用,就必須從方法提及。方法能夠處理變量中的數據,進而影響遊戲對象的行爲邏輯,這是本章前面一直在強調的。可是就前面腳本中一直在使用的,方法的括號裏沒有參數的狀況而言,方法老是在處理特定變量裏的數據。例如,下面是前面一個示例中定義的方法:orm
int AddTwoNumber() 對象
{教程
return number1 + number2;遊戲
}圖片
這個方法的括號裏沒有參數,它處理的數據老是變量number1和number2裏的數據。既然這只是一個用於求和的方法,沒有必要指定它只計算變量number1和number2裏的數據和。若是有其它變量的數據也要求和的話,就只能再定義一個方法了。爲方法引入參數就能夠很好的解決這類的問題。ip
開發者定義了一個方法,能夠控制一個遊戲對象的邏輯行爲。若是其它對象也須要作出與之相似的行爲,就沒有必要再定義一個方法了。例以下面的遊戲示例所作的那樣。遊戲開發
(1)爲遊戲場景添加Cube、Cylinder和Directional light,這3個遊戲對象。前二者將做爲腳本方法控制行爲邏輯的遊戲對象,最後一個遊戲對象負責遊戲場景的照明。合理設置它們各自的位置,獲得的Scene和Game視圖,如圖4-8所示。開發
圖4-8 在Scene和Game視圖裏,查看各對象的相對位置,以及遊戲視圖的效果文檔
(2)在Project視圖裏,新建腳本文件,命名爲MyScript,打開此腳本並添加下面的代碼:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 public GameObject myCube;
07 public GameObject myCylinder;
08 void OnGUI()
09 {
10 //當鼠標左鍵按下的時候
11 if(Input.GetMouseButton(0))
12 RotateObject (myCube);
13 //當鼠標右鍵按下的時候
14 if(Input.GetMouseButton(1))
15 RotateObject (myCylinder);
16 }
17 //改變遊戲對象朝向的方法
18 void RotateObject(GameObject myObject)
19 {
20 myObject.transform.Rotate(Vector3.right*100,Space.World);
21 }
22 }
q 腳本代碼的18~21行,是有參數方法的定義部分。從代碼來看,傳入的參數是一個遊戲對象,而方法中的語句,就是經過修改遊戲對象Transform組件下的Rotation屬性,實現改變遊戲對象朝向的目地的;
q 腳本代碼的12、15行,調用了兩次方法RotateObject(),前後傳入的參數也是不同的;
(3)將腳本MyScript賦予Main Camera對象,並在後者的Inspector視圖裏,設置My Script組件裏的My Cube和My Cylinder屬性爲遊戲場景中的Cube和Cylinder對象,屬性的設置方法是,直接拖動Hierarchy視圖裏的Cube和Cylinder對象到對應的屬性框中便可,如圖4-9所示。
圖4-9 設置My Script組件下的屬性
(4)運行遊戲,在Game視圖裏,一直按下鼠標左鍵,讀者會看到立方體對象在原地滾動。若是一直按下鼠標右鍵,那麼原地滾動的就成了圓柱體。若是同時按住鼠標左鍵和右鍵,立方體和圓柱體就會同時滾動了,如圖4-10所示。
圖4-10 遊戲效果展現圖
(5)遊戲中,控制遊戲對象滾動的方法是RotateObject(),它是一個須要傳入參數的方法。正是由於須要傳入參數,因此它才能被用於遊戲場景中,全部遊戲對象滾動的行爲邏輯控制中。而不僅是單獨的控制一個對象的行爲邏輯。
腳本中的方法,對於遊戲對象而言,意義在於它能夠控制遊戲對象的行爲邏輯,這是方法對於遊戲效果的意義。方法對於腳本代碼的書寫,一樣具備意義,那就是它能夠幫助減小代碼的重複書寫。
本章在介紹方法時,曾將方法與變量作了簡單比較,對比的過程當中說過,方法也能夠看作是一個存儲單元,只不過裏面存儲的不是數據,而是一條或者多條語句。就這個意義而言,能夠認爲若是在方法中放入多條會在腳本中被重複使用的語句,並使用方法名做爲這些語句的指代。那麼,腳本中全部須要書寫這多行代碼的地方,均可以使用方法名(即方法的調用)來代替。例如,腳本中有下面的代碼:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 private int number1;
07 private int number2;
08 private int number3;
09 private int number;
10 void Start()
11 {
12 number1 = 3;
13 number2 = 5;
14 number3 = 4;
15 number1 *= number1;
16 number2 *= number2;
17 number = number1 + number2;
18 Debug.Log("number1*number1 + number2*number2 = " + number);
19
20 number1 = 3;
21 number2 = 5;
22 number3 = 4;
23 number1 *= number1;
24 number3 *= number3;
25 number = number1 + number3;
26 Debug.Log("number1*number1 + number3*number3 = " + number);
27 }
28 }
腳本中有3個變量:number1、number2和number3。爲了計算number1與number2的平方和,代碼中使用了12~18行,一共7行的代碼。一樣的,爲了計算number1與number3的平方和,代碼中使用了20~26行,一共7行的代碼。若是在腳本中定義方法的話,就不用書寫這麼多相似的代碼了,使用定義了方法的腳本之後,腳本中的代碼以下:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 private int number1;
07 private int number2;
08 private int number3;
09 private int number;
10 void Start()
11 {
12 number1 = 3;
13 number2 = 5;
14 number3 = 4;
15 Debug.Log("number1*number1 + number2*number2 = " + AddTwoNumber(number1,number2));
16 Debug.Log("number1*number1 + number3*number3 = " + AddTwoNumber(number1,number3));
17 }
18 int AddTwoNumber(int i1,int i2)
19 {
20 i1 *= i1;
21 i2 *= i2;
22 return i1 + i2;
23 }
24 }
相比於以前使用的14行代碼,這裏只使用了5行代碼!可是兩個腳本實現的效果是同樣的,如圖4-11所示。
圖4-11 Console視圖輸出了兩個數平方和的計算結果
在Unity中編寫腳本,讀者能夠本身編寫方法,也可使用Unity編寫的方法。通常狀況下,腳本代碼中會用到不少Unity編寫的方法。而本身編寫方法,一般是爲了減小代碼的重複書寫,或者將Unity的方法組織起來,實現新的功能。對於Unity編寫的方法,不會使用的時候,讀者必定要記得去幫助文檔裏查閱,查閱的步驟本章前面的部分已經說明了。
本節遊戲示例編寫的腳本中,徹底使用Unity編寫的方法,實現玩家經過鍵盤控制遊戲對象上下左右移動的效果,具體的遊戲製做過程以下:
(1)爲遊戲場景添加兩個遊戲對象:Sphere和Directional light。前者就是本遊戲要控制的遊戲對象,後者負責遊戲視圖的光照效果。調節遊戲視圖中各對象的位置,使得Sphere對象位於Game視圖的中央,如圖4-12所示。
圖4-12 在Scene和Game視圖裏,查看各遊戲對象的相對位置,以及遊戲視圖的顯示效果
(2)爲遊戲項目導入4個圖片,它們將被用於在遊戲視圖裏表示小球的運動方向,本遊戲導入的4個圖片如圖4-13所示。
圖4-13 爲遊戲項目導入的4個表示方向的圖片
提示:爲遊戲項目導入圖片的方法是:直接拖動。即將圖片直接拖動到Unity的Project視圖裏便可。
(3)在Project視圖裏,新建一個腳本,並命名爲MyScript,打開此腳本,並添加下面的代碼:
01 using UnityEngine;
02 using System.Collections;
03
04 public class MyScript : MonoBehaviour
05 {
06 public Texture texUp,texDown,texLeft,texRight;
07 public GameObject mySphere;
08 public float sphereSpeed = 0.1f; //決定小球的移動速度
09 private float horizontalNum,VerticalNum;
10
11 void Update()
12 {
13 //檢測是否按下了水平方向上的方向鍵
14 horizontalNum = Input.GetAxis ("Horizontal");
15 mySphere.transform.Translate (horizontalNum*Vector3.right*sphereSpeed);
16 //檢測是否按下了垂直方向上的方向鍵
17 VerticalNum = Input.GetAxis ("Vertical");
18 mySphere.transform.Translate (VerticalNum*Vector3.up*sphereSpeed);
19 }
20 void OnGUI()
21 {
22 GUILayout.BeginHorizontal ();
23 //繪製左箭頭,或者右箭頭
24 if(horizontalNum > 0)
25 GUILayout.Label (texRight,GUILayout.Width(100),GUILayout.Height (100));
26 else if(horizontalNum < 0)
27 GUILayout.Label (texLeft,GUILayout.Width(100),GUILayout.Height (100));
28 //繪製上箭頭,或者下箭頭
29 if(VerticalNum > 0)
30 GUILayout.Label (texUp,GUILayout.Width(100),GUILayout.Height (100));
31 else if(VerticalNum < 0)
32 GUILayout.Label (texDown,GUILayout.Width(100),GUILayout.Height (100));
33 GUILayout.EndHorizontal ();
34 }
35 }
將此腳本賦予Main Camera對象,並在後者的Inspector視圖裏設置My Script組件下的屬性,如圖4-14所示。
q Tex Up:up;
q Tex Down:down;
q Tex Left:left;
q Tex Right:right;
q My Sphere:Sphere;
q Sphere Speed:0.1;
圖4-14 設置組件下各屬性
(4)腳本中使用的Unity方法,這裏會作簡要說明,若是讀者對各方向的詳細使用說明感興趣,能夠本身查閱幫助文檔。
q 14、17行使用了Input.GetAxis ()方法,用於檢測玩家是否按下了鍵盤上的左,或者右方向鍵;爲方法傳入的參數是Horizontal和Vertical,它們是Unity默認定義的輸入按鍵,讀者能夠在Unity裏單擊Edit|project Settings|Input命令,而後在彈出的InputManager對話框中看到它們,如圖4-15所示。
圖4-15 InputManager對話框
q 15、18行使用了遊戲對象的transform.Translate ()方法,用於修改球體對象Transform組件下的Position屬性,因此遊戲場景中球體對象的位置就發生了改變;
q 20行的OnGUI()方法,用於在遊戲視圖上繪製各類圖形,或者控件,這些圖形和控件並不存在於遊戲場景中。若是非要說出位置的話,做者以爲說它們存在於屏幕上更合適些;
q 22、33行的方法GUILayout.BeginHorizontal ()和GUILayout.EndHorizontal ()會迫使圖形和控件,在水平方向上,一個挨着一個的繪製;
q 25、27、30和32行使用了GUILayout.Label ()方法,做用是在屏幕上繪製標籤(Label)控件;
(5)運行遊戲,小球處於視圖的中央,按下鍵盤上的方向鍵,小球就會朝着指定的方向移動,而且遊戲視圖的左上角還使用圖片顯示着小球的移動方向,而且圖片的顯示與否,與玩家是否按下了方向鍵有關。若是玩家都沒有按下方向鍵,那麼就不會有方向圖片顯示,遊戲的運行效果如圖4-16所示。
圖4-16 處於靜止狀態和運動狀態的小球,以及顯示在遊戲視圖左上角的方向圖片
方法,從外在形式上來看,就是由多條語句組成的。考慮到讀者對方法的理解,本章將它與變量作了對比,由於它們確實有很多類似的地方。方法對於遊戲的真正意義在於,方法會將屬性裏的數據作特定的處理,並將處理的結果應用到遊戲對象上。可是它也有其它用途,例如減小代碼的重複書寫。在學會了方法的編寫之後,又帶讀者認識了Unity自定義的方法,以及須要傳入參數的方法。最後,本章一樣以一個遊戲示例收尾。由於示例中使用了很多Unity自定義的方法,讀者看來不得不去查閱下幫助文檔才行,至於查閱的步驟,本章也介紹了。
本文選自:C#遊戲開發快速入門大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!