Unity安卓打包Oculus Quest2项目:加载XML并获取文件路径
解决Oculus Quest2打包后Resources中XML文件的路径读取问题
问题核心
Unity打包后,Resources文件夹内的资源会被整合进游戏包体,不存在独立的物理文件路径,因此无法通过常规文件路径API访问。你之前的Resources.Load("IceAttack")未指定资源类型,导致Unity错误识别了XML文件(比如当成Texture2D),所以ToString()返回的是对象类型名而非路径。
解决方案
根据是否能修改GestureIO.ReadGestureFromFile函数,提供两种可行方案:
方案一:修改函数直接读取文本内容(推荐)
直接让GestureIO支持读取文本内容,避免文件IO操作,效率更高:
- 正确加载XML为
TextAsset类型:
TextAsset xmlAsset = Resources.Load<TextAsset>("IceAttack"); if (xmlAsset != null) { // 调用新增的重载方法 trainingSets.Add(GestureIO.ReadGestureFromText(xmlAsset.text)); }
- 在
GestureIO类中添加重载方法:
public static Gesture ReadGestureFromText(string xmlContent) { // 将原ReadGestureFromFile中读取文件的逻辑替换为直接使用xmlContent // 例如原代码中File.ReadAllText(path)的部分,直接传入xmlContent即可 // 后续XML解析逻辑保持不变 }
方案二:写入临时文件后用路径访问(无法修改GestureIO时使用)
将Resources中的XML内容写入可读写的持久化路径,再用临时路径传入函数:
using System.IO; using UnityEngine; // 加载XML资源 TextAsset xmlAsset = Resources.Load<TextAsset>("IceAttack"); if (xmlAsset != null) { // 生成临时文件路径 string tempFilePath = Path.Combine(Application.persistentDataPath, "temp_IceAttack.xml"); // 将XML内容写入临时文件 File.WriteAllText(tempFilePath, xmlAsset.text); // 传入临时路径到函数 trainingSets.Add(GestureIO.ReadGestureFromFile(tempFilePath)); // 可选:用完后删除临时文件 // File.Delete(tempFilePath); }
额外注意事项
- 确保XML文件的Unity导入设置正确:选中XML文件,在Inspector面板将其设置为
Text Asset类型,避免被错误识别为其他资源(如Texture)。 - Oculus Quest2的
Application.persistentDataPath是应用专属的可读写路径,写入临时文件不会有权限问题。 - 若需加载多个XML文件,可使用
Resources.LoadAll<TextAsset>("")批量加载,再通过文件名筛选.xml后缀的资源。
内容的提问来源于stack exchange,提问作者Vav Avagyan
相关产品推荐
相关产品推荐

