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

大學霸發表於2015-07-09

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

Unity的方法的引數

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

Unity中引數的作用

要說明引數的作用,就必須從方法說起。方法可以處理變數中的資料,進而影響遊戲物件的行為邏輯,這是本章前面一直在強調的。但是就前面指令碼中一直在使用的,方法的括號裡沒有引數的情況而言,方法總是在處理特定變數裡的資料。例如,下面是前面一個示例中定義的方法:

  • int AddTwoNumber()        

  • {

  •          return number1 + number2;

  • }

這個方法的括號裡沒有引數,它處理的資料總是變數number1number2裡的資料。既然這只是一個用於求和的方法,沒有必要指定它只計算變數number1number2裡的資料和。如果有其它變數的資料也要求和的話,就只能再定義一個方法了。為方法引入引數就可以很好的解決這類的問題。

Unity中的方法對於遊戲的實際意義

開發者定義了一個方法,可以控制一個遊戲物件的邏輯行為。如果其它物件也需要做出與之類似的行為,就沒有必要再定義一個方法了。例如下面的遊戲示例所做的那樣。

1為遊戲場景新增CubeCylinderDirectional light,這3個遊戲物件。前兩者將作為指令碼方法控制行為邏輯的遊戲物件,最後一個遊戲物件負責遊戲場景的照明。合理設定它們各自的位置,得到的SceneGame檢視,如圖4-8所示。


4-8  SceneGame檢視裡,檢視各物件的相對位置,以及遊戲檢視的效果

2Project檢視裡,新建指令碼檔案,命名為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  指令碼程式碼的1215行,呼叫了兩次方法RotateObject(),先後傳入的引數也是不一樣的;

3將指令碼MyScript賦予Main Camera物件,並在後者的Inspector檢視裡,設定My Script元件裡的My CubeMy Cylinder屬性為遊戲場景中的CubeCylinder物件,屬性的設定方法是,直接拖動Hierarchy檢視裡的CubeCylinder物件到對應的屬性框中即可,如圖4-9所示。


4-9  設定My Script元件下的屬性

4執行遊戲,在Game檢視裡,一直按下滑鼠左鍵,讀者會看到立方體物件在原地滾動。如果一直按下滑鼠右鍵,那麼原地滾動的就成了圓柱體。如果同時按住滑鼠左鍵和右鍵,立方體和圓柱體就會同時滾動了,如圖4-10所示。


4-10  遊戲效果展示圖

5遊戲中,控制遊戲物件滾動的方法是RotateObject(),它是一個需要傳入引數的方法。正是因為需要傳入引數,所以它才能被用於遊戲場景中,所有遊戲物件滾動的行為邏輯控制中。而不只是單獨的控制一個物件的行為邏輯。

Unity中減少程式碼的重複書寫

指令碼中的方法,對於遊戲物件而言,意義在於它可以控制遊戲物件的行為邏輯,這是方法對於遊戲效果的意義。方法對於指令碼程式碼的書寫,同樣具有意義,那就是它可以幫助減少程式碼的重複書寫。

本章在介紹方法時,曾將方法與變數做了簡單比較,對比的過程中說過,方法也可以看做是一個儲存單元,只不過裡面儲存的不是資料,而是一條或者多條語句。就這個意義而言,可以認為如果在方法中放入多條會在指令碼中被重複使用的語句,並使用方法名作為這些語句的指代。那麼,指令碼中所有需要書寫這多行程式碼的地方,都可以使用方法名(即方法的呼叫)來代替。例如,指令碼中有下面的程式碼:

  • 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個變數:number1number2number3。為了計算number1number2的平方和,程式碼中使用了12~18行,一共7行的程式碼。同樣的,為了計算number1number3的平方和,程式碼中使用了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編寫的方法,不會使用的時候,讀者一定要記得去幫助文件裡查閱,查閱的步驟本章前面的部分已經說明了。

本節遊戲示例編寫的指令碼中,完全使用Unity編寫的方法,實現玩家透過鍵盤控制遊戲物件上下左右移動的效果,具體的遊戲製作過程如下:

1為遊戲場景新增兩個遊戲物件:SphereDirectional light。前者就是本遊戲要控制的遊戲物件,後者負責遊戲檢視的光照效果。調節遊戲檢視中各物件的位置,使得Sphere物件位於Game檢視的中央,如圖4-12所示。


4-12  SceneGame檢視裡,檢視各遊戲物件的相對位置,以及遊戲檢視的顯示效果

2為遊戲專案匯入4個圖片,它們將被用於在遊戲檢視裡表示小球的運動方向,本遊戲匯入的4個圖片如圖4-13所示。


4-13  為遊戲專案匯入的4個表示方向的圖片

提示:為遊戲專案匯入圖片的方法是:直接拖動。即將圖片直接拖動到UnityProject檢視裡即可。

3Project檢視裡,新建一個指令碼,並命名為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 Upup

  • q  Tex Downdown

  • q  Tex Leftleft

  • q  Tex Rightright

  • q  My SphereSphere

  • q  Sphere Speed0.1


4-14  設定元件下各屬性

4)指令碼中使用的Unity方法,這裡會做簡要說明,如果讀者對各方向的詳細使用說明感興趣,可以自己查閱幫助文件。

  • q  1417行使用了Input.GetAxis ()方法,用於檢測玩家是否按下了鍵盤上的左,或者右方向鍵;為方法傳入的引數是HorizontalVertical,它們是Unity預設定義的輸入按鍵,讀者可以在Unity裡單擊Edit|project Settings|Input命令,然後在彈出的InputManager對話方塊中看到它們,如圖4-15所示。


4-15  InputManager對話方塊

  • q  1518行使用了遊戲物件的transform.Translate ()方法,用於修改球體物件Transform元件下的Position屬性,所以遊戲場景中球體物件的位置就發生了改變;

  • q  20行的OnGUI()方法,用於在遊戲檢視上繪製各種圖形,或者控制元件,這些圖形和控制元件並不存在於遊戲場景中。如果非要說出位置的話,作者覺得說它們存在於螢幕上更合適些;

  • q  2233行的方法GUILayout.BeginHorizontal ()GUILayout.EndHorizontal ()會迫使圖形和控制元件,在水平方向上,一個挨著一個的繪製;

  • q  25273032行使用了GUILayout.Label ()方法,作用是在螢幕上繪製標籤(Label)控制元件;

5執行遊戲,小球處於檢視的中央,按下鍵盤上的方向鍵,小球就會朝著指定的方向移動,並且遊戲檢視的左上角還使用圖片顯示著小球的移動方向,並且圖片的顯示與否,與玩家是否按下了方向鍵有關。如果玩家都沒有按下方向鍵,那麼就不會有方向圖片顯示,遊戲的執行效果如圖4-16所示。


4-16  處於靜止狀態和運動狀態的小球,以及顯示在遊戲檢視左上角的方向圖片

小結

方法,從外在形式上來看,就是由多條語句組成的。考慮到讀者對方法的理解,本章將它與變數做了對比,因為它們確實有不少相似的地方。方法對於遊戲的真正意義在於,方法會將屬性裡的資料做特定的處理,並將處理的結果應用到遊戲物件上。但是它也有其它用途,例如減少程式碼的重複書寫。在學會了方法的編寫以後,又帶讀者認識了Unity自定義的方法,以及需要傳入引數的方法。最後,本章同樣以一個遊戲示例收尾。因為示例中使用了不少Unity自定義的方法,讀者看來不得不去查閱下幫助文件才行,至於查閱的步驟,本章也介紹了。

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


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

相關文章