Unity3d 在Android上迭代和读取文件夹中的文本文件

Unity3d 在Android上迭代和读取文件夹中的文本文件,unity3d,Unity3d,我在Unity中为android制作了一个文字游戏应用程序,玩家必须从之前加载到游戏中的类别中找到一个文字 我加载类别的方式是: 有一个名为Categories的文件夹,在Assets中,我遍历该文件夹并将每个文本文件作为一个类别读取 类别存储在字典中,其中键是文件名,值是作为数组元素的文件的每一行 它在个人电脑上运行良好,但在安卓系统上却不走运。尝试将路径更改为 “public string categoriesDirectoryPath=Application.persistentDataP

我在Unity中为android制作了一个文字游戏应用程序,玩家必须从之前加载到游戏中的类别中找到一个文字

我加载类别的方式是: 有一个名为Categories的文件夹,在Assets中,我遍历该文件夹并将每个文本文件作为一个类别读取

类别存储在字典中,其中键是文件名,值是作为数组元素的文件的每一行

它在个人电脑上运行良好,但在安卓系统上却不走运。尝试将路径更改为 “public string categoriesDirectoryPath=Application.persistentDataPath+”Categories“;”仍然不起作用

原始路径为“资产/类别”

使用文件值启动字典的代码是(发生在GameManager的唤醒()上):

private Dictionary createCategories(字符串目录路径)
{
字典类别=新字典();
string[]CategoryPath=Directory.GetFiles(directoryPath);
foreach(CategoryPath中的字符串路径)
{
如果(!path.EndsWith(“meta”)){
Debug.Log(路径);
string categoryName=Path.GetFileNameWithoutExtension(Path);
Log(categoryName);
string[]categoryData=File.ReadAllLines(path.ToArray();
添加(categoryName,categoryData);
}
}
退货类别;
}
在构建APK后,是否有方法迭代文件夹并读取资产/类别中的文本文件

有没有一种方法可以迭代文件夹并读取需要的文本文件 在建立APK后是否属于资产/类别

否。

如果要从项目访问,在生成中,有两个选项:

1。将文件放在名为“资源”的文件夹中,然后使用资源读取文件并将其复制到
应用程序。persistentDataPath
路径。通过将其复制到
Application.persistentDataPath
,您可以修改它。“参考资料”中的任何内容都是只读的

2。将该文件放入StreamingAssets文件夹,然后使用
UnityWebRequest
WWW
System.IO.file
API读取该文件。在此情况下,您可以将其复制到
应用程序.persistentDataPath

这是一篇关于如何实现这两个方面的代码示例的文章


3.AssetBundle(由于性能和负载原因,建议使用)

您可以将文件构建为AssetBundle,然后将其放入StreamingAssets文件夹中,并使用
AssetBundle
API读取该文件

是构建和读取资产绑定数据的完整示例

有没有一种方法可以迭代文件夹并读取需要的文本文件 在建立APK后是否属于资产/类别

否。

如果要从项目访问,在生成中,有两个选项:

1。将文件放在名为“资源”的文件夹中,然后使用资源读取文件并将其复制到
应用程序。persistentDataPath
路径。通过将其复制到
Application.persistentDataPath
,您可以修改它。“参考资料”中的任何内容都是只读的

2。将该文件放入StreamingAssets文件夹,然后使用
UnityWebRequest
WWW
System.IO.file
API读取该文件。在此情况下,您可以将其复制到
应用程序.persistentDataPath

这是一篇关于如何实现这两个方面的代码示例的文章


3.AssetBundle(由于性能和负载原因,建议使用)

您可以将文件构建为AssetBundle,然后将其放入StreamingAssets文件夹中,并使用
AssetBundle
API读取该文件


是构建和读取资产绑定数据的完整示例。

我使用相同的方法。它起作用了。如果您在webgl上,您还应该使用WWW从StreamingAssets文件夹读取文件,而ios和pc(mac和linux)可以使用常规文件副本将文件从StreamingAssets文件夹移动到persistentDataPathResources听起来是一个不错的选择,但我不希望指定每个类别(文件),因为它必须是硬编码的。是否可以上载resources文件夹中的所有资源?@RonTang这对所有平台上的resources文件夹都适用,但对某些平台上的StreamingAssets则适用。注意我提到的
UnityWebRequest
WWW
System.IO.File
UnityWebRequest
WWW
现在基本相同,但现在推荐使用
UnityWebRequest
UnityWebRequest
应在Android和WebGL上使用,
System.IO.File
应在其他平台上使用。@Rotang我在回答中提供的链接显示,您可以通过检查路径中是否存在
://
://
@DorMoshe“我不希望指定每个类别(文件)来确定使用哪个类别(文件)因为它必须是硬编码的“然后使用流线型资产”,答案中也提到了这一点。如果您有许多资源数据,我建议您使用AssetBundle,在我的回答中是#3。我使用相同的方法。它起作用了。如果您在webgl上,您还应该使用WWW从StreamingAssets文件夹读取文件,而ios和pc(mac和linux)可以使用常规文件副本将文件从StreamingAssets文件夹移动到persistentDataPathResources听起来是一个不错的选择,但我不希望指定每个类别(文件),因为它必须是硬编码的。是否可以上载resources文件夹中的所有资源?@RonTang这对所有平台上的resources文件夹都适用,但对某些平台上的StreamingAssets则适用。注意我提到的
UnityWebRequest
WWW
System.IO.File
UnityWebRequest
private Dictionary<string, string[]> createCategories(string directoryPath) { Dictionary<string, string[]> categories = new Dictionary<string, string[]>(); string[] categoryPaths = Directory.GetFiles(directoryPath); foreach (string path in categoryPaths) { if (!path.EndsWith("meta")) { Debug.Log(path); string categoryName = Path.GetFileNameWithoutExtension(path); Debug.Log(categoryName); string[] categoryData = File.ReadAllLines(path).ToArray(); categories.Add(categoryName, categoryData); } } return categories; }