参考自:http://blog.csdn.net/lyh916/article/details/52161633
在移动平台中,一般读取资源会通过下面这三个路径:
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(只读):返回一个临时数据的缓存目录。
测试:
游戏开始把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