2017年9月21日 星期四

Google VR for Unity 1.70.0 在 iOS 所遇到的問題

現今使用 Unity 來開發 VR 專案已經非常常見,然而,VR 專案還需要搭配相關的裝置,如果沒有這些設備,又想要體驗 VR 的話,Google VR 倒是個方便的選擇。雖然如此,但在實際測試輸出到 iOS 平台時,也遇到了一些狀況需要一一克服,以下就將所遇到的狀況以及解決辦法記錄下來,以提供給遇到相同問題的朋友們參考。


這次所使用的環境為 macOS Sierra 10.12.6、Unity 2017.1.1f1、Xcode 8.3.3、Google for Unity 1.70.0,版本不同的話,也許會有不同的狀況。

空專案開啟 VR 直接 Build 為 Xcode 專案的錯誤:

以 Unity 2017.1.1f1 來說,要在 iOS 建立一個 Google VR 的 Cardboard App,相當的簡單,即使是在完全新的空專案中,只要在 Build 之前,在 Player Settings 的 Other Settings 勾選 Virtual Reality Supported,然後在所出現的 Virtual Reality SDKs 區塊添加 Cardboard,那麼即可建立具備 VR 畫面的 App。


但是,如果在 Build Settings 視窗,直接點擊 Build 按鈕輸出為 Xcode 專案,然後將手機接上電腦之後,從 Xcode 點擊 Build 按鈕,最後會獲得 Build 失敗的結果,並會獲得「Apple Mach-O Linker (Id) Error - linker command failed with exit code 1 (use -v to see invocation)」的錯誤。


如果以這個資訊在網路上搜尋,應該會找到很多建議改什麼設定來解決的做法,但似乎不能解決問題;而在 Unity 論壇討論主題裡,可以找到一個官方回覆的資訊,原來是要以 Workspace 開啟 Xcode 來 Build,而不是以 Project 開啟 Xcode 來 Build,而我們在 Unity 的 Build Settings 直接按 Build 按鈕會建立 Xcode Project,Workspace 等東西就要自己手動建立,如果本身不是開發 iOS 原生 App 的,或者對 Xcode 使用不熟悉的,這點倒是有點麻煩。

幸好,該段 Unity 官方人員的回覆裡有提到,在 Unity 中使用 Build And Run 會在建立的 Xcode 專案資料夾裡建立 Workspace,所以使用所建立的 Workspace 檔案(Unity-iPhone.xcworkspace)來開啟 Xcode 專案並 Build,即可成功 Build,此時在手機上的畫面,就會呈現 VR 效果,轉動和傾斜手機,可以環顧場景四周。

使用 Google VR for Unity 但沒有開 Virtual Reality Supported 的情況:

既然在 Player Settings 直接開啟 Virtual Reality Supported 並添加 Cardboard SDK 即可製作具備 VR 效果的手機 App,那麼還需要匯入 Google VR for Unity 做什麼?

如果,目標是製作個場景,然後單純是用手機 VR 環顧四周來觀賞場景,不需要任何互動或立體聲音的話,確實這樣就已足夠,不需要 Google VR for Unity 資源包,否則,使用 Google VR for Unity 所提供的東西,會比自己製作那些互動功能要方便些,而且 Google VR for Unity 資源包裡也提供了模擬操作,讓我們在 Unity 編輯器中模擬一些輸出為 VR 時的相關操作行為。

在匯入 Google VR for Unity 之後,可以直接找出並開啟 GVRDemo 這個示範場景來測試和體驗,此時,可以直接 Play 進行對鏡頭模擬 VR 的操作,不過,目前這個 Google VR for Unity 1.70.0 的版本,已經不會像以前的舊版那樣,顯示 VR 左右兩眼的視野;此時可以轉動和傾斜畫面,但是並沒有準心能夠與場景中的物件互動。

如果,這個時候直接 Build,在 Console 會出現「On iOS 'Player Settings > Virtual Reality Supported' setting must be checked.」和「On iOS 'Player Settings > Virtual Reality SDKs' must include 'Cardboard’.」這兩段錯誤訊息,但還是可以成功建立 Xcode 專案,並且也可以成功發佈到手機上,只是手機上顯示的不會有任何 VR 的功能,就是很單純的手機 App。

其實,這在 Unity 編輯器中 Play 的時候,應該就能夠在遊戲畫面中看到 UI 的提示「Please make sure’Player Settings > Virtual Reality Supported’ is checked」,因此,會獲得這樣的結果也很正常。



使用 Google VR for Unity 並開啟 Virtual Reality Supported 的情況:

既然 Virtual Reality Supported 是必要開啟的,那麼在開啟並添加 Cardboard SDK 之後,再次 Play 看看,會發現 Game 視窗中間多了一個準心,並且可跟場景中的物件(Cube)互動,但是,低頭對地板上的 UI 按鈕卻無法互動,同時也會發現到 Console 視窗不斷的列出「GvrPointerGraphicRaycaster requires GvrPointer to have a Camera when in Direct mode.」這樣的錯誤訊息。

要解決此問題,只要從 Hierarchy 視窗選取 Player > Main Camera > GvrReticlePointer 這個遊戲物件,並在 Inspector 視窗將 Raycast Mode 這個欄位改為 Camera;此時,再次 Play 看看,畫面中間的準心就可以與地板上的 UI 按鈕互動,並且 Console 視窗也不再跳出那個錯誤訊息了。




接下來,依照前面所述,使用 Build And Run 來建立 Xcode 專案,並在 Xcode 專案資料夾裡使用 Workspace 來開啟 Xcode(Unity-iPhone.xcworkspace),將手機接上電腦之後,在 Xcode 裡 Build 專案應該可以成功安裝到手機上。

但是,即使如此,當 App 在手機開啟執行時,在啟動畫面(Splash 畫面)之後,會在 Xcode 裡面發現到程式執行中斷,並可觀察到「Thread 1: signal SIGABRT」或「Thread 1: EXC_BAD_ACCESS (code-1, address=0x...」這類錯誤,而如果先停止執行,並直接在手機開啟安裝好的 App,則會在執行到啟動畫面之後閃退。



使用所獲得的訊息在網路上搜尋,可能也可以找到一大堆建議做法,但是,如果你不是 iOS 原生 App 開發者的話,也許會覺得很困難,可能看不太懂或者不曉得該如何做。

幸好,在 Github 裡的 googlevr/gvr-unity-sdk 的 Issues 裡,有人提供了解法:

  1. 先去取得 iosunityfix.sh,並放到 Xcode 專案的資料夾裡。
  2. 如果 Xcode 專案開啟中,請先關閉,然後開啟 Mac 電腦裡的終端機。
  3. 輸入「cd Xcode專案的資料夾路徑」並按下 return。
  4. 輸入「chmod +x iosunityfix.sh」並按下 return。
  5. 輸入「./iosunityfix.sh」並按下 return,等待執行結束。

完成以上步驟,即可再次在 Xcode 專案資料夾裡使用 Workspace(Unity-iPhone.xcworkspace )來開啟 Xcode,並 Build 輸出到手機上,如此,在執行 App 時,應該就不會執行中斷或閃退了,並且畫面上可以正常呈現 VR 效果,中間的準心與場景物件或 UI 也都能有正常的互動。