---
# System prepended metadata

title: SteamVR 專案轉 Pico 平台（Unity 2019.2）

---

# SteamVR 專案轉 Pico 平台（Unity 2019.2）
* 適用平台 Unity 2019.2，使用 Pico Unity SDK（Deprecated）
* [PicoXR 版本](https://hackmd.io/qUwntB_gRQi_eAl0DWYNFw?view)
## 建置環境

### 下載並匯入 Pico SDK
* 載點（Deprecated）：https://developer.pico-interactive.com/sdk/index?id=4&device_id=1&platform_id=1
* Import custom package -> 剛剛載的 Pico package

### 修改環境
* 按照 Package 以及 Document 建議修改 ProjectSetting 以及 Android Manifest
  Document：https://developer.pico-interactive.com/document/doc
  **下面是 比較重要的設定 或是 Document 中沒有提到的**

* Edit > PlayerSetting > Player > Other Settings > Active Input Handling 設置為 `Both`  
  （為了讓控制器與 UI 互動）
* 修改 Android SDK（如果建置時報錯：SDK 過期）
  1. 安裝 Android Studio > 安裝額外的 SDK 和 建置工具
![](https://i.imgur.com/bKY6JGQ.png)

選擇需要的 SDK 版本
![](https://i.imgur.com/dbjSghF.png)

**SDK Tools > Hide Obsolete Packages 取消勾選**
![](https://i.imgur.com/EVNclGN.png)

  3. Edit > Preferences > External Tools > 取消勾選 Android SDK Tools Installed with Unity
  4. 選擇剛剛安裝的 SDK 位置
  預設：C:\Users\[使用者名稱]\AppData\Local\Android\Sdk
  
* 修改 Android Manifest
  修改檔案 Plugins/Android/AndroidManifest.xml
  把 android:requestLegacyExternalStorage="true" 移除
  
* 更改所有 Android 無法使用的檔案位置，改成 Application.persistentDataPath
```
    Application.dataPath
    Application.streamingAssetsPath
```
* 以下為 [JCxYIS](https://hackmd.io/@jcxyisncu1102) 找出的幾個需要修改位置
      - [LabTools.cs](https://hackmd.io/gfgRqCBySM6NNwe2mHkKuA)
      - [LabDataManager.cs](https://hackmd.io/IL5oEjF4RzyCH1EIObl24g)
      - [語音辨識 - StreamingRecognizer.cs](https://hackmd.io/@jcxyisncu1102/steamvr-to-pico/%2F4ssQxrzLQS-TqjUn3RXZ3A)

## 場景改動

### Pico 攝影機建置
* 將 Pico 提供的攝影機 Prefab 做成一個新的 Prefab 
  位置：Assets\PicoMobileSDK\Pvr_UnitySDK\Prefabs
* 加入 ControllerManager 為子物件 
  位置：Assets\PicoMobileSDK\Pvr_Controller\Prefabs
* Event 子物件新增 Pvr_Input Module 部件，調整 Confirm Btn 為好用的按鈕 
  [Pico Neo 3 按鈕對應表](http://sdk.picovr.com/docs/sdk/en/chapter_five.html#pico-neo3-input-instructions)
![](https://i.imgur.com/pfUM1eD.png)

* （選裝）自己新建一個名為 HeadControl 的空物件為子物件，其底下再加入 HeadSetControl 空物件，依照圖示加入以下部件並調整（此為鍵盤和其他功能有可能會需要的內容）
  ![](https://i.imgur.com/1HHRcvb.png)
* （選裝）如果需要 VRIK，也要添加雙手（RHandTracker、LHandTracker）和頭（HeadTracker）的追蹤位置（皆為空物件）
* 最終 Prefab
  ![](https://i.imgur.com/69hIFAf.png)
* （選裝）如果攝影機是動態生成，要調整 Prefab 的 Transform 

* **所有場景都加入此 Prefab**（否則實機建置悲劇）

### 修改場景 Canvas
* 移除場景中 EventSystem
* 所有 Canvas RenderMode 改成 WorldSpace 並調整大小和位置
* 所有 Canvas 底下加入此 Script -> [PicoCanvasAddCamera.cs](/cx1rb8haTgSKZnGk_jOCIQ)

### （選裝）VR 鍵盤
* [JCxYIS](https://hackmd.io/@jcxyisncu1102) 的方法：[使用 VR 鍵盤](https://hackmd.io/@jcxyisncu1102/steamvr-to-pico/%2FUyRsBE57Sw-JtpjEBhz_6g)


### VRIK（選裝）
* 有用到 VRIK 的專案，需要客製化綁定內容，如果你的 Pico 攝影機結構調整的跟我一樣，可以直接按照這個改：[VRIKInput.cs](/YwHBfUdlTF-jMlUVN8vYPw)
* 執行一次遊戲，在遊戲中調整剛剛加在 Pico 攝影機 Tracker 的方向，確定後複製 Transform 部件，貼上覆蓋 Tracker 的 Transform

## [專案建置](https://hackmd.io/@jcxyisncu1102/steamvr-to-pico/%2F7GfQHgkgS9-s3SMr2kAZGg)
* 感謝 [JCxYIS](https://hackmd.io/@jcxyisncu1102) 

## Android 上無法使用的類別修改
```這些類別會導致實機上直接崩潰，不會出現任何錯誤訊息```

### SpVoice
* 功能：將字串用語音播出（遊戲中用來使 NPC 說出玩家名字）
* 解法：改用 Google 的轉語音
這裡是把 `text` 這個字串轉語音，可以自行替換
```csharp=
IEnumerator TTS_Google( string text){
    string url;
    // GameDataManager.FlowData.Language 是雙語
    if( GameDataManager.FlowData.Language == Language.中文)
    {
        url = "https://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=" + text + "&tl=Zh-gb";
    }
    else
    {
        url = "https://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=" + text + "&tl=En-gb";
    }
    var www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG);
    yield return www.SendWebRequest();

    if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
    {
        Debug.Log(www.error);
    }
    
    // 播放語音
    clip = DownloadHandlerAudioClip.GetContent(www);
    GameAudioController.Instance.PlayOneShot(clip);
    // 等待播放時間 - 這一行可能要寫在外面，不然沒有等待效果
    yield return new WaitForSeconds(clip.length);
}
```
