Unity 2017製作Google VR App入門教學

Unity版本更新很快,連帶其外掛也常常更新,小樽備課就常常卡到~加上這學期卡著要衝畢業、同時又各種工作和狀況太忙了(懺悔),總之即使如此還是希望不要耽誤同學的學習,所以把上課來不及教完或教細的內容補上,其實小樽這學期初在教的時候還是2017…學期末2018已經正式release…為了怕外掛沒跟上,還是先用2017.4.f11完成此教學。

Google VR SDK 目前包含原先的 Cardboard 和新的 Daydream平台所必要的所有資源,你可以參考 Google VR開發官方入口網站,上面有使用各種平台所需要的資源~當然目前為止都是英文的,如果你選擇了Unity – Android/iOS,就會進入這頁 Quickstart for Google VR SDK for Unity with Android,Daydream目前需要特定的手機 (或如果你有一體機Mirage solo之類的),好處是具備6DoF的WorldSense技術可以使用,並支援專屬的藍芽控制器(僅3DoF)可以輸入,但是目前就是需要硬體支援,Cardboard好處是多數的Android/iOS設備都支援,開發成本和布置成本相對低,但是品質就受硬體強弱有所影響,並且預設輸入只有一個(一代是磁扣、二代是導電膠帶),但無論你想使用哪個平台做開發~都是用同一套SDK。

目前(2018/6/18) Google VR SDK支援的Unity版本建議為2017.4,最低版本建議5.6,所以小樽去年以前寫的教學估計都失效了無誤 (淚),難怪自己上課都卡關,總之就跟上官方規定的最佳版本以策安全。

如果你之後要發布到Android版,請確認Unity安裝的時候有勾 Android Build Support (如下圖),沒有也沒關係Unity在Build setting裡面沒安裝的發佈器可以讓你單獨線上下載安裝。

如果之後想發佈到iOS設備就確認iOS Build Support有打勾如下, 但是iOS的發佈只是發佈成Xcode的專案,所以想發佈到你的iOS設備前提是你需要一台裝了Xcode的蘋果…或者黑蘋果(小聲)

環境確認沒問題後,請下載最新的GoogleVRForUnity,如果你是新手就下載打包好的 GoogleVRForUnity_xx.unitypackage (xx是版本號會隨時間變動),小樽下載的當下版本號是1.130.1,這個package裡面有四個範例場景,大原則就是Daydream用的只有Daydream硬體才能用~但Daydream硬體可以使用Daydream+cardboard所有的app(或api)。

  • HelloVR Simple:是一個簡單的尋找幾何模型的小遊戲,從過去 Cardboard 至今都是預設的範例(雖然一直改版),你需要的基本功能在裡面都有示範。
  • KeyboardDemo:Daydream用,讓你可以操作鍵盤輸入的UI範例
  • PermissionsDemo:Daydream用,顯示正確的用戶權限請求流程
  • VideoDemo:顯示可以撥放本機或串流之3D/全景影片的各種方案

1.先建立一個3D專案(2D會缺一些必要API),從Assets內按右鍵,Import Package > Custom Package,選擇剛剛下載的 GoogleVRForUnity package。你應該會看到解壓縮匯入這些資料。

2.匯入完成後,你可以在 Assets\GoogleVR\Demos\Scenes 找到上述的四個sample場景,執行看看~如果沒有work,你可能會在執行畫面看到下面的提示

3.別擔心,這是因為你沒有開啟Unity的VR支援,請到Build setting裡面找到Player Setting,然後到右側Inspector視窗最下方找到XR setting頁簽,因為Unity2017以後的版本把AR/VR功能整合在一起,所以在這裡打勾可以啟用相關API,相當方便。

4.打勾後,Unity會詢問你所要使用的VR平台(如下圖),如果你知道你要開發哪個平台就選,如果你還不知道並且想繼續完成入門,就先選相容性相對高的Cardboard先吧。

5.選擇完畢後再去試試看HelloVR Simple應該能正常地玩了,在Unity編輯模式下如果要模擬戴上VR Headset觀看,可以按住鍵盤的Alt來移動滑鼠,視窗就會模擬頭轉動的3DoF來運動,如果點擊滑鼠左鍵,等於是扣下一代的磁環、或按下二代的導電按鈕,產生click的效果,這個範例中每次你找到幾何形狀點一下,他就會跑到別的地方~在這個版本還會變形(早期版本是方塊+Particle),點選Hierarchy中不同的物件,右方會有對應的操作解說。(下圖是官方說明)

6.接著,如果你想將任何做好的場景變成可以用Cardbaord觀看的APP,步驟非常非常簡單,你只要將Assets\GoogleVR\Prefabs下的GvrEditorEmulator丟到你想要使用這個VR功能的場景中,就完成了,但是請注意,這個Prefab運作的原理一開始會將攝影機的座標鎖到0,0,0,並且旋轉被Script鎖住,所以如果你的場景也在0,0,0,你會發現你的視角卡在地平線,在不改動程式的前題下最快速的解決方法就是將場景中的可視物件先放置到一個空物件下,在調整這個空物件的座標讓整個場景的物件位移到你希望的相對位置 (以攝影機為0,0,0的前提下)

7.到步驟六可以完成模擬 Cardboard 攝影機的需求,如果想玩成一個簡單的互動,首先再將Assets\GoogleVR\Prefabs\Event下的GvrEventSystem放入hierarchy

8.將Assets\GoogleVR\Prefabs\Controller下的GvrControllerMain放入hierarchy

9.為了解決上述說的攝影機被歸位到0,0,0的位置,在hierarchy中建立一個Create Empty空物件,這裡命名為Player,並把Main Camera拖曳到其下方,截至目前為止的步驟hierarchy如下圖

10.選擇Main Camera,在Inspector視窗最下方點Add Component找到並添加腳本GvrPointerPhysicsRaycaster

11.於Assets\GoogleVR\Prefabs\Cardboard下方找到GvrReticlePointer,將他拖曳到Main Camera下方,成為Main Camera的子物件如下,到這個步驟為止,按下Play應該可以看到畫面中間出現了選取用的小白點

12.Cardboard的小白點常見應用為觸發三種狀態,一個是小白停留在碰撞物時(小白點會變成圈),一個是小白離開碰撞物時(小白點變成點),一個是小白點停留在碰撞物同時被點擊(Click),下面以控制被碰撞物的動畫來產生…當怪物被凝視時攻擊玩家,當沒有凝視時待命…當被凝視同時點擊時可攻擊怪物的效果如下:

13.首先你可以找一個自己喜歡的模型,如果你還不會製作遊戲用的含動畫模型,可以上assets store下載自己喜歡的,如果你已經會製作,請用你擅長的動畫軟體製作一組至少含三個動作的檔案,建議透過fbx格式輸出,透過 import assets的方式匯入Unity並放置到舞台適合處。

14.接著請在Assets內 (建議好習慣是建立一個Script資料夾專門放置Script) create > C# script建立一個腳本,本範例將之命名為 ControlAnima,因為小樽要拿他來控制動畫。接著點擊這個腳本產生腳本編輯器,接著鍵入以下程式碼,從(1)~(6)的註解都在程式的後方,ctrlanima這個名稱你可以改成自己想用的,但是記得下方函式內的動畫名稱就要一致。

另外 動畫名稱.Play後方(“”)內的字串名稱是來自這組模型身上所擁有的動畫名稱,如果命名不一致,稍後程式也可能因為找不到指定動畫而出錯,以本範例為例,模型身上有這些命名的動畫如下圖

Play Automatically的勾勾預設是打勾的,可以取消

15.選擇舞台上的模型,在Inspector下方Add component>Physics>box collier,增加碰撞器~當然你也可以使用其他形狀,以模型適合的外框為主,調整其大小覆蓋住怪物,基本上Google VR SDK偵測的碰撞行為是以這個碰撞區為主。

16.將剛剛寫好的腳本(在本範例為 ControlAnima),添加到怪物身上,至此怪物身上已疊了下面的組件

17.最後,在Inspector下方Add component>Event>Event Trigger,並新增下面三個事件

Pointer Enter

Pointer Exit

Pointer Click

三個事件後面的下拉選單可以找到上方寫好、並已附加的腳本名稱(在本範例為 ControlAnima),並且在其中找到三個寫好的函式

ShockwaveAttack()

Idle()

TakeDamage()

Event Trigger 設定完成後如下圖

其意義便為,當Pointer Enter (凝視點)發生碰撞時,執行ControlAnima中的函式ShockwaveAttack(),函式內容是ctrlanima.Play(“ShockwaveAttack”);,因此動畫便會撥放ShockwaveAttack這段,另外兩個事件依此類推來形成最後的循環。

如果沒有其他錯誤~你就可以發佈成APP放到Cardboard上玩看看囉~

備註:如果你在發佈Android的時候卡住,絕大多數都是因為Android SDK或Java SDK的問題,可以參考小樽寫的這篇來排除看看