第六章
- 4. 6-1 Unity 內建的第一人稱角色控制器
首先我們來練習如何使用Unity 內建的第一人稱角色控制器,
新建立一個專案,在專案視窗中,點擊右鍵, 找到選單中的
Import Package –> Custom Package將外部的練習打包檔匯
入進來。
- 9. 展開Standard Asset,找到Character Controller 底下的First
Person Controller 第一人稱控制器,並將它拖曳至場景中。
拖曳時有個小技巧,就是不要急著把左鍵放開,當我們在拖
曳控制器並且維持按住的狀態時,我們的角色控制器會吸附
並沿著地表移動,等拖曳到適當的位置,再將它放開,角色
控制器的底部就會吸附在地表,節省調整高度的時間。
- 14. 6-2 內建第三人稱角色控制器
Unity 除了內建了第一人稱控制器之外,也內建了一個第
三人稱控制器供我們使用,將剛才測試的第一人稱控制器
刪除之後,找到相同資料夾中的3rd Person Controller,
將它拖曳至場景中。
第三人稱控制器
- 26. 在輸入設定中,我們可以看見,預設有15 組的輸入設定
,而每組設定中有各自定義的按鍵。
比方說,在Fire1 中,定義了滑鼠左鍵及Ctrl 鍵為正向鍵
,假設我們的遊戲需要以滑鼠左鍵或是Ctrl 鍵來進行攻擊
或是發射,我們就可以在Unity 的腳本中,直接使用Fire1
來撰寫,這樣就可以省去繁雜的英文字母,也可以自訂較
容易記住的名稱。
我們將數量改成16(輸入完按下 enter),然後在最下方新
增的那一組輸入設定中,將名稱設定為Run(R 大寫),
然後在正值按鈕(Positive Button)的右邊點擊並輸入,
將它定義為left shift(全部小寫)。
- 31. 確定維京大叔會飄了之後, 接下來我們} 找到2.Scripts
資料夾中的_02_CharacterAnimControl,將此腳本拖曳附
加至維京大叔。
這個腳本的內容主要是透過輸入按鍵來控制動作,以及
的控制動作間的混合及播放型態。
- 40. 命名完成之後,找到Standard Asset –> Scripts –>
Camera Scripts 裡,有一個叫做SmoothFollow 的腳本,
將它賦予到第三人稱攝影機上。
這個腳本的主要功用是設定一個跟隨的目標,在腳本所
宣告出來的參數中,我們可以直接拖曳想要跟隨的物件
來進行跟隨。
如果找不到這個腳本的話,可以從專案視窗空白處 –>
右鍵 –> Import Package –>Scripts 將內建的腳本匯入進
來使用。
- 52. 回顧一下模型匯入的功能,這間房子是由Maya 輸出而來,在
Maya 中製作時,這三段動畫是Key 在同一段時間軸上,也就
是說,從待機、開門到關門這三段動畫是一連串的,而我們
拖曳至場景中會一段一段地幫我們分開,主要是因為在模型
的設定中,使用了Split Animation 的緣故。
圖中我們可以看見,在模型的屬性中,我們事先定義好了,
房子的待機動畫是由第1 格至第10 格,開門動畫是由第11
格至第60 格,關門動畫是由61 格至70格,也因為事先作好
了動畫分割的設定,因此在拖曳至場景時,Unity 就能幫我們
直接切割出每段動畫的段落。
- 57. 開門觸發腳本說明:腳本的內容主要是利用碰撞觸發來開啟
房子的門,並且自動執行後續的動作。
/* 變數宣告 */:腳本的一開始,宣告了房子、門、音效、計
時器、關門時間、開門狀態以及鑽石的需求量等等的變數。
/* 角色碰撞功能*/:第二個部份, 是角色碰撞功能的部份,
這個函式使用的是OnControllerColliderHIt,意思就是如果主角
(Controller)碰撞到的話才會起作用,不是主角的話,就不
起作用,等於是帶有條件的碰撞判斷。
執行內容大致上是說,當維京大叔撞到門,而且門是關著的
,而且身上有足夠的鑽石時,執行開門功能。
/* 開門功能 */:開門的功能主要是呼應上一個功能,這個功
能比較單純,執行時就是依序將內容執行一次。
執行內容大致上是說,當開門功能執行時,將開門狀態設定
為" 是",播放房子(整體)的開門動畫,播放一次開門音效
。
- 58. /* 功能: 持續執行(開門計時器) */:這個開門計時器是一
個持續執行的功能,這裡要注意的重點是Time.deltaTime的用法
,這個功能是指每秒的意思,當我們需要固定的時間時,就可
以用Time.deltaTime 來加乘。
執行內容大致上是說,如果門被打開的時候,啟動一個計時器
,當計時器的數值大於指定的時間時,執行關門功能。
/* 功能: 關門 */:關門的功能主要是呼應上一個功能,這個
功能比較單純,執行時就是依序將內容執行一次。
執行內容大致上是說,當關門功能執行時,將開門狀態設定為
" 否",播放房子(整體)的關門動畫,播放一次關門音效,將
開門計時器歸零。
/* 附加腳本時自動生成AudioSource 元件*/:最後一行則是一
個自動生成元件的語法,讓我們在附加腳本時,就自動在該物
件上生成一個AudioSource 元件
了解了開門觸發腳本的內容之後,回到我們的場景中,將開門
觸發腳本拖曳附加至維京大叔身上。
- 80. 鑽石獲取腳本說明:這個腳本的內容主要是透過物理的碰撞來
消除鑽石、增加獲取數值並播放音效,達到收集鑽石的效果。
/* 變數宣告 */:宣告的部份有獲取時的聲音、及獲取的數量
,這裡要注意一點,獲取數量的值採用了static var 靜態全域變
數來宣告,此種變數可以被其它腳本所存取,因此我們後續可
以從其它腳本來連結這個數值。
/* 功能: 遊戲初始化(將鑽石獲取數量歸零)*/:Start 函式
會在腳本啟動時,在任何持續的函式執行前,先執行一次,也
可以說是腳本執行後,第一個執行的函式,但是前提是此腳本
必須是啟用的狀態。
由於遊戲有可能會直接重玩,因此我們不能將數值留著,利用
Start 函式在場景每次載入時,將獲取的數值歸零。
- 81. /* 功能: 角色碰撞(角色必須帶有CharacterController)*/:
這個部份的碰撞和開門碰撞是一樣的,不同的是這一次是撞
鑽石,而後續的動作是將獲取數量加1 –> 播放音效 –> 刪
除鑽石。
這裡要注意的是Destroy 語法,我們常常會用Destroy 語法來
消除物件,後方的括號裡代表的是刪除的物件,還可以再加
上刪除的時間來延遲消除,比如說 Destroy(刪除的物件, 5)
,這樣就代表5 秒之後才刪除它。
/* 附加腳本時自動生成AudioSource 元件*/ :最後一行則是
一個自動生成元件的語法,讓我們在附加腳本時,就自動在
該物件上生成一個AudioSource 元件
將獲取鑽石腳本附加到大叔身上。
- 91. 建立了介面圖像之後,我們就會在畫面上看到鑽石的圖像,透
過屬性欄裡的Transform 來調整位置,透過GUI Texture 的屬
性來調整偏移量及大小,在調整的時候要注意單位。
由於GUI Texture 的位置表示是畫面顯示的比例,因此在
Transform 中,它的數字是用0~1 之間來表示,換句話說,X
軸的0 就代表著圖像是位於畫面的最左邊,1就代表著圖像是
位於畫面的最右邊,0.5 就代表位於畫面的中間,Y 軸的表示
方式也是一樣,以此類推。
再來找到GUI Texture 元件的屬性欄,Pixel Inset 是用來調整
偏移量,這裡可不用調整,而Width 及Height 則是用來調整圖
像的寬及高,將其調整至適當的大小及位置。