當前位置:首頁 >教程首頁 > 遊戲程序 > Unity3D遊戲開發工程師班 >分享使用Unity 3D免費版本編寫遊戲的教程(一)

分享使用Unity 3D免費版本編寫遊戲的教程(一)

發布時間:2018-11-17 19:57:24
作者:John Boardman

Unity是一個製作專業級遊戲的開發環境。它創建於MonoDevelop的基礎之上,並用它來實現將同個代碼部署到多個平台的目標。Unity有兩個版本,但本文關注的是無附加件的免費版本。

Unity免費版(我目前使用的版本)支持開發者向Mac、Windows、Linux、Web和Google Native(注:這是一個無插件的Chrome部署技術)部署內容。現在開發者還可以下載針對Android和iOS平台的免費部署版本。如果你是以團隊身份使用該工具,可以花500美元獲得更多功能和資產的使用授權。免費版本支持多人遊戲、物理、3D音頻、動畫、Direct3D 11、著色器、光照貼圖以及地形等實用功能。如果你是Xbox 360、PS 3或Will開發者,你也可以向這些平台部署內容,隻是我並不清楚這一用法的授權情況。

Unity Pro收費標準是1500美元,擁有許多高端性能,例如細節層次(LOD)、自動尋徑、高端音頻過濾器、視頻回放、流媒體、IK動畫、3D紋理、即時陰影及其他專業功能。這個Pro的Android和iOS授權費都是1500美元,可以支持那些400美元版本所不具備的功能。

介紹《KeyShot》

這是我遵循來自Walker Boys Studio的免費教程後自己創造的一款遊戲。Walker Boys Studio網站有長達70多分鍾的視頻,教授用戶如何用JavaScript編寫代碼,並逐步分解如何創造4種不同類型的遊戲。《KeyShot》是基於本教程第二款遊戲所製作的遊戲,但也擴展了許多內容。除此之外,我還將所有的JavaScript類轉變成了C#。這個項目包括麵向兩個語言的同個功能,它們在Unity中很容易切換。

KeyShot_Gameplay

《KeyShot》是極為初級版的《大蜜蜂》。其目標是盡量在30秒內不活的情況下獲得最高分。係統將保存前10項最高分,以便創造讓玩家打敗高分的動力。

執行

這裏我建議你直接上Walker Boys Studio網站下載遊戲的基礎資產。

以下是我對Walker Boys教程內容的擴展功能:

*使用多個攝像機運行背景logo

*執行JavaScript和C#,包括如何使用JavaScript中的嵌套術語以及如JavaScript中調用C#腳本

*如何使用帶有不與Unity的標準Y-up對齊軸線的3D模型

*使用PlayerPrefs呈現高分排行榜

*如何使用帶有文本域的對話搜集用戶數據

*如何在Unity中執行作弊碼

使用多個攝像機執行背景logo

好,現在讓我們看看如何展現遊戲區域之外的logo。

1.從Assets進入Import New Asset菜單,我先擇輸入PNG。這可以將資產拖入Unity令其處於可用狀態。

KeyShot_Asset_Import

KeyShot_Import_Logo

2.接下來雙擊載入Scene1:

KeyShot_Scene1

3.在Unity右上方的窗口中有一個Layers下拉單菜。選擇“Edit Layers”,可以看到一個標簽列表,之後是Builtin Layers,然後是User Layers。

4.如果點擊User Layer 8右邊,就可以設置該圖層的名稱。我為圖片選擇了“背景圖片”這個名稱。

KeyShot_Background_Image_Layer

5.在Hierarchy的下拉菜單中,使用Create菜單並選擇“GUI Texture”,將其命名為“背景圖片”。

6.將logo資產拖到GUI Texture的Texture屬性(注:以便告知我們將使用這個logo作為紋理)。

7.現在在Hierarchy中選擇“背景圖片GUI Texture”查看其屬性列表。要獲得準確的大小,使用Pixel Insert設置。我從屬性中看到這張圖片大小是512X128。為了將圖片置於中間,我將X軸設為-256,Y軸為-64,然後將寬度設為512,高度為128。

8.將背景圖片的圖層設為“背景圖片”。

KeyShot_GUI_Texture

(為準確展現圖片,我們需要創造第二個攝像機)

9.在Hierarchy視圖中點擊“Main Camera”。然後在Hierarchy中選擇“Creat”下拉菜單並選擇“Camera”。我將其命名為“背景攝像機”。在默認狀態下,我們創造自己的新攝像機時,其視口會和之前所選擇的一樣,所以不需要再進行調整。

10.現在點擊背景攝像機,設置它的Culling Mask,以便僅使用背景圖片這個圖層。

這可以點擊Culling Mask,選擇Nothing。然後選擇Background Image。此時我還設置了背景攝像機的背景顏色,以匹配Keyholel logo的背景。

11.最後,我們要讓主攝像機去忽略背景圖像這個圖層。

執行這一操作,點擊Main Camera,然後再點擊Culling Mask。然後取消選擇背景圖像這個圖層。

KeyShot_Background_Camera

KeyShot_Background_Camera

(這個過程要經曆數個步驟,但結果十分可觀,它會在遊戲中所有其他元素之後顯示水印)

執行JavaSCript和C#

包括如何在JavaScript中使用嵌套通用術語,以及如何從JavaSCript中調用C#腳本

在Walker Boys教程中,他們選擇JavaScript為所有遊戲編碼,這方法還行。但如果你也和我一樣,你可能會更喜歡用C#而非JavaSCript編碼。所以,我將所有的JavaSCript轉換為C#,我的項目源代碼中將同時運用到這兩者。

在使用Unity開發遊戲並選擇編程語言時需注意:

1.如果你用JavaScript編碼,那就會在編輯之前轉變為C#。這是為何你用JavaSCript編碼時必須用到#pragma strict的原因。每個JS文件都是像C#類一樣用同個名稱執行。所以,既然C#就是目標語言,為何不直接使用C#來編碼?

2.你也可以從JS調用C#,或者從C#調用JS,但不可在一個項目中同時調用兩種語言。這是因為一個文件組要先於另一文件組進行編緝。在“Standard Assets”這一特定文件夾中的文件編輯要先於分布在別處的文件。在我的項目中,我所有的C#文件都在Standard Assets文件夾,所有的JS文件都在基礎文件夾。這意味著我可以從自己項目的JS文件中調用C#。但出於本文需要,我沒有這麼做,但我將進行示例,這樣你的項目有此需求時就可以派上用場。注意,在這個示例中,我所有的JS文件都以2結束,而其對應的C#文件都有相同的名稱,但沒有2這個數字。要調用C#版本而非JS版本,隻要從scriptSceneManager2和scriptAstroid2移除2就行。文件歸到合適位置時,事情就比較簡單了。

function OnTriggerEnter(other:Collider) {
if (other.gameObject.tag == scriptSceneManager2.TAG_ASTROID) {
var astroidScript = other.GetComponent(scriptAstroid2);
astroidScript.ResetPosition();    }    …}

3.JavaScript中的通用術語使用了一個時髦的術語。這在如下嵌套通用術語中尤其令人抓狂:

C#: List<KeyValuePair<int, string>> highScores = new List<KeyValuePair<int, string>>();

JS: var highScores:List.<KeyValuePair.<int, String> > = new List.<KeyValuePair.<int, String> >();

要尤其注意JS中右方括號之間的空隙,因為如果沒有它,文件就無法編輯。

4.C#中的字符串類型名稱是string,而在JavaScript則是String。

5.你可以在JavaSCript代碼中直接調用C#,通常也隻能如此。這是在編輯過程中將JS轉換為C#時要注意的另一點。

6.即使已經完成轉換,也要在轉換前檢查JS術語。其檢查範圍在JS中與在C#並不相同。

例如,在C#中:

for (int i = 0; i < 10; i++) {
print(“i = ” + i); }
// i was only in scope during the for loop, so i must be redefined for the next for loop for (int i = 0; i < 10; i++) {
print(“another i loop. i = ” + i); }

在JS中則是:

for (var i:int = 0; i < 10; i++) {     print(“i = ” + i ); }   // in JS, once a variable is defined it stays defined. Scope is at the function level for (i = int 0; i < 10; i++) {     print

(“another i loop. i = ” + i); }

7.JavaScript可強製轉化許多值,而C#即使在JS嚴格模式中也做不了到。強製轉換(自動從一種類型切換到另一種)會產生大量副效應,從而催生難以發現的漏洞。為此,在使用JS編碼時,我格外注意指定的參數類型,並確保使用的是自己預期的類型。

8.JavaScript函數是一直可存取的,但C#遵循的是域規則。如果一個腳本將調用另一者,在C#中就要確保這些將被其他腳本調用的方法處於公開狀態。

如何使用帶有不與Unity的標準Y-up對齊軸線的3D模型

從其他程序(注:例如Blender、3D、Lightwave等)導入3D模型時,許多此類模型的軸線設置中Y並非處於“up”狀態,而Unity卻有此要求。因此你若不掌握這一方法,就不太可能在Unity中使用這些模型。

你可以通過以下網站了解情況,但其中內容對我來說有點費解了:

http://docs.unity3d.com/Documentation/Manual/HOWTO-FixZAxisIsUp.html

因此,我將通過截圖進行討論。

1.創造一個空白的GameObject

KeyShot_Create_GameObject

2.將GameObject重命名為“Key2”,將其將拖拽到prefabPlayer,令其成為後者的下屬文件。因為我是複製自己的key來解釋如何操作,所以我將不再使用當前的Key,向你展示如何進行匹配。

KeyShot_Key2_Created

3.注意Unity如何在相當隨機的位置中放置對象。將位置更改為0,0,0,這樣它就會很接近原先的Key。現在將Key_8網格和matPlayer拖拽到Key2對象。

你將得到以下結果:

KeyShot_Key2_2

注意新的Key處於其默認方向,這樣會出現旋轉錯誤的情況。因為我們有一個GameObect把持網格,而不是直接將其添加到prefabPlayer對象,我們可以重置Key2 GameObject的旋轉,而不會影響prefabPlayer的旋轉。

將Key GameObject的Y和Z旋轉位置分別設為90和90,更正Key的旋轉方向,這樣我們就有一個可用於玩家的垂直、側視圖的Key。

KeyShot_Key2_3
华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答
×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定