1. 项目概述
被PICO开发环境折腾过的人,应该都懂那种绝望:装Unity、装Android SDK、配JDK、配NDK、Gradle版本对不上、ADB连不上设备、好不容易编译通过,一运行又报“Unable to find Unity”……
这套环境光靠手动配置,新人不折腾个两三天根本下不来。尤其是PICO 4和PICO 4 Pro发布之后,越来越多做Unity开发的朋友想把手里的应用搬到VR设备上,结果卡在最开始的环节。所以我整理了一套一键配置脚本,把PICO Unity开发环境的搭建过程全部自动化,顺带把PDC串流调试的坑也一并填掉。
这个项目解决的核心问题,是把原本需要手动完成的Android工具链安装、JDK/NDK路径设置、Gradle配置、PICO SDK导入、Unity项目初始化、PDC设备调试连接,压缩成一条命令的事情。适合以下几类人看:
- 第一次用PICO做Unity开发的初学者,没有接触过VR设备开发
- 被Android Studio、SDK、NDK这些工具链折磨过的Unity开发者
- 需要频繁在多台电脑之间切换开发环境、每次都要重配环境的老手
- 想用PDC做真机串流调试、看日志、抓性能数据的开发者
不需要你有多深的Android底层知识,也不用你精通命令行。我会把每一步的原理、为什么这么做、踩过的坑全写清楚。
2. 手动配置到底烦在哪:一份PICO开发环境的完整依赖链
2.1 那串让人头大的环境依赖
先说结论:PICO应用的Unity开发,本质上是在Unity编辑器里写一套交互逻辑,然后把它编译成一个能在Android系统上运行的APK包,再安装到PICO头盔里运行。PICO头盔的系统底层是Android,所以不管你用什么版本的Unity,最终都绕不开一条完整的Android工具链。
这条链上至少有这么几样东西:
- JDK(Java Development Kit):Unity构建Android APK时的编译工具,PICO开发需要使用JDK 17或JDK 11,具体看Unity版本要求。Unity 2022 LTS默认支持JDK 11,Unity 2021.3也可以。太新太老都会出问题。
- Android SDK(含Platform-Tools、Build-Tools):Android开发的基础开发包,提供adb、aapt、d8等构建和调试工具。PICO设备连接电脑、安装APK都靠这里面的adb命令。
- Android NDK:用C/C++写原生插件时才需要,但如果你的项目里有用到某些第三方SDK(比如一些空间感知、手势追踪插件),它就会强制要求安装。
- Gradle:Unity官方推荐直接用Unity内置的Gradle版本,但它需要联网下载依赖,网络不好就卡死。
- PICO Unity SDK(com.unity.xr.openxr.pico):PICO官方封装的Unity XR插件和SDK包,通过Unity Package Manager导入。
- PDC(PICO Developer Connection):PICO官方的设备连接与调试工具,用于PC和PICO头盔之间的串流、日志抓取、文件传输。
这一串东西单独看,每一个都有各自的安装包、版本号、路径要求。手动配置时最大的痛苦点在于:它们之间是互相咬合的关系。JDK版本不对会导致Unity无法解析Gradle,SDK路径没配对会导致“SDK not found”,NDK缺失会导致原生插件编译失败……而且这些报错信息往往不直接,经常是构建到一半才蹦出来。
2.2 官方文档再全,也架不住“版本对不上”
PICO官方其实提供了很详细的开发者文档,从注册开发者账号到下载SDK都有写,但实际操作起来,还是会踩到几个文档里不容易覆盖的坑。
第一个坑是Unity版本兼容问题。PICO官方SDK对Unity版本有明确要求,Unity 2021.3 LTS、Unity 2022.3 LTS是官方明确支持的版本。但Unity Hub默认安装的可能是乱七八糟的版本,很多人直接装2023、2024版本,然后导入PICO SDK时发现XR插件无法识别、渲染管线冲突。Unity版本过低也麻烦,比如Unity 2020及以下连OpenXR标准支持都有问题。
第二个坑是Android SDK的获取方式。国内开发者不像国外那样能顺畅访问Android官网,SDK下载本身就是一道坎。网上鱼龙混杂的SDK下载链接,还有各种所谓的“SDK懒人包”,里面有没有夹带私货谁也不知道。
第三个坑是路径和环境的匹配。哪怕你手动装好了Android SDK,Unity和PDC工具也得能找到它。Android Studio的默认SDK路径通常在“%LOCALAPPDATA%\Android\Sdk”,但一些下载的SDK解压包路径可能完全不一样。Unity的“Preferences → External Tools”里需要手动指定SDK路径,PDC工具也需要能找到adb。这里只要哪一步路径填错了,就会提示找不到设备或者无法构建。
我最早给公司的三台电脑配环境,每台都花了一下午。后来实在忍不住了,把整个流程拆成脚本,才有了这套“一键配置”方案。
3. 一键配置方案的整体设计思路
3.1 方案选型:为什么选择PowerShell一键脚本而不是手动逐一安装
决定写一键配置之前,我列了几个可选方案,分别评估过可行性:
第一种是做一个Docker镜像,把SDK、NDK、Gradle都封装进去。这个方法对Web开发很友好,但Unity本身是GUI编辑器,在Windows下装在容器里意义不大,而且Unity对GL渲染、USB设备透传都要求宿主机原生支持,容器方案直接把PDC串流调试搞复杂了。
第二种是直接给一份“手动安装清单”,让用户照着点。这个方案等于没做,因为核心痛点恰恰是人容易点错。
第三种就是写一套Windows PowerShell脚本,通过自动化检测、自动下载、自动配置的方式,把整个环境的搭建变成“按键式”操作。优点很明显:
- 不需要额外的运行时依赖,Windows 10/11自带PowerShell
- 可以做到可重复执行,跑错了再跑一遍就行
- 跟Unity Editor和Android工具链的原生接口能直接对接
这套方案在Windows上是最省心的。如果你用的是macOS,其实也差不多,只是脚本语法要换成bash,本质逻辑是一样的。
3.2 一键配置到底配置了哪些东西
写脚本之前,我先把“手动配置”的每个操作梳理成了表格,然后逐一自动化:
| 手动操作 | 脚本自动化对应手段 |
|---|---|
| 安装JDK并配置JAVA_HOME环境变量 | 检测系统是否已有JDK,没有则自动下载Zulu JDK 17,写入系统环境变量 |
| 下载并解压Android SDK命令行工具 | 从Google官方源下载commandline-tools,自动完成sdkmanager初始化 |
| 通过sdkmanager安装Platform-Tools、Build-Tools、Platform | 执行sdkmanager --install,自动拉取指定版本 |
| 在Unity里手动指定SDK/JDK/NDK路径 | 脚本直接写入Unity的EditorPreferences,或者自动生成一个“首次启动引导” |
| 下载PICO Unity SDK包并导入项目 | 自动从本地或局域网源拷贝UPM包(.tgz),在Unity的manifest.json中注册依赖 |
| 配置Gradle的国内镜像源 | 自动在Unity安装目录里写入Gradle自定义init脚本,把仓库换成国内镜像 |
| 连接PICO设备并开启PDC串流 | 自动安装PDC驱动,执行pdc connect wifi或USB连接 |
这里有个关键点值得说一下:Unity的路径配置,它在Windows下是写进注册表的,路径是“HKEY_CURRENT_USER\Software\Unity Technologies\Unity Editor 5.x”。如果你用Unity Hub管理多个版本,那每个版本还有独立配置。脚本可以直接改注册表,省得每次都手动填。
不过,如果条件允许,我还是建议通过Unity Hub安装并让Unity Hub来管理SDK/JDK/NDK,因为Unity Hub在构建时能自动关联工具链。一键配置脚本虽然也能把路径写进Unity注册表,但Unity版本不同,注册表结构有细微差别,脚本里需要对每个版本做兼容处理。
3.3 安全性考量:为什么自动下载要做版本校验
写脚本过程中,我还做了一个额外加固——对下载的JDK和SDK压缩包做SHA-256校验。原因是我在测试时发现,某些下载源可能会返回损坏的文件,或者更严重的,被篡改过的安装包。自动配置工具如果直接从某个不明来源下载工具链,风险不小。
所以脚本里的下载逻辑是:从可信域名下载,校验哈希,不匹配直接删除重新来。如果你在技术社区里看到类似的一键配置脚本,一定也要留意它有没有做这一步,这是实用脚本和坑人脚本的分水岭。
4. 实操全过程:从空机器到能跑PICO模拟器
4.1 前置准备:需要先装好什么
建议先装好这两个东西:
Unity Hub和Unity 2022.3 LTS。PICO官方推荐2022.3 LTS,它既稳定又支持OpenXR标准。安装Unity时勾选“Android Build Support”,以及其中的“SDK Tool”和“NDK Tool”模块——这里如果用Unity Hub勾选了,绝大多数Android工具链Unity Hub会直接帮你管理好。但这里有个取舍:Unity Hub内置的SDK版本往往不是最新的,而且后续不太好做自定义配置。如果追求省心,用Hub的;如果想完全掌控版本,用脚本装一套独立的。
PICO开发者账号。需要在PICO官网注册开发者账号,才能从官网开发者社区下载PDC工具和PICO Unity SDK包。这个注册是免费的,但需要你实名认证一下。
4.2 一键配置脚本的核心逻辑
下面是我这套脚本的简化版本,用PowerShell实现,核心逻辑拆解一下你就能明白它做了什么:
# PICO-Unity-Env-Config.ps1 # 功能:自动检测/下载/配置PICO Unity开发环境 $ErrorActionPreference = "Stop" # ---------- 配置区(按实际需求修改) ---------- $UnityVersion = "2022.3.20f1" $SdkManagerUrl = "https://dl.google.com/android/repository/commandlinetools-win-11076708_latest.zip" $ZuluJdkUrl = "https://cdn.azul.com/zulu/bin/zulu17.44.15-ca-jdk17.0.8-win_x64.zip" $PicoSdkLocalPath = "D:\Downloads\com.unity.xr.openxr.pico-2.3.0.tgz" $ExpectedJdkHash = "d4d2cc0a3e3028e8b8c8a1588c4f7e2f" $ExpectedSdkHash = "994eb1f6e2d0ef37bec7a5b8dcb3a219" # ---------- 1. 检测并安装JDK ---------- function Install-JDK { if (Test-Path "HKLM:\SOFTWARE\JavaSoft\JDK") { Write-Host "[1/4] JDK已存在,跳过安装" -ForegroundColor Green return } Write-Host "[1/4] 检测不到JDK,开始安装Zulu JDK 17..." Invoke-WebRequest -Uri $ZuluJdkUrl -OutFile "$env:TEMP\zulu17.zip" $actualHash = (Get-FileHash "$env:TEMP\zulu17.zip" -Algorithm SHA256).Hash if ($actualHash -ne $ExpectedJdkHash) { throw "JDK下载文件校验失败,请检查网络或镜像源" } Expand-Archive "$env:TEMP\zulu17.zip" -DestinationPath "C:\PicoDev\" # 设置JAVA_HOME [Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\PicoDev\zulu17.44.15-ca-jdk17.0.8-win_x64", "Machine") } # ---------- 2. 安装Android SDK命令行工具 ---------- function Install-AndroidSdk { $sdkPath = "C:\PicoDev\AndroidSdk" if (Test-Path "$sdkPath\platform-tools\adb.exe") { Write-Host "[2/4] Android SDK已存在,跳过下载" -ForegroundColor Green return } Write-Host "[2/4] 下载Android commandline-tools..." Invoke-WebRequest -Uri $SdkManagerUrl -OutFile "$env:TEMP\sdk-tools.zip" $sdkHash = (Get-FileHash "$env:TEMP\sdk-tools.zip" -Algorithm SHA256).Hash if ($sdkHash -ne $ExpectedSdkHash) { throw "Android SDK下载文件校验失败" } # 新建目录结构:commandlinetools 需要放在 <sdk>/cmdline-tools/latest/ New-Item -ItemType Directory -Path "$sdkPath\cmdline-tools\latest" -Force Expand-Archive "$env:TEMP\sdk-tools.zip" -DestinationPath "$sdkPath\cmdline-tools\latest" -Force # 通过sdkmanager安装关键组件 $sdkManager = "$sdkPath\cmdline-tools\latest\bin\sdkmanager.bat" & $sdkManager "platform-tools" "platforms;android-33" "build-tools;33.0.1" "ndk;25.2.9519653" } # ---------- 3. 把SDK/JDK路径写入Unity注册表 ---------- function Configure-UnityPaths { Write-Host "[3/4] 写入Unity工具链路径..." $regBase = "HKCU:\Software\Unity Technologies\Unity Editor 5.x" if (-not (Test-Path $regBase)) { New-Item -Path $regBase -Force } Set-ItemProperty -Path $regBase -Name "SdkRoot" -Value "C:\PicoDev\AndroidSdk" Set-ItemProperty -Path $regBase -Name "JdkRoot" -Value $env:JAVA_HOME Set-ItemProperty -Path $regBase -Name "NdkRoot" -Value "C:\PicoDev\AndroidSdk\ndk\25.2.9519653" } # ---------- 4. 导入PICO SDK到Unity ---------- function Import-PicoSdk { param([string]$targetProjectPath) Write-Host "[4/4] 导入PICO SDK..." # 将PICO SDK包加入项目Packages/manifest.json $manifestPath = "$targetProjectPath\Packages\manifest.json" if (-not (Test-Path $manifestPath)) { throw "目标路径不是有效的Unity项目" } $manifest = Get-Content $manifestPath -Raw | ConvertFrom-Json $manifest.dependencies | Add-Member -Name "com.unity.xr.openxr.pico" -Value "file:D:\Downloads\com.unity.xr.openxr.pico-2.3.0.tgz" -MemberType NoteProperty $manifest | ConvertTo-Json -Depth 10 | Set-Content $manifestPath -Encoding UTF8 Write-Host "完成!现在用Unity打开这个项目就会自动导入PICO SDK" -ForegroundColor Green } # 执行 Install-JDK Install-AndroidSdk Configure-UnityPaths Import-PicoSdk -targetProjectPath $args[0]这段代码去掉了很多容错分支,但主干思路就是上面四个步骤。其中有两个地方需要注意:
cmdline-tools的目录结构是个大坑。Android官方的commandline-tools下载包,解压后目录名是cmdline-tools,但sdkmanager会检测它所在的相对路径,必须放在$SDK_ROOT/cmdline-tools/latest/下才算正确。如果你解压错位置了,sdkmanager会报“sdkmanager not found”的错,而且这个错特别迷惑人。
Gradle网络问题。Unity在构建时会从Google和Maven Central拉取依赖,国内网络经常超时。解决方案是在Unity安装目录的Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates里加一个init.gradle文件,把仓库源指向阿里云或腾讯云的镜像。路径因Unity版本略有差异,但大致不差。
4.3 运行配置后的最终验证
配置完,先用一个最简单的Unity 3D项目验证环境是否正常:
- 创建一个新的Unity 3D项目,记得在Project Wizard的侧边栏里,把“Hands Manager”和“XR Plugin Management”相关选项勾上。
- 打开“Window → Package Manager”,确认“PICO Unity OpenXR Plugin”已在列表里且没有报错。
- 打开“Project Settings → XR Plug-in Management”,切到“Android”标签页,勾上“PICO”。
- 随便在场景里放一个Cube,然后切到Android平台,点击Build And Run。如果这一套流程走下来,APK能成功安装到PICO设备上并运行,说明一键配置环境是通的。
我知道有些人习惯先用手柄看一个空白场景,但最稳的验证方法还是“Build And Run”走一遍。编译过程如果通过了,之后的开发基本都是小问题了。
5. PDC串流调试从入门到常用
5.1 PDC是什么,和ADB有什么区别
PDC全称是PICO Developer Connection,是PICO官方提供的设备连接与调试工具。它本质上是一套基于ADB的增强版工具,但做了一些VR开发场景下的专门适配。
最典型的区别是:ADB连接设备后,你只能拿到一个Linux shell,执行常规的Android命令;而PDC工具里内置了Unity开发高频使用的功能,比如一键启动/结束Unity应用、抓取Unity的日志输出、查看帧率、读取头盔设备信息、修改系统配置等。PDC还带一个图形界面管理窗口,可以显示已连接的设备列表。
对我们日常开发来说,最常用的功能其实是两个:串流应用(把头盔画面投到电脑屏幕)和抓取日志。前者是你做VR开发时调试画面最直观的方式,后者是定位代码问题最快的路径。
5.2 有线/无线连接方式与常用命令
连接方式分两种:
USB有线连接。第一次连接需要在PICO头盔里开启“开发者模式”——设置 → 通用 → 关于本机 → 连续点击“版本号”7次,打开“开发者选项”,再在“开发者选项”里把“USB调试”开关打开。然后用USB线连接电脑,如果电脑弹出“安装驱动”提示,注意一定要装PICO官方驱动,否则识别不出来。
连接成功后,PDC工具里会显示设备状态。注意:某些电脑C口供电不足,会导致头盔连上后反复断开重连,这时候换USB口或者换双头C口的线能解决。
Wi-Fi无线连接。无线串流是开发调试中我最推荐的方式,省去理线的麻烦。执行pdc connect wireless后,它会帮你自动搜索同一局域网内已开启无线调试的PICO设备,配好后就可以拔掉USB线了。
常用命令我整理成了表格:
| 命令 | 功能 |
|---|---|
pdc devices | 查看当前连接的设备 |
pdc getprop ro.product.model | 获取设备型号 |
pdc push local_file remote_path | 把文件从PC推送到设备 |
pdc pull remote_path local_file | 从设备拉取文件到PC |
pdc install app.apk | 纯命令行安装APK |
pdc uninstall com.example.app | 卸载应用 |
pdc connect wireless | 开启/连接无线调试 |
pdc logcat -s Unity com.picoxr.unity | 实时查看Unity日志 |
pdc shell am start -n com.example.app/com.unity3d.player.UnityPlayerActivity | 启动应用 |
无线调试第一次连接时,需要头盔和电脑都在同一个局域网,且头盔屏幕上会弹出一个配对确认框,要在头盔上点确认。每次重启头盔后可能需要重新配对,这个是正常现象,不用慌张。
这里有个我在真实项目中总结的经验:如果pdc devices能看到设备,但安装APK时提示“device unauthorized”,把USB调试关掉重开一下,然后重新插线,99%能解决。这个问题本质是设备的RSA指纹没有正确授权。
6. 常见问题与排查技巧实录
6.1 高频报错速查表
我把这几个月来在社区里看到的、加上自己踩过的坑,整理成了一张速查表:
| 报错信息 | 根因 | 解决方案 |
|---|---|---|
| “SDK location not found” | Unity没有找到Android SDK路径 | 确认Unity Preferences里的SDK路径是否和实际安装路径一致,或者重新执行一键配置脚本 |
| “CommandInvokationFailure: Gradle build failed” | 通常是因为Gradle构建时下载依赖失败 | 给Unity用的Gradle加上国内init.gradle镜像,或者检查网络代理设置 |
| “element is not allowed here” | AndroidManifest合并失败 | 清除项目的Library/Bee目录,重新构建 |
| “Could not find manifest.xml” | Unity的Project Settings里没有正确配置应用包名 | 在Player Settings里设置一个唯一的包名,比如com.yourcompany.yourappname |
| “Failed to load input configuration settings” | PICO SDK的Input System未启用 | 到Project Settings → Player → Active Input Handling里切换为“Both”或“Input System Package” |
| “PICO XR Plugin initialization failed: Render Texture not found” | 项目使用了不支持的渲染管线 | 确认使用的是内置渲染管线(Built-in Render Pipeline),UWRP需要额外配置后才行 |
| “Unable to install on the device” | adb没有权限访问设备 | 到开发者选项里撤销USB调试授权,重新插线并授权 |
| “this device is currently not available for wireless debugging” | 之前连接过,但设备IP发生变化 | 在PDC工具里手动删除旧设备重新配对,或者重启无线开关再试 |
6.2 几个血泪教训
第一,非对称渲染(Single Pass Instanced)一定要开。在PICO SDK的渲染设置里,把Render Mode从默认的“Multi Pass”切换为“Single Pass Instanced”,画面帧率直接翻倍,这个优化对VR项目刚需中刚需。但要注意的是,开启这个模式以后,如果你的Shader里用了screenPos相关的计算,需要检查是否兼容。
第二,依赖冲突是高发问题。PICO Unity SDK本身带了一部分OpenXR实现,如果你的项目里同时导入了OpenXR Plugin、XR Interaction Toolkit、还有PICO SDK,当版本不匹配时,会有各种诡异问题。我遇到过的症状是:手柄按键完全没反应、画面只有单眼渲染、Unity直接崩。这些情况下,优先检查XR Plugin Management里是否勾选了多个Provider。
第三,不要装Android Studio“全家桶”。很多教程说要装Android Studio,其实做PICO Unity开发根本不需要Android Studio本体,只需要里面的SDK组件和命令行工具。装了Android Studio反而容易把路径搞乱,尤其在同时使用Unity和Android Studio的时候,SDK Manager版本互掐的案例比比皆是。
第四,PDC工具和Unity的adb版本不一致会导致“看不到设备”。这个问题很隐蔽,Unity安装包内置了一份adb,PDC工具用的是自己目录下的adb,当设备固件版本更新后,旧adb识别不了新设备是常事。解决办法很简单:手动把PDC目录下较新的adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll复制到Unity的SDK platform-tools目录里,覆盖掉旧版本。
7. 写在最后
这套一键配置方案我在PICO 4、PICO 4 Pro、还有一台Windows 10和一台Windows 11的电脑上跑过,除了个别网络波动导致的下载中断之外,基本没有翻过车。每次我都推荐身边用Unity开发PICO项目的团队也这么搞,因为省下的不是半小时一小时的零碎时间,而是一整段不用被环境问题打断的开发节奏。
最后分享一个我的习惯:每次环境配置完之后,我会把Unity的Editor.log和Build日志都导出一份放进项目根目录的Docs/文件夹里。这样以后遇到问题,可以快速对比“上次正常构建时用的哪个参数”,排查效率会高很多。如果你也正在被PICO开发环境折腾,希望这篇文章能帮你少走几步弯路。