参考自:
在移动平台中,一般读取资源会通过下面这三个路径:
1.Resources :
2.Application.streamingAssetsPath(只读)
3.Application.persistentDataPath(同时这个也是可写的):
几个特殊文件夹:
1.Application.streamingAssetsPath(只读) :
需要手动建一个StreamingAssets文件夹。在打包时,Resources文件夹下的东西会被压缩和加密。而StreamingAssets文件夹中的内容则会原封不动的打入包中。
一般在Resources下放预制,StreamingAssets下放二进制文件(csv、bin、txt、xml、json、AB包等)
返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径,工程目录下面的Assets/StreamingAssets。
安卓不能通过File类和FileStream来读取这个路径,只能通过WWW类获取然后用File写到持久化目录。这是因为在Android中,StreamingAssets的东西会被包含在.jar包中(类似于zip压缩文件);IOS和QP8可以用File.Copy。
2.Application.persistentDataPath(可读可写) :File.WriteAllText,File.ReadAllText
安卓只有这个文件夹可以用File类来读写;
返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。移动端可用的保存生成文件的地方。
设备中的公开目录,根据平台的不同而不同。这里面的文件不会因为App升级而删除。
3.Application.dataPath(只读):返回程序的数据文件所在文件夹的路径
4.Application.temporaryCachePath(只读):返回一个临时数据的缓存目录。
移动端的特殊文件夹:
Android:
Application.dataPath
/data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath jar:file://
Application.dataPath !/assets
Application.persistentDataPath /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath /data/data/xxx.xxx.xxx/cache
iOS:
Application.dataPath
Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath
Application.dataPath/Raw
Application.persistentDataPath Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
测试:
游戏开始把StreamingAssets文件复制到持久化目录:
#if UNITY_EDITOR
var dbPath = string.Format(@"Assets/StreamingAssets/{0}", DatabaseName);
#else
// 检测文件在持久化目录下是否存在
var filepath = string.Format("{0}/{1}", Application.persistentDataPath, DatabaseName);
if (!File.Exists(filepath))
{
// 不存在则从StreamingAssets中读取写到持久化目录中
#if UNITY_ANDROID
var loadDb = new WWW("jar:file://" + Application.dataPath + "!/assets/" + DatabaseName); // 安卓下streamingAssets目录
while (!loadDb.isDone) { }
// 写到持久化目录
File.WriteAllBytes(filepath, loadDb.bytes);
#elif UNITY_IOS
var loadDb = Application.dataPath + "/Raw/" + DatabaseName; //IOS下StreamingAssets目录
//保存到持久化目录
File.Copy(loadDb, filepath);
#elif UNITY_WP8
var loadDb = Application.dataPath + "/StreamingAssets/" + DatabaseName;
File.Copy(loadDb, filepath);
#elif UNITY_WINRT
var loadDb = Application.dataPath + "/StreamingAssets/" + DatabaseName;
File.Copy(loadDb, filepath);
#else
var loadDb = Application.dataPath + "/StreamingAssets/" + DatabaseName;
File.Copy(loadDb, filepath);
#endif
引用的案例:
1. using UnityEngine;
2. using System.Collections;
3. using System.IO;
4. using UnityEngine.UI;
5. using System.Text;
6.
7. public class Test : MonoBehaviour {
8.
9. public Text text0;
10. public Text text1;
11. public Text text2;
12. public Text text3;
13. private string path;
14. private string content;
15.
16. void Start ()
17. {
18. //显示不同平台下的路径信息
19. "\n" + Application.streamingAssetsPath + "\n" + Application.persistentDataPath;
20.
21. //读取StreamingAssets下的文件
22. if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)
23. {
24. "file://" + Application.streamingAssetsPath + "/Data/AA.bin";
25. }
26. else if (Application.platform == RuntimePlatform.Android)
27. {
28. "/Data/AA.bin";
29. }
30. "\n" + s + "\n"; }));
31.
32. //读取Resources下的文件
33. "CC").text;
34.
35. //读取与写入Application.persistentDataPath下的文件
36. "/BB.txt";
37. "保佑这个也能读取成功啊~~hello??", Encoding.UTF8);
38. text3.text = File.ReadAllText(path, Encoding.UTF8);
39. }
40.
41. string url, System.Action<string> action)
42. {
43. new WWW(url);
44. return www;
45. //Debug.Log(www.text);
46. action(www.text);
47. }
48.
49. }