笨木头  2015-11-02 07:48     Unity3D     阅读(14166)     评论(6)
转载请注明,原文地址: http://www.benmutou.com/archives/2094
文章来源:笨木头与游戏开发
这周被一个问题给折腾了几个晚上,那就是在Android中读取文件,这本是一件很简单的事情,可想象总是美好的。
 


 
笨木头花心贡献,啥?花心?不,是用心。

转载请注明,原文地址:http://www.benmutou.com/archives/2094

文章来源:笨木头与游戏开发
 

1.在电脑上读取文件

首先要解决的当然是在电脑上读取文件了,这个并不难,网上一堆资料。
比如:
  1. [cce_cs]
    public static string LoadFile(string filePath)
    {
    string url = Application.streamingAssetsPath + "/" + filePath;
    return File.ReadAllText(url);
    }
    [/cce_cs]
 
文件必须放在Assets\StreamingAssets目录下(可以有子目录),否则移植到其他设备后,会无法读取文件的。
这个目录下的文件是只能读不能写的,我的目的也仅仅是读取文件。
Application.streamingAssetsPath会自动根据不同的平台返回该平台下对应的正确路径(Assets\StreamingAssets目录下的文件在不同平台里会保存到不同的路径,所以需要取出正确的路径)。
然后就是使用File.ReadAllText读取整个文件,保存为一个字符串对象。
 

2.在Android上读取文件

在电脑上读取文件很简单,毕竟资料多,而在Android上读取文件就很惨烈了。
也许大家关注的都是Ios吧,唯独我是优先关注Android的。
 
大家可以试试去搜索一下,基本上第一条搜到的就是宣雨松Momo的博客,他写的是【读写文件】的方式(是100%能成功的)。
但是那种方式需要在代码里创建文件,然后再读取文件,而我需要的是读取静态文件,也就是预先创建好的文件。
Momo估计也是比较专注于Ios的,所以他没有进行太多Android的测试。
 
其他搜索的文章也大多在说路径的问题(也就是我第一条标题里所说的内容)。
所以,我不得不发发牢骚,太神奇了,为什么会这么少人关注Android读取的问题呢?
难道这个在API文档里有写?(如果有,请告诉我,我没找到,不知道该用什么关键字)
 
好了,不唠叨了,少是少了点,但还是有资料提到这个问题的。
说解决方案,也确实很简单,在Android里读取文件,得用WWW来读取,如下代码:
  1. [cce_cs]
    public static string LoadFile(string filePath)
    {
    string url = Application.streamingAssetsPath + "/" + filePath;
    #if UNITY_EDITOR
    return File.ReadAllText(url);
    #elif UNITY_ANDROID
    WWW www = new WWW(url);
    while (!www.isDone) { }
    return www.text;
    #endif
    }
    [/cce_cs]
理论上WWW是用来读取网络文件的,而Android上需要用这种方式来读取,让我觉得很奇怪。
也许有更好的方式?如果有,希望能和我分享一下。
 

3.结束

这里有个小地方要注意的,如果你希望把读取的文本按行分割,可以这么做: 
return www.text.Split(new string[] { "\r\n" }, StringSplitOptions.None);


 
要用"\r\n"来分割,而不是"\n",否则会出现乱七八糟的怪问题(别问我是怎么知道的,心疼,不想提)。
 
好了,希望我这篇文章能帮到和我一样被这个问题折腾的人。
 
为了让更多人能够第一时间搜到我的文章,而不是那些无法对这个问题提供帮助的文章,我额外列一些关键字:
Unity 读取Android文件
Unity 读取安卓文件
 
The End。
 
6 条评论
  • 多多 2021-07-05 23:35:58

    我用的19.4版本,也碰到了电脑读取正常,手机读取csv文件失败,不知道是不是同一问题,明天试下
    0回复
  • AJ 2018-12-29 15:25:17

    这个读的是txt文件吗,我用的是json的文件,貌似没有效果,www.size打印出来是0,不知道是怎么回事,路径方面都是对的,是不是还得去转一层json?
    0回复
    • 博主 笨木头 2019-01-02 17:17:04

      txt和json都没有影响,毕竟都是文本,我现在也是用这个方式读取的,都挺正常的,所以不太清楚你的问题出在哪里...
      0回复
  • aaa 2016-05-24 13:23:19

    太感谢,我也碰到这个问题
    0回复
  • lcllcl 2015-12-28 06:28:29

    的确,
    之前想个播放歌词东西也碰到这个问题,哈哈。。
    unity 教程有含金量的教程相对少啊,木头写多点呗
    0回复
    • 博主 糟糕_树叶的mut 2015-12-28 08:49:51

      [害羞]最近比较忙,我又有好长时间没折腾unity了
      0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发