总体判断
旧版 VR 项目虽然已带 XR Origin,但仍混有不少桌面端实现(Win32 文件选择框、鼠标触摸输入、手动多相机切换等)。参考项目 AVersatilePointCloudProcessingPlatform 代码结构更清晰,但本质是普通桌面 3D 项目,包含 Windows 桌面 API、StandaloneFileBrowser、外部进程调用、屏幕像素布局等。
迁移策略不是整段复制,而是:
- 保留实验业务逻辑:质量评价、JND 判断、点云读取、结果记录。
- 替换桌面交互层:文件选择、弹窗、鼠标控制、窗口按钮。
- UI 与模型交互接到 VR 体系:World Space Canvas、
XRUIInputModule、TrackedDeviceGraphicRaycaster、NearFarInteractor、Input Actions。
不适用项与解决方案
P0:必须先替换
| 不适用项 | 为什么不适合 VR | 建议解决方案 |
|---|---|---|
Windows 原生文件/保存对话框(Comdlg32.dll、LocalDialog.GetOpenFileName、StandaloneFileBrowser.OpenFilePanel / SaveFilePanel) |
依赖 Windows 桌面窗口。Oculus 头显或 Android 平台无法使用,PCVR 也会打断沉浸感 | 抽象 IPathPicker。当前保留世界空间输入框手动填写路径;下一阶段做 VR 内文件 / 目录选择面板;仅 PCVR 时可用 #if UNITY_STANDALONE_WIN && !UNITY_ANDROID 临时实现 |
Win32 MessageBox 与桌面退出确认(Win32API.ConfirmMessageBox + Application.Quit(0)) |
VR 中没有传统桌面弹窗;弹出系统窗口会脱离头显交互;强制退出不利于实验恢复 | 做 World Space AlertPanel / ConfirmPanel,用 XR 射线点击按钮。退出逻辑优先改成"返回 Home 场景"或"结束实验并保存" |
鼠标、触摸、旧 Input 输入(Input.GetMouseButtonDown、Input.mousePosition、Mouse ScrollWheel、Input.GetTouch、MouseTouchController、ModelViewerControl) |
VR 主要输入来自头显、左右手柄、射线、抓取、扳机键和摇杆。鼠标/触摸逻辑不能代表 VR 操作 | 用 XR Interaction Toolkit 的 Input Actions;交互器改 NearFarInteractor |
P1:尽快替换
| 不适用项 | 为什么不适合 VR | 建议解决方案 |
|---|---|---|
路径策略:硬编码 D:\...、f:\ 等 Windows 路径 |
VR 项目要能部署到 Quest 等 Android 设备;路径策略必须可移植 | 用 Application.persistentDataPath + PathPicker 抽象;配置文件 / 用户数据落到该路径下 |
结果保存:直接写 Application.dataPath 或本地 C:\ |
Android 平台无写权限;实验数据丢失风险 | 实验数据走 Application.persistentDataPath;如需导出,再走显式导出流程 |
外部进程调用(System.Diagnostics.Process 启动 FFmpeg、点云工具) |
Quest / Android 不支持;进程管理与状态读取都不一致 | 改用 Unity 内的等价实现(FFmpegNative、PointCloudNative);必要时后台服务化 |
模型加载:File.ReadAllBytes + 同步 IO |
大文件加载卡帧;Android 上更明显 | 改 UnityWebRequest / async/await + 进度反馈 |
VR 配置输入体验:ConfigPanel 等用 Input.GetKey 做快捷键 |
VR 中无键盘;快捷键失效 | 把"快捷键"换成"扳机 + 手柄按键组合";或保留 PCVR 调试模式 |
P2:最后清理
| 不适用项 | 说明 |
|---|---|
旧事件引用(UnityAction、UnityEvent 直接挂载旧 MonoBehaviour) | 老项目习惯在新项目里要把这些迁移到 XRI 的 UnityEvent 钩子 |
协程重构(StartCoroutine + WaitForSeconds 满天飞) | 逐步换 async/await 或 UniTask;更易取消 |
点云渲染性能:每个点 GameObject | 改 Graphics.DrawMeshInstancedIndirect / ComputeShader |
| 实机舒适距离:模型离用户太近 | 检查最小可视距离 ≥ 0.5m;HUD 元素远离 IPD |
建议解决顺序
- P0:World Space UI、
XRUIInputModule、Win32 弹窗替换、桌面文件选择替换、旧输入替换。 - P1:路径策略、结果保存、外部进程剥离、模型加载策略、VR 配置输入体验。
- P2:旧事件引用清理、协程重构、点云渲染性能、实机舒适距离。
下一步建议
建议先做通用 VR 弹窗系统 VRAlertPanel,替代旧项目和参考项目的 AlertManager、Win32API.MessageBox 与 Debug.Log 提示。这个组件完成后,质量评价和 JND 两个场景的校验错误、路径为空、实验结束提示都可以统一接入。
第二步做路径选择策略:短期保留输入框和默认路径;中期加一个 VR 内部配置预设列表;长期再根据实际部署平台决定是否做完整 VR 文件浏览器。