Unity读取内部、外部资源详解

发表于2018-10-22
评论0 5.8k浏览
Unity读取资源大概分为两部分:一部分为内部资源,什么是内部资源,就是导入unity中的资源,我们称之为Asset,这部分资源unity有现成的管理方法。另外一部分是外部资源,没有导入unity,也不是打包的AssetBundle资源,比方说就是一个txt、png、lua等资源,需要自己去实现读取以及资源的管理。下面就具体点给大家介绍内部、外部资源的读取。

一、内部资源

先说下个平台路径问题:

1.IOS平台
Application.dataPath:Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data可读  
Application.streamingAssetsPath:Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw可读  
Application.persistentDataPath:Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents可读可写  
Application.temporaryCachePath:Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches可读可写  

dataPath是app程序包安装路径,app本身就在这里,此目录是只读的。streamingAssetsPath是dataPath下的Raw目录。

app的独立数据存储目录下有三个文件夹:Documents,Library和tmp。
1)Documents目录,存储需要长期保存的数据,如热更新内容,iCloud会自动备份此目录。

2)Library目录,这个目录下有两个子目录,Caches和Preferences。
  • Caches是一个相对临时的目录,适合存放下载缓存的临时文件,空间不足时可能会被系统清除,Application.temporaryCachePath返回的就是此路径。我把热更新 的临时文件写在这里,等一个版本的所有内容更新完全后,再把内容转移到Documents目录。
  • Preferences用于应用存储偏好设置,用NSUserDefaults读取或设置。

3)tmp目录,临时目录,存放应用运行时临时使用的数据。

2.Android
Application.dataPath:/data/app/xxx.xxx.xxx.apk  
Application.streamingAssetsPath:jar:file:///data/app/xxx.xxx.xxx.apk/!/assets  
Application.persistentDataPath:/data/data/xxx.xxx.xxx/files  
Application.temporaryCachePath:/data/data/xxx.xxx.xxx/cache  
Android这几个路径读取权限和IOS一样,需要注意的就是Application.streamingAssetsPath目录是jar包协议,在unity中需要用www去加载文件,其他的路径可以直接用文件流去读取。

3.Editor
这个就不说了。。。通用的。。。  
关于资源的释放问题,参考Unity内存申请和释放

二、外部资源

再来说说外部资源,外部资源需要遵循ftp 、jar、http、https等协议,具体的拼接需要注意多一个或者少一个“/”的问题,然后用www去加载就行。读取外部资源大部分用到pc上,android、ios等还是扔到persistentDataPath 路径里。具体例子如下:
public Texture2D LoadTexture2D(string path)
{
      string dataPath = "file:///" + path; 
      WWW www = new WWW(dataPath);
        while (!www.isDone)   //同步等待,当然你可以采用协程,自己决定就好
        {
        }
        if (www.error != null)
            return null;
     Texture2D texture = new Texture2D(4, 4, TextureFormat.ARGB32, false); //初始大小随便设置,只要大于1就好,false是不开启mipamaps
     texture.LoadImage(www.bytes);
     //你可以设置一些Texture相关属性,www加载的texture2d是默认的属性
      texture.wrapMode = TextureWrapMode.Clamp;
      www.Dispose();  //断开连接,如果不断开的话,下次就会提示还在占用连接
      return texture;
}
需要注意的就是释放资源,直接用GameObject.DestroyImmediate(texture)或者GameObject.Destroy(texture),这样才能卸载掉内存,外部资源不是一个Asset,unity不会去帮你管理的,这时需要注意内存泄漏问题。
来自:https://blog.csdn.net/a958832776/article/details/70789772

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引