如何使用unity3d在移动设备上正确加载XML文件

时间:2015-12-10 20:15:53

标签: android ios xml unity3d

我有一些xml格式的级别定义(扩展名为.txt)(没有任何子文件夹)我的项目的rescources文件夹

为了获得更多可伸缩性,我有一个纯文本文件命名所有这些级别定义XML

我使用

读取该文件
TextAsset WorldList = (TextAsset)Resources.Load("WorldList");

然后我加载了所需的世界:

TextAsset TA = (TextAsset)Resources.Load(/*"LevelDefs/" +*/ Worlds[worldToload]);
xps.parseXml(TA.text);
loadLevel(levelToLoad);

(您看到我已将这些资源移出子文件夹以减少它们无法加载的机会) worldToload这里是该世界的索引号

程序在Windows上正常工作但我的Android测试设备上没有任何东西加载。 我似乎在设备上调试时遇到问题所以我只是猜测加载阶段出了问题。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

来自Unity文档:

  

Unity中的大多数资产在构建时都会合并到项目中。   但是,将文件置于正常状态有时很有用   目标机器上的文件系统,使它们可以通过   路径名。一个例子是在iOS上部署电影文件   设备;必须从中的某个位置提供原始电影文件   PlayMovie函数要播放的文件系统。

     

任何放置在Unity项目中名为 StreamingAssets 的文件夹中的文件   将逐字复制到目标计算机上的特定文件夹。   您可以使用 Application.streamingAssetsPath 检索文件夹   属性。使用Application.streamingAssetsPath总是最好的   获取StreamingAssets文件夹的位置,它将始终指向   到应用程序所在平台上的正确位置   运行

所以下面的代码段应该有用:

// Put your file to "YOUR_UNITY_PROJ/Assets/StreamingAssets"
// example: "YOUR_UNITY_PROJ/Assets/StreamingAssets/Your.xml"

if (Application.platform == RuntimePlatform.Android)
{
  // Android
  string oriPath = System.IO.Path.Combine(Application.streamingAssetsPath, "Your.xml");

  // Android only use WWW to read file
  WWW reader = new WWW(oriPath);
  while ( ! reader.isDone) {}

  realPath = Application.persistentDataPath + "/Your"; // no extension ".xml"
  var contents = System.IO.File.ReadAll(realPath);
}
else // e.g. iOS
{      
  dbPath = System.IO.Path.Combine(Application.streamingAssetsPath, "Your.xml");
}

答案 1 :(得分:0)

感谢大卫,我已经解决了这个问题。 为了更精确,我添加一些小细节: 1 - 正如David在他的回答中指出的那样(并且如统一文档中所述),如果我们想要具有相同的文件夹结构,我们应该使用StreamingAssets。应该使用Application.streamingAssetsPath来检索路径。

但是,在android的情况下,文件仍然在apk包中,所以应该使用unity android的www类访问它们。

这里的一个好习惯是创建一个读取文件的方法(如果要读取多个文件,甚至是必需的)

这是一种这样的方法:

private IEnumerator LoadDataFromResources(string v)
{
    WWW fileInfo = new WWW(v); 
    yield return fileInfo;
    if (string.IsNullOrEmpty(fileInfo.error))
    {
        fileContents = fileInfo.text;
    }
    else
        fileContents = fileInfo.error;
}

这是一个协程,要使用它我们需要使用

来调用它
yield return StartCoroutine(LoadDataFromResources(path + "/fileName.ext"));

还有一句话:我们无法写入此文件或修改它,因为它仍在apk包中。