如何通过Unity让Oculus Quest 2访问外接驱动器?
问题:Oculus Quest 2打包后无法访问Mac外接驱动器文件
在Mac的Unity编辑器中运行代码可正常访问本地外接驱动器,但打包到Oculus Quest 2设备后,出现文件未找到错误。以下是相关代码和Manifest文件,寻求解决思路或替代方案:
代码片段
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) { Debug.Log("Permission set?"); Permission.RequestUserPermission(Permission.ExternalStorageRead); } string[] args = new string[] { "v", "*path file*" }; if (args.Length > 1 && System.IO.Directory.Exists(args[1])) { directory = args[1]; have_directory = true; Debug.Log("Valid directory specified!"); if (args.Length > 2) { current_frame = int.Parse(args[2]); } } else { Debug.Log("No directory found :("); return; }
Manifest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.UnityTechnologies.com.unity.template.urpblank" android:versionCode="1" android:versionName="0.1.0" android:installLocation="auto"> <uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" /> <application> <meta-data android:name="com.oculus.intent.category.VR" android:value="vr_only" /> <meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2|cambria" /> <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="false" /> <activity android:screenOrientation="landscape" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:configChanges="density|keyboard|keyboardHidden|navigation|orientation|screenLayout|screenSize|uiMode" android:launchMode="singleTask" android:name="com.unity3d.player.UnityPlayerActivity" android:excludeFromRecents="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.INFO" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="com.oculus.permission.READ_VR_DEVICE_PARAMS" /> <uses-permission android:name="com.oculus.permission.SET_VR_DEVICE_PARAMS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest>
解决思路与替代方案
核心问题分析
Oculus Quest 2是独立的Android设备,无法直接访问Mac上的外接驱动器路径。编辑器中能正常运行是因为代码在Mac本地执行,直接读取本地文件系统;打包到设备后,代码运行在Android系统环境下,完全无法识别Mac的文件路径,这是跨设备文件访问的本质限制,和权限无关。
具体解决方案
方案1:将文件转移到Quest设备本地
把外接驱动器中的目标文件复制到Quest 2的内部存储或外接SD卡中,代码中使用Android系统可识别的路径,例如:- 私有存储路径:
Application.persistentDataPath - 公共存储路径:
Android.OS.Environment.ExternalStorageDirectory.AbsolutePath
确保文件放置路径正确后,修改代码中的路径参数为设备本地路径。
- 私有存储路径:
方案2:通过网络共享访问文件
在Mac上将外接驱动器设置为SMB网络共享,然后在Quest的Unity代码中使用UnityWebRequest或HttpClient通过网络请求读取共享文件。注意需要确保Mac和Quest处于同一局域网内,并且共享权限设置正确。方案3:开发阶段临时方案(Oculus Link串流)
如果仅在开发调试阶段需要访问Mac文件,可使用Oculus Link将Quest与Mac连接,直接在Unity编辑器中串流运行项目,此时代码仍在Mac本地执行,可正常访问外接驱动器,但该方案仅适用于开发场景,无法用于发布后的独立设备运行。
代码优化建议
- 移除硬编码的Mac路径,替换为设备可访问的动态路径。
- 当前权限申请逻辑未等待用户授权完成就执行文件检查,可能导致权限未获取就进入错误分支。建议添加授权状态回调或在
Update中轮询授权状态,确认权限获取后再执行文件读取逻辑:IEnumerator CheckPermissionThenAccess() { if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) { Permission.RequestUserPermission(Permission.ExternalStorageRead); yield return new WaitForSeconds(2); // 等待用户操作 while (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) { yield return null; } } // 这里执行文件访问逻辑 }
内容的提问来源于stack exchange,提问作者Sydney Shah
相关产品推荐
相关产品推荐

