1. 程式人生 > >【Unity3D實戰】零基礎一步一步教你製作酷跑類遊戲(1)

【Unity3D實戰】零基礎一步一步教你製作酷跑類遊戲(1)

首先做個自我介紹,我是一名在讀的大三學生,軟體工程遊戲開發方向。

一直以來,我夢想著成為一名遊戲開發者,所以在大三分方向時我毫不猶豫地選擇了遊戲開發方向。剛剛接觸
Unity3D一段時間,現在需要大量的實戰來鞏固自己的知識。

在我的個人部落格中,將記錄下這些實戰經驗,供日後自己回顧,若是能幫助到同為初學者的朋友就更好了。

本篇部落格中,將記錄一個簡單的酷跑類遊戲的實現,哪怕是從未接觸過Unity3D的朋友,也可以參照本文完成
自己的第一個酷跑類遊戲。

正文,即將開始!

所有遊戲的第一步 建立工程

我們先開啟Unity3D,這裡本人使用的是Unity3D 5.3.0版本,目前最新的版本是5.3.2,大同小異,還未
安裝Unity的朋友可以到官網獲取,下載個人版的就可以了。(既然加入到開發者的行列,還是支援正版的比
較妥當。Unity3D個人版是免費使用的 而且完全足夠我們的使用 只有當盈利達一定額度時才需要購買Pro版
本)

Unity啟動介面

點選右上方的New後,將出現下圖所示介面。

Unity建立工程介面

在Projects下有兩行輸入欄,第一欄ProjectName自然就是工程名,第二欄Location則是工程的儲存路徑。
3D/2D代表的是本遊戲是3D遊戲還是2D遊戲,這邊我們選擇3D(其實開發2D遊戲在本介面選擇3D也是可以的,
因為建立完畢後在工作面板依舊可以切換)。

輸入好工程名與路徑後,我們點選CreateProject,建立工程,等待其讀條完畢將自動開啟工作面板。

遊戲的創造場所 工作面板

工作面板

從上圖我們可以很清楚的看到Unity的工作面板大致分成幾個區域:
1.選單欄
2.Scene檢視
3.Game檢視
4.Hierarchy檢視
5.Project檢視

當然有的初學者朋友就會發現,可能我的工作面板和你們長的不大一樣,這是為什麼呢?是不是下載錯了?

別急。看到右上方的Layout了嗎,單機它。你就會看到這樣的一個列表

Layout列表

哦,對了,還有一個Project檢視長的有點不大一樣。

Project檢視選項

如圖所示,單機Project檢視最右邊的按鈕,將彈出一個列表,選擇第一個就好啦~

當然這些檢視的位置擺放主要看個人愛好,大家怎麼喜歡怎麼來就好了,不會影響到遊戲的開發。

建立場景

場景,也就是Scene,我們可以把它看作是一個空間、一個小世界,遊戲裡面的物體存在於某一個場景中,
可以從一個場景跳轉到另外一個場景。比如我們開啟遊戲時,點選開始遊戲,就會從主選單場景跳轉到遊戲場景。

在建立場景前,我們現在Project檢視下建立一個資料夾,命名為Scenes,這樣將工程下的檔案按其型別進行
分類存放,便於管理。可以通過點選Project檢視下的Create按鈕,可以在Project檢視中右鍵進行建立。

點選Create按鈕(或右鍵)
Create按鈕

選擇Folder
選擇Folder

命名為Scenes
命名

這樣,我們便建立好了一個資料夾,接下來,建立Scene。點選右上角的File選單。

點選File選單

因為在建立工程時,Unity自動建立了一個Scene,所以我們只要儲存它(或者用Ctrl+S快捷鍵)就行了。

儲存場景

將其儲存至Scenes目錄下,命名為gameScene。

gameScene

建立道路

我們將目光投向Hierarchy檢視。這裡我們能看到有兩行已存在的東西:Main Camera 和 Directional
Light。從名字上我們很容易就能得出,一個是主攝像機,另一個是平行光。

主攝像機是幹什麼用的呢,很簡單,遊戲裡面存在著各種各樣的物體,它們怎麼被顯示到螢幕上的?Unity會將
攝像機所看到的景象渲染到我們的遊戲視窗上。可以將攝像機當作是眼睛,代替我們觀察著遊戲中的美好世界。

平行光就是朝著一個方向照射的光,遊戲裡面必須要有光,從小到大,老師都教我們,為什麼我們能看到東西?
因為光照射到物體上,反射到我們眼睛中。如果現實世界中沒有了光,我們將看不到任何東西。遊戲中也是相似 
的,當然會有點不同,如果將光刪去,則遊戲中的物體將會變暗而不是完全看不見。這是因為Unity為我們創造 
的世界中還有一種無處不在的環境光,它是接近於黑色的。

去掉光源

講了這麼多,我們重回本小節標題來講。

有的朋友看到圖就會問,誒,你怎麼多了個立方體啊?

這就是我們接下來要提到的,如何建立一個物體到遊戲場景中。

首先,點選Hierarchy檢視的Create按鈕(或右鍵)

Create

我們將會看到以下列表,選擇3D Object——Cube。

3D Object

Cube

即可建立上文某圖中突然出現的立方體。

這時我們選擇一下這個立方體,將視線投到右邊的Inspector檢視上。

Inspector

從上到下看,看到一欄輸入框上面寫著Cube了嗎?這就是這個物體的名字,可以直接在這裡修改它,也可以在 
Hierarchy檢視中重新命名。

在它左邊的那個小勾,意味著是否啟用它(Active),如果將勾去掉,則將會發現在Hierarchy檢視中它的名字 
變灰色了,遊戲場景中它的身影也消失了,正如它悄悄的來.....

Tag就是它的標籤,可以將一系列需要分類的物體進行歸類。
Layer是它所處的層,可以通過修改攝像機的屬性,指定允許它看到的層。
Transform中 很好理解的三個屬性 Position位置 Rotation旋轉角度 Scale縮放大小。

先講到這,因為Transform中有我們現在需要操作的屬性。

將滑鼠移動到任何一個XYZ旁邊 都會看到滑鼠指標變了,按住左鍵左右移動,就能修改對應的值。

這裡我們手動修改Scale的值。如下圖所示。

修改Scale

就會看到場景中的Cube發生了相應的變化。

修改後的Cube

這樣像不像一條筆直的路了?

當然一條路是不夠跑的,按我們的速度,那可是像飛人一樣 咻的一聲就過去(誒 這說的好像是超人0v0)。

既然是酷跑類的遊戲,那就應該讓它的路無限延長,跑的腰痠背痛腿抽筋才行!

我們這裡的思路是,建立兩條路,當跑到路1的X位置時,將路2拼接到路1後面,而跑到路2的X位置時,再將 
路1拼接到路2後面,不斷迴圈迴圈迴圈,直到天崩地裂海枯石爛...

好了,我們先來建立第二條路,有人就會問,是不是又得建立Cube啦 是不是又要修改Scale啦?

恭喜你,答對了!不過我們這邊創建出來的是完全一樣的兩條路(就算有一些不一樣,在什麼東西都未加的時候, 
它們都是這麼一個像板一樣的Cube)。

相信大家都很喜歡用複製貼上功能,多方便啊,這裡複製一下,在那裡貼上一下,少了不少功夫呢!所以我們這裡 
也用類似的功能。

首先在Hierarchy檢視中選擇Cube,按Ctrl+D的快捷鍵,怎麼樣,是不是出現了一個它的弟弟Cube(1)呢? 
當然用複製貼上也行的,右鍵Cube選擇Copy(或者Ctrl+C),右鍵Hierarchy檢視,選擇Paste(或者 
Ctrl+V)。

複製道路

這時就有人說了,你騙人!場景中明明還是一條道路,第二條呢!被它吃了嗎? (╯°Д°)╯︵ ┻━┻

好吧,事實就是——真的被它吃了。開玩笑的啦 ̄ω ̄,你看到不到它是因為兩條道路重疊了!

這時候,就該調整Transform的另外一個屬性,Position了!

首先,選擇Cube(1),在Inspector檢視中將它的Position的X屬性修改成20。至於為什麼是20呢,因為他們 
的Scale中的X是20.Cube原本的大小是1*1*1,將Scale修改後,其X值就變成了1*20=20,也就是X方向上的 
長度為20,而第一個Cube的X為0,第二個Cube自然要在X方向上距離它有20啦~

複製後的檢視

看到了吧,第二條路出現了,我才沒騙你們呢! (╯°Д°)╯

看到圖是不是有人會問了,奇怪了,你的Scene檢視中道路怎麼變小了,變瘦了,減肥了咩?

當然不是了,我們的道路這麼苗條,怎麼可能需要減肥嘛。至於它為什麼會變小了(當然是因為減肥啦...好吧 
我開玩笑的),那是因為我用滑鼠滾輪調整了在Scene中觀察物體的距離,離得遠了自然就小了嘛~

好了,道路建立完畢了,接下來接著建立人物吧~

建立人物 (沒有人物的遊戲還算遊戲嗎!——當然算)

首先提供一個模型的下載地址,是網上找的,畢竟我是程式猿不是建模獅TAT
你會得到如下的UnityPackage。

UnityPackage

將它放在一個合適的目錄,這裡有個重要的事情:必須是英文路徑!必須是英文路徑!必須是英文路徑!

不然的話Unity是無法正確載入它的。

至於要怎麼使用,雙擊咩?並不是。我們繼續切換到剛才的工作面板中,右鍵兵選擇Import Package——Custom 
Package,然後選擇剛才的資源包。

匯入資源包

然後在出現的面板中選擇All 再點選Import。

Import

然後就能在Project檢視下看到多了一個Model資料夾。

載入後

我們選擇並拖動character這個檔案,將其拖動到Hierarchy面板中,然後我們就會看到它出現在了場景中。 
但是有個問題,它.....太大了!!( (╯°Д°)╯︵ ┻━┻這個胖子怎麼和作者一樣不減肥!)

拖動至場景

剛才上面好像提到了什麼不得了的東西...不管它了!我們來讓這胖紙變的瘦小一點吧(無辜的胖紙:我明明是 
巨人國的,才不是胖紙呢!)

是的,聰明機智勇敢美麗善良可愛的你沒有猜錯,就是修改Scale中的值,將其都設成0.1吧(嗬嗬嗬,讓他變 
矮子)

修改大小

然後就會發現,他真的變矮了!啊不是,他真的變小了!!

修改後的樣子

接下來,我們要修改一下他的朝向,總不能讓他往旁邊跑跳下去吧!所以我們修改一下Transform中唯一現在 
還未修改過的值,Rotation!

修改朝向

我們將Rotation中Y的值修改成90,也就是將其繞著Y軸旋轉90度,他就正常的朝著無量(亮)的前方了!

修改朝向後

讓人物“動”起來 新增動畫

你們看這矮胖紙和筆者一樣傻愣愣地一動不動地發呆,這這麼行!生命在於運動,我們讓他從現在開始,動起來!

首先,單擊Hierarchy面板中的character,讓其屬性顯示在右邊的Inspector檢視上。然後在Project檢視中 
找到character,點選它左邊的小三角,在出現的一大堆列表中找到run。這是一個動畫檔案,將其拖動到右方 
Inspector檢視的空白處。仔細觀察,會發現它自動建立了一個character.controller檔案,並賦給了 
character物體物件的Animator中的Controller。

匯入動畫

點選工作面板正中央上方的控制條中的播放按鈕,執行該場景,就會發現主角跑了起來~(我想起了在夕陽下的 
奔跑,那是筆者那個胖紙逝去的青春...)

執行場景

奔跑動畫新增完畢。做下一步事情。

讓人物動起來 人物控制器

在Unity的Standard Assets裡面是有第一人稱和第三人稱控制器的。不過既然是入門教程,我們還是儘量自 
己寫一個簡單的人物控制器來操控人物,畢竟這個Demo也就這麼幾個地方需要寫程式碼...

首先我們為了方便管理,在Project中建立一個資料夾,命名為Scripts,然後在該資料夾下建立一個C# 
Script,命名為moveController.cs。這裡有個非常重要的一點,儘量在建立時直接命名,如果已經建立好了, 
右鍵——重新命名(或按F2)也是可以的,但是這樣重新命名的話,需要開啟指令碼將其類名一起對應修改。否則編譯器 
會報錯的。

建立指令碼

建立指令碼命名

然後雙擊開啟該csharp檔案。這裡筆者使用的是VS2015,大家可以選擇自己喜歡的coding工具,修改預設設定 
在工作面板的選單欄——Edit——Preferences中的External Tool中修改。

修改codingTool

修改codingTool

開啟該csharp檔案後,我們可以看到下圖所示原始檔。

原始檔1

我們先宣告一個浮點型變數,並將其訪問許可權定為public,預設值為5.0f。然後在Update()函式中新增一行。

原始檔2

這裡筆者要提到一件事,今後的所有程式碼,筆者都儘量用圖片的形式顯示,而不直接貼出來,這是為了讓大家能 
親手去敲出這些程式碼,而不是一味的複製、貼上。筆者身邊很多朋友都喜歡複製、貼上,但是這樣,真的不好, 
一點好處也沒有,哪怕是你完全懂的知識。
因為
1.直接複製、貼上,會讓你養成這種壞習慣。
2.複製、貼上的東西,哪怕你看一百遍後讓你寫一遍,恐怕寫不出來。
3.筆者縮寫的程式碼並不是最優方案,只是為了方便一些初學的朋友而儘量簡單。自己敲一遍可以想想有沒有其他 
方案可以實現同樣或者更好的效果。 

這裡稍微講解一下程式碼中的內容,因為比較簡單,我就一行一行的講。從上到下:

1、2.兩句using xxxx;這是引用名稱空間,Unity的基本要素在UnityEngine這個名稱空間中。

3.public class moveController:MonoBehaviour 這一行中,public代表了該類的訪問控制為 
public(公共的),class是類的關鍵字,本行的意思是 聲明瞭一個訪問控制為public的類,類名為 
moveController,其繼承於MonoBehaviour類。

4.public float moveSpeed = 5.0f; 本行聲明瞭訪問控制為public的單精度浮點型(float)變數, 
變數名為moveSpeed,其預設值為5.0f。注意這個f,有的朋友會經常忘記加,大家可以試試沒加f會怎麼樣。 
是的,編譯器會直接報錯。因為這個f代表了前面這個數字是float型別

5.void Start() 這是預先宣告好的函式,Start將在MonoBehavior建立後在該幀Update之前被呼叫。

6.void Update() 這也Unity預先宣告好的函式,遊戲中的每一幀都會呼叫Update()

7.transform就是遊戲物件(GameObject)的Transform元件的例項類物件(還記得我們還調過Cube的 
Scale、Position嗎)。transform.position指的便是遊戲物件的位置。 

a+=b等同於a=a+b。 

new Vector3(1,0,0)這裡是例項化一個Vecotr3的類物件,分別複製x=1 y=0 z=0.Vecotr3就是三維向量, 
百度一下就知道什麼是三維向量。new是用來例項化的,應該有不少學過C++還未接觸過C#的朋友會和我一樣曾經 
在這個地方直接Vetor3(1,0,0)吧?大家可以試試,這樣會報錯的,如果沒有new例項化的話。 

moveSpeed就是剛才我們宣告好的浮點型變數,用來代表每秒的移動速度。 

Time.deltaTime 這個是指每一幀重新整理的時間 也就是呼叫兩次Update()中間的間隔時間。

按Ctrl+S儲存,或者點選左上方的儲存圖示進行儲存原始檔。然後返回到Unity的工作面板上來。

選擇Project中的moveController.cs檔案,將其拖動至Hierarchy中的character上,在Inspector檢視 
中確認已成功新增moveController.cs後,點選執行按鈕,觀看效果。

執行效果

就會發現我們的主角已經邁著他的小短腿跑起來了。而且並不是像之前那樣的原地踏步,而是朝著前方奔跑著, 
跳躍著...哦對,還沒跳躍呢!接下來我們要做跳躍的控制。

萬分感激

萬分感激觀看到這的朋友,同樣萬分感激點選進本部落格卻沒有看到這的朋友。筆者知道自己的能力不足,只能分享 
一些剛入門時的經驗給各位朋友,已經入門的朋友這篇文章可能沒有太多的幫助。

目前本文已經完成了跑步的操作,接下來還缺:跳躍、加分道具、顯示當前分數等等功能,由於夜深了,並且筆者 
今日一大早坐動車來回跑,有些困了,打算先去休息一番。待過一兩日再續寫本系列零基礎教程——酷跑類遊戲。 

再次感謝大家! 

致敬!