Unity路径的相关总结

Unity中的路径变量

变量 属性 使用情景 其他说明
Application.dataPath 只读 应用数据文件夹的路径
Application.streamingAssetsPath 只读 资源跟随App发布时使用 Android下不存在物理文件,不要用System.IO.File 访问
Application.temporaryCachePath 读写 下载临时资源时使用 设备的临时数据缓存目录。存储空间不足时,会被操作系统清理
Application.persistentDataPath 读写 资源热更新时使用 iOS/Android设备中的持久化数据存储目录,可以在此路径下存储一些持久化的数据文件,该目录下的文件不会因为App升级而删除。iOS下注意关闭 iClound 同步,否则可能提审被拒

不同平台下的路径

路径变量 Windows Android iOS
Application.dataPath 应用的路径/appname _Data /data/app/package name-1/base.apk /var/containers/Bundle/Application/app sandbox/xxx.app/Data
Application.streamingAssetsPath 应用路径/appname _Data /StreamingAssets jar:file:///data/app/package name-1/base.apk!/assets /var/containers/Bundle/Application/app sandbox/test.app/Data/Raw
Application.temporaryCachePath C:\Users\username\AppData\Local\Temp\company name\product name Internal Only: /data/user/0/package name/cache External(SDCard): /storage/emulated/0/Android/data/package name/cache /var/mobile/Containers/Data/Application/app sandbox/Library/Caches
Application.persistentDataPath C:\Users\username\AppData\LocalLow\company name\product name Internal Only: /data/user/0/ package name/files External(SDCard): /storage/emulated/0/Android/data/package name/files /var/mobile/Containers/Data/Application/app sandbox/Documents

说明:Android平台下的路径会根据SD卡的访问权限不同而不同。至于iOS有没有类似的情况,由于没有相关设备,暂时没有测试。有条件的朋友可以帮我测试一下,我用5.3.4f1版本的Unity写了个简单的测试程序,项目链接:http://pan.baidu.com/s/1gfqmORh。 欢迎测试反馈,不胜感激!

常用工具方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    /// <summary>
/// 获取不同平台的流式加载路径
/// </summary>
/// <param name="filename">文件名</param>
/// <returns></returns>
public static string GetStreamingFilePath(string filename)
{
string path = "";

if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.OSXPlayer ||
Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)
{
path = Application.dataPath + "/StreamingAssets/" + filename;
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
path = Application.dataPath + "/Raw/" + filename;
}
else if (Application.platform == RuntimePlatform.Android)
{
path = "jar:file://" + Application.dataPath + "!/assets/" + filename;
}
else
{
path = Application.dataPath + "/config/" + filename;
}

return path;
}

/// <summary>
/// 获取不同平台的持久化数据存储路径
/// </summary>
/// <param name="filename">文件名</param>
/// <returns></returns>
public static string GetPersistentFilePath(string filename)
{
string filepath = Application.persistentDataPath + "/" + filename;

#if UNITY_IPHONE
// Set file flag to be excluded from iCloud/iTunes backup.
UnityEngine.iOS.Device.SetNoBackupFlag(filepath);
#endif
return filepath;
}

Resources VS. StreamingAssets

  1. Resources文件夹

Resources文件夹是一个只读的文件夹,通过Resources.Load()来读取对象。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。建议这个文件夹下只放Prefab或者一些Object对象,因为Prefab会自动过滤掉对象上不需要的资源。举个例子我把模型文件还有贴图文件都放在了Resources文件夹下,但是我有两张贴图是没有在模型上用的,那么此时这两张没用的贴图也会被打包到发布包中。假如这里我用Prefab,那么Prefab会自动过滤到这两张不被用的贴图,这样发布包就会小一些了。

  1. StreamingAssets

StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密,不使用点特殊办法是拿不到原始资源的。但是StreamingAssets文件夹就不一样了,它下面的所有资源不会被加密,然后是原封不动的打包到发布包中,这样很容易就拿到里面的文件。所以StreamingAssets适合放一些二进制文件,而Resources更适合放一些GameObject和Object文件。StreamingAssets 只能用过www类来读取!!

参考文献

  1. Unity3D各平台Application.xxxPath的路径
  2. Unity3D移动平台动态读取外部文件全解析
  3. Unity各种路径
  4. Unity官方文档