---
# System prepended metadata

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

---

# SteamVR 專案轉 Pico 平台（Unity 2020.3）
* 適用平台 Unity 2020.3.33f1，使用 Unity XR SDK v2.0.7
* [Unity XR SDK 安裝說明](https://developer-global.pico-interactive.com/document/unity)
* [Android SDK](https://drive.google.com/file/d/15tjK7iabb-s5kFruLksrNPI6vdAIFEbH/view?usp=sharing)
* [AAC](https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.0/manual/general-setup.html)


## Pico SDK 文檔
* 依照 Quick Start 開始調整專案
* **不要**照著這項設定調整，保持 Mono，IL2CPP 會開啟 Script Stripping，精簡你的 Library，然後實驗室框架出事（太多無效程式碼卻又互相依賴）
![](https://i.imgur.com/vp6PV1C.png)
    * 同時要設定 Managed Stripping Level 為 Disable
    ![](https://i.imgur.com/7siyKP5.png)


## Unity 2020.3 升級後程式修改
* 不確定是實驗室框架還是專案有試用過，Unity 升級後因為使用的類別已經被廢棄而噴錯，這裡有三個解法：
    - 直接刪除整個相關套件：這個方法稍微冒險但也最簡單，因為那些會噴錯的套件基本上都是太舊了才會因為這種原因噴錯，而且專案中其實有不少不需要的工具，並不是都有用到的，但是刪除如果失敗回復麻煩，而且不知道是否對專案有隱藏的影響。
    - 代換掉被廢棄的類別：這個專案之間不同可能無法完全覆蓋到，我這裡有噴錯的有 I2 Translation、Final IK 和 SteamVR，下面逐一討論修改內容
    - 直接版套件升級到新版：最穩、最簡單，但這些套件都要錢..... 可能要跟實驗室獲取

### I2 Translation 
* 這個蠻建議直接刪掉，難搞
* 噴錯程式碼：
    - LocalizeTarget_UnityStandard_GUIText.cs
    - LocalizeTarget_UnityStandard_GUITexture.cs
* 廢棄類別：GUIText、GUITexture
* 解決方式： 
    - GUIText 更改為 Text ( 腳本要新增 using UnityEngine.UI )
    - TextAlignment 更改為 TextAnchor
      屬性內容如 TextAlignment.Center 改 TextAlignment.**Middle**Center
    - GUITexture 更改為 Image 或 RawImage ( 腳本要新增 using UnityEngine.UI )
    - GUITexture 中的類型 texture 改 sprite ( RawImage 的話不用 )
    - GUITexture 中類型 pixelinsert（如果你 GUITexture 改 Image）
    ```
    guiTexture.pixelinsert = new Rect(dOffsetX, 0, fDeltaWidth, 0);
    改成
    guiTexture.SetClipRect(new Rect(dOffsetX, 0, fDeltaWidth, 0), true);
    ```

### Final IK 
* Final IK 比較特別，只是部分程式碼使用了舊版 import 結構，直接在噴錯的腳本中加入：
```using UnityEngine.Animations;```

### Leap Motion \ Kinect Demo
* SDK 太舊，只能刪除或忽略（在資料夾名字後面加入`~`）
![](https://i.imgur.com/q9HXgg4.png)
* 其他有使用到或引用到的測試程式通通忽略或刪除


### SteamVR 
* 有新版免費套件，官方推薦直接刪除 SteamVR 和 SteamVRInput 資料夾然後從 PackageManager 安裝新版
* 除此之外還需要安裝 Unity XR 的套件才能正常運作，這個等等在 XR 安裝中就會一併處理

### ProBuilder
* 從 Package Manager 更新

### 插件以外問題
 * System.Drawing.dll 有重複，直接尋找刪除即可
     * 刪除引用 using System.Drawing.Imaging;
 * 奇怪的 import 直接刪除 `using System.Runtime.Remoting.Messaging;`

### ~~Render and Lighting~~ 之後未出現此問題
* 這個不是插件問題，而是美術素材問題，2020 的 Light mapping 支援了新的功能，也會看到每個場景檔都會有新的設定檔可以調整
* [Unity 官方](https://docs.unity3d.com/Manual/UpgradeGuide2020LTS.html)這裡建議升級之後先 Clear Baked Data 再 Generate Lighting，讓 Unity 重新生成
* 目前測試是**每次輸出都需要重新生成**，還未找到更好解法
![](https://i.imgur.com/UrvjKjJ.png)

## 安裝 Unity XR 環境

### Package Manager 安裝
* XR Plugin Management
* XR Interaction Toolkit
    * 底下的 Samples 的 Starter Assets 也安裝
    ![](https://i.imgur.com/vNFN0c4.png)

### Project Settings 調整
* Preset Manager > Add Default Preset > XR Controller (Action-based)：新增以下兩個 Controller 的 預設 Conponent
    * 要輸入 Right 和 Left 讓 Unity 去偵測
<!-- ![](https://i.imgur.com/CJfAuu0.png) -->
![](https://i.imgur.com/5YieJYX.png)
* XR Plugin Management > 勾選 PicoXR
![](https://i.imgur.com/E1Ftmh8.png)

### 新的 XR Rig
* 在 Hierarcy 右鍵 > XR > XR Origin (Action-based)
    * XR Origin 新增 Input Aciton Manager 部件
    * Action Assets 新增 XRI Default Input Acitons
    * 可以調整一下 Camera Y Offset，我這邊是太高了
![](https://i.imgur.com/FW6nLPv.png)
* XR Origin 底下的 LeftHandController 和 RightHandController
    * 底下新增一個空物件，代表虛擬手把的位置（Pico的手把模型非常硬要，只會有一個透明的電量 Icon）
    * （選裝）底下另外新增一個空物件，代表人物模型手的位置
    * XR Controller 部件 > Model 新增 Pico 的手把模型（Package > PicoXR Plugin > Assets > Resources > Prefabs 裡面）
    * Model Parent 加上剛剛代表虛擬手把位置的空物件
      ![](https://i.imgur.com/8iM5Ael.png)
    * XR Ray Interator 部件底下調整 Raycast Configuration（很重要！Max Raycast Distance 決定你雷射能互動的距離！） 
      ![](https://i.imgur.com/WSVxaL6.png)
* （選裝）XR Origin 底下的 MainCamera 新增 Head Tracker 空物件代表人物模型頭的位置
* 最後把它做成 Prefab，全部照做應該長這樣
![](https://i.imgur.com/qvDFdxx.png)

### XR Interaction Manager
* 這個你在新增 XR Rig 到場景中應該就會出現，記得如果你的 XR Rig 是動態生成要事先放場中
![](https://i.imgur.com/scLf09k.png)


### 場景中 Event System 調整
* Input Module 改 XR UI Input Module
![](https://i.imgur.com/E81lLdc.png)
* 加上預設 Preset
![](https://i.imgur.com/7bpDtsT.png)


### 場景中 Canvas 調整
* 新增 Tracked Device Graphic Raycaster 部件（需要互動的）



## （選裝）從 PicoVR Unity SDK(Deprecated) 升級到新 XR SDK
* 因為我們都是從舊版升級過來的，這個過程也筆記下來
* 這部分 [官方文檔](https://developer.pico-interactive.com/docs/en/12058/migrating-to-unity-xr-sdk/) 寫得還算清楚，僅 Pico 的部分可以直接參考
* 下面提供大致步驟
### Pico SDK 升級
1. 下載新版 [Unity XR SDK](https://developer.pico-interactive.com/sdk) 然後從 Package Manager 安裝
2. 刪除 Assets > Plugins 中的 LitJson 
3. 刪除紅框內的所有內容
![](https://i.imgur.com/vcoj1PT.png)
    * AndroidManifest 可以重新讓 Unity 生成，刪除上述內容後，在 PlayerSettings > Player > PublishSettings 中 取消勾選再打勾 Custom Main Manifest
    ![](https://i.imgur.com/G3InbMF.png)
    * AndroidManifest 重新生成後在文件裡的 application 下加入 
    ```<meta-data android:name="pvr.app.type" android:value="vr" />```


4. 刪除 Assets > Plugins > Android > libs 中的 pvrSDK-release
5. 刪除 PicoMobileSDK 資料夾
6. 再來就是把所有原本場景中有用到舊版 Pico SDK 的 prefab 和 script 移除或更改

### 疑難排解
* 我的設置完成後遇到了 PicoXR SDK 提供的新 dll 和 jar 檔因為放在 Android 資料夾底下而被 Unity 誤會為 Android 平台內容而導致 Build 錯誤（[參考](https://devanswers.pico-interactive.com/index.php?qa=2915&qa_1=sdk%E7%9A%84%E5%B7%A5%E7%A8%8B%E6%89%93%E5%8C%85unityab%E7%83%AD%E6%9B%B4%E6%96%B0%E5%8C%85%E6%97%B6%EF%BC%8C%E6%8A%A5%E9%94%99%E8%AF%AF%E8%AF%B4the-namespace-litjson-could-found)）
    * 我的解法：把 PicoXR 底下的 Runtime > Android 中，除了 pxr_api-release.aar 以外的內容通通搬到 Runtime 底下，也就是搬到上一層
![](https://i.imgur.com/uXolojb.png)
    * 搬完之後記得要重開專案，否則不會有改動
* 新版 SDK 會推薦把 Project Settings > Player > Other Settings > Configuration > Scripting Backend 調整成 IL2CPP，這個設定是為了提升性能，理論上沒有[必要性](https://blog.csdn.net/cgExplorer/article/details/107029630)，而且這項設定會導致實驗室框架沒有嚴謹設計的動態連結程式庫裡面被「精簡」化（[IL2CPP強制](https://docs.unity3d.com/Manual/ManagedCodeStripping.html)），以及某些程式並不支援 AOT 模式，最後造成很多 Dependency 和 插件版本 的問題，如果原本專案就是 Mono 設定，建議不要更改並且把 Other Settings >  Managed Stripping Level 調成 Disable
![](https://i.imgur.com/1H9F5BJ.png)


* Android Build 的 Gradle 花式噴錯
    * 問題點太多了，有遇到在問我吧
