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

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

Unity的方法的參數

出如今腳本中的方法,不管是在定義的時候,仍是使用的時候,後面都跟着一對括號「( )」,有意義嗎?看起來最多也就是起個快速識別方法的做用吧。既然C#的語法規定方法就應該這麼寫,確定是有必定道理的。若是是上升到戰略意義的道理,連做者也不是很明白,可是做者知道這對括號裏能夠添加「參數」。spa

Unity中參數的做用

要說明參數的做用,就必須從方法提及。方法能夠處理變量中的數據,進而影響遊戲對象的行爲邏輯,這是本章前面一直在強調的。可是就前面腳本中一直在使用的,方法的括號裏沒有參數的狀況而言,方法老是在處理特定變量裏的數據。例如,下面是前面一個示例中定義的方法:orm

  • int AddTwoNumber()        對象

  • {教程

  •          return number1 + number2;遊戲

  • }圖片

這個方法的括號裏沒有參數,它處理的數據老是變量number1number2裏的數據。既然這只是一個用於求和的方法,沒有必要指定它只計算變量number1number2裏的數據和。若是有其它變量的數據也要求和的話,就只能再定義一個方法了。爲方法引入參數就能夠很好的解決這類的問題。ip

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人!

相關文章
相關標籤/搜索