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

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

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。

    Documents目录,存储需要长期保存的数据,如热更新内容,iCloud会自动备份此目录。

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

    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

    这个就不说了。。。通用的。。。
    

关于资源的释放问题,已经有小伙伴详细的解答了,就不啰嗦了,点传送门。
传送门

外部资源

再来说说外部资源,外部资源需要遵循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不会去帮你管理的,这时需要注意内存泄漏问题。

资源释放传送门

个人实践,如有错误欢迎留言交流。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值