我有一些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测试设备上没有任何东西加载。 我似乎在设备上调试时遇到问题所以我只是猜测加载阶段出了问题。
有什么建议吗?
答案 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包中。