C#開發Unity遊戲教程之Unity中方法的引數
C#開發Unity遊戲教程之Unity中方法的引數
Unity的方法的引數
出現在指令碼中的方法,無論是在定義的時候,還是使用的時候,後面都跟著一對括號“( )”,有意義嗎?看起來最多也就是起個快速識別方法的作用吧。既然C#的語法規定方法就應該這麼寫,肯定是有一定道理的。如果是上升到戰略意義的道理,連作者也不是很明白,但是作者知道這對括號裡可以新增“引數”。
Unity中引數的作用
要說明引數的作用,就必須從方法說起。方法可以處理變數中的資料,進而影響遊戲物件的行為邏輯,這是本章前面一直在強調的。但是就前面指令碼中一直在使用的,方法的括號裡沒有引數的情況而言,方法總是在處理特定變數裡的資料。例如,下面是前面一個示例中定義的方法:
-
int AddTwoNumber()
-
{
-
return number1 + number2;
-
}
這個方法的括號裡沒有引數,它處理的資料總是變數number1和number2裡的資料。既然這只是一個用於求和的方法,沒有必要指定它只計算變數number1和number2裡的資料和。如果有其它變數的資料也要求和的話,就只能再定義一個方法了。為方法引入引數就可以很好的解決這類的問題。
Unity中的方法對於遊戲的實際意義
開發者定義了一個方法,可以控制一個遊戲物件的邏輯行為。如果其它物件也需要做出與之類似的行為,就沒有必要再定義一個方法了。例如下面的遊戲示例所做的那樣。
(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(),它是一個需要傳入引數的方法。正是因為需要傳入引數,所以它才能被用於遊戲場景中,所有遊戲物件滾動的行為邏輯控制中。而不只是單獨的控制一個物件的行為邏輯。
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個變數: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編寫的方法,不會使用的時候,讀者一定要記得去幫助文件裡查閱,查閱的步驟本章前面的部分已經說明了。
本節遊戲示例編寫的指令碼中,完全使用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人!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1727264/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#開發Unity遊戲教程之遊戲物件的屬性變數C#Unity遊戲物件變數
- C#開發Unity遊戲教程之使用指令碼變數C#Unity遊戲指令碼變數
- C#開發Unity遊戲教程之遊戲物件的行為邏輯方法C#Unity遊戲物件
- C#開發Unity遊戲教程之判斷語句C#Unity遊戲
- C#開發Unity遊戲教程之Scene檢視與指令碼的使用C#Unity遊戲指令碼
- C#開發Unity遊戲教程迴圈遍歷做出判斷及Unity遊戲示例C#Unity遊戲
- 【Unity3D開發小遊戲】《戰棋小遊戲》Unity開發教程Unity3D遊戲
- 喵的Unity遊戲開發之路 - 推球:遊戲中的物理Unity遊戲開發
- 【Unity 3D遊戲開發】在Unity使用NoSQL資料庫方法介紹Unity3D遊戲開發SQL資料庫
- Unity遊戲示例來了,用Unity開源遊戲資源做遊戲,遊戲開發不再難!Unity遊戲開發
- C#遊戲開發快速入門教程Unity5.5教程C#遊戲開發Unity
- 讀《Unity 3D遊戲開發》Unity3D遊戲開發
- unity3d開發的大型網路遊戲Unity3D遊戲
- 【Unity 框架】 QFramework v1.0 使用指南 工具篇: 16. LiveCodingKit 寫程式碼不用停止執行的利器 | Unity 遊戲框架 | Unity 遊戲開發 | Unity 獨立遊戲Unity框架Framework遊戲開發
- 【小松教你手遊開發】【unity實用技能】unity 記憶體除錯方法Unity記憶體除錯
- Unity製作遊戲中的場景Unity遊戲
- Unity 3D學習之《Unity 3D 手機遊戲開發》1Unity3D遊戲開發
- unity遊戲開發雜項系列:unity在商店裡下載的package儲存位置Unity遊戲開發Package
- 關於 Unity 遊戲的效能引數的標準是怎麼制定的?Unity遊戲
- 《Unity移動遊戲開發》讀後感Unity遊戲開發
- Unity3D C#指令碼開發學習Unity3DC#指令碼
- 17款Unity開發遊戲可以用到的外掛Unity開發遊戲
- 【UNITY3D 遊戲開發之七】C# 中的委託、事件、匿名函式、Lambda 表示式Unity3D遊戲開發C#事件函式
- unity 區域網遊戲開發知識點Unity遊戲開發
- Unity3d遊戲開發注意事項Unity3D遊戲開發
- Unity 消消樂開發思路Unity
- 喵的Unity遊戲開發之路 - 軌道攝像機Unity遊戲開發
- C# Unity依賴注入C#Unity依賴注入
- [Unity-24] Unity的四種載入場景的方法Unity
- 【Unity遊戲開發】SpriteAtlas與AssetBundle最佳食用方案Unity遊戲開發
- Unity網路多玩家遊戲開發教程(上冊)Unity遊戲開發
- Unity遊戲開發技巧集錦2.1.3實現效果Unity遊戲開發
- [Unity3d]unity中http通訊Unity3DHTTP
- Unity Sunny Land開發流程(二)Unity
- Unity開發 資源準備Unity
- GUI與GUILayout的區別——《Unity 3D遊戲開發》GUIUnity3D遊戲開發
- 用Flash、HTML5和Unity開發網頁遊戲的現實HTMLUnity網頁遊戲
- 常用的Unity輸入方法Unity