Resources:
 
Resources的缺点:1.与显示Inspector上直接引用相比,Resources使用不方便.
    2.不管你Resources上的资源是否调用了,当你发布的时候,Resources上的资源会全部一起打包掉,无法作更新.
 
Resources里的方法:
Resources.Load :动态加载特殊文件夹Resources里的文件.
Resources.UnloadAsset:回收指定的缓存.
Resources.UnloadUnusedAsset:回收没有被引用的缓存
 
这里加点额外东西,如果保存东西到Resources文件夹,而Resources文件夹不存在保存时候会报错,所以要添加预防机制(不仅这里用,还可以延伸到许多方面):
首先引用System.IO和UnityEditor 前者是Directory需要,后者是AssetDatabase需要     
        string filePath = Application.dataPath + "/Resources";
        if (!Directory.Exists(filePath)) //检测Resources文件夹是否存在
        {
            AssetDatabase.CreateFolder("Assets","Resources"); //创建Resources文件夹
        }
   GameObject go = 随便;
   AssetDatabase.CreateAsset(go,"Assets/Resources/go.prefab");//创建文件go
   AssetDatabase.Refresh(); //刷新一下
 
AssetBundle:

AssetBundle可以把你所需要用的文件(音乐,纹理,模型,prefab,场景)用特殊的文件格式导出(.unity),在适当的时候再导入这些文件.

在一些大型游戏里面,一个场景里面的内容非常的多,如果一下子全部加载完可能要等很长的时间,玩家等读条读完都想睡了.我们可以先读取附近的内容,进去后再慢慢读取其他内容,这样可以有效利用内存资源.动态加载资源可以用AssetBundle,Resources.Load().
 
AssetBundle最初的设计目的好像是为了简化游戏更新.
 
AssetBundle可以打包任何Unity能够识别的文件,由文件格式决定.如果你想要打包任何自定义的二进制文件,你要把后缀名改为".bytes".Unity会把他们打导成TextAssets
 
有创建资源包的方式:
unity5:在Inspector的最下方
然后调用函数BuildPipeline.BuildAssetBundles()就行了.他会根据依赖关系自动打包.
但有一个非常深的坑:他不会给你自动判断哪些资源是公用的,也就是你有2个文件同时使用同一个Texture,但你这个Texture没有设置AssetBundle他会重复打印1次.
用这种打包方法下面MOMO的方法也无法用了,因为AssetBundle.CreateFromFile不能加载压缩过的AssetBundle.
 
具体用法:
[MenuItem ("Assets/Build AssetBundles")]
static void BuildAllAssetBundles ()
{
BuildPipeline.BuildAssetBundles ("AssetBundles");
//BuildPipeline.BuildAssetBundles ("Assets/AssetBundles");
//这个方法其他重载的参数与旧版没差
}
要先在项目文件夹里创建AssetBundles这个文件夹.注意是项目文件夹而不是Assets里,这是官方代码,为了方便我请倾向于改成注释的样子.AssetBundles中,会出现2种文件格式,1.是没有后缀的,2.是后缀是.manifest.
没有后缀的是代表项目的依赖关系,有后缀名的用txt打开可以看到其资源依赖关系和crc.
 
旧版:
(需要注意的方式1,3为了不同平台打包的文件是不通用的)
1.BuildPipeline.BuildAssetBundle :可以构建任意类型的资源包
public static function BuildAssetBundle(mainAsset: Object, assets: Object[], pathName: string, out crc uint, assetBundleOptions:BuildAssetBundleOptions, targetPlatform: BuildTarget): bool;
直接拿个最长的来作参数解释 :  
mainAsset:打包的单个文件.  assets:打包的文件组. pathName:存放地址 
out uint crc:输出一个参数作为检测更新使用,当使用WWW.LoadFromCacheOrDownLoad函数的时候可以使用此参数. 
assetBundleOptions:特殊选项,可以输入0(没有特殊选项).  targetPlatform : 选择该包要使用的平台
    [MenuItem("Test/Create AssetBundles")]
    static void CreateAssetBundle()
    {
//选择保存文件的途径
        string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "assetbundle");
 
        if (path.Length != 0)
        {
   //Project里选中的文件
            Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
 //这里第1参数和第2参数好像重复了,第1参数填null完全没影响.官方代码也不能尽信...
            BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path);
            Selection.objects = selection;
        }
    }
2.BuildPipeline.BuildStreamedSceneAssetBundle:只打包场景.
3.BuildPipeline.BuildAssetBundleExplicitAssetNames:和BuildPipeline.BuildAssetBundle差不多,只是多了参数自定义每个物体的名字.
方式2,3用法和方式1差不多.
 
读取资源包:
最好的例子就是官方例子了,很详细.
假如我把打包文件放到Resources里,文件名叫a.unity3d
 
void Start(){
//在不同的平台上,路径是不同的,这个需要注意
public static readonly string path = 
#if UNITY_ANDROID 
"jar:file://" + Application.dataPath + "!/assets/"; 
#elif UNITY_IPHONE 
Application.dataPath + "/Raw/"; 
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR 
"file://" + Application.dataPath + "/StreamingAssets/"; 
#else 
     string.Empty;  
#endif
StartCoroutine(LoadAssetBundle(path + "a.assetbundle"));
}
 
IEnumerator LoadAssetBundle(string path) {
        //根据参数1(服务器或本地下载地址)和参数2(版本号)查找AssetBundle.如果本地找不到就会从服务器下载(即更新版本)
        WWW www = WWW.LoadFromCacheOrDownload(path, 1);
 
        // Wait for download to complete
        yield return www;
 
        // 读取AssetBundle
        AssetBundle bundle = www.assetBundle;
  //加载
        Object obj1 = bundle.LoadAsset("GameObject");
 
        // 释放bundle的缓存
        bundle.Unload(false);
 
        // 停止下载,释放缓存
        www.Dispose();
    }
 
www是一个简单的访问网页的类.通过连接WWW(url)在后台开始下载,并且返回一个新的WWW对象。你可以检查isDone属性来查看是否已经下载完成,或者yield自动等待下载物体,直到它被下载完成(不会影响游戏的其余部分)。
 
在Momo的博客上,建议不要再用WWW.LoadFromCacheOrDownload.因为有更好的方法.完美转发MOMO原文.链接在最后

因为是异步方法,而且还占用内存。

强烈建议使用AssetBundle.CreatFromFile 它是一个同步方法。现在IOS 和 android 都支持了,强烈建议用。

打包的时候需要选择不压缩。

 
1
2
3
4
//打包场景
BuildPipeline.BuildStreamedSceneAssetBundle(levels, path, target, BuildOptions.UncompressedAssetBundle))
//打包资源
BuildPipeline.BuildAssetBundle(null, assets, path, BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.CollectDependencies, target);

因为不压缩, 所以就需要我们自己来压缩资源了, 可以用LZMA 和 GZIP来进行压缩。

1.打包出来的Assetbundle我们自己用LZMA压缩,上传到服务器上。

2.IOS或者Android下载这些assetbundle

3.解压缩这些assetbundle并且保存在Application.persistentDataPath 目录下。

4.以后通过AssetBundle.CreatFromFile  读取assetbundle。

关于这些方法对内存的影响及清除缓存的方法:http://www.manew.com/home.php?mod=spacecp&ac=blog&blogid=3285&op=edit

 
参考博客MOMO:http://www.xuanyusong.com/archives/2405/

(转)Resources和AssetBundle(新旧版)学习的更多相关文章

  1. Arcgis API For IOS扩展AGSDynamicLayer新旧版API对比

    AGSDynamicLayer(ForSubclassEyesOnly) Category Reference Description This category organizes the meth ...

  2. JavaScript 兼容新旧版chrome和firefox的桌面通知

    1.新/旧版本的chrome和firefox都可支持,IE下不支持因此设置为了在最小化窗口处闪烁显示提示文字. 2.设置为提示窗口显示5秒即关闭. 3.可设置图标和点击提示窗口要跳转到的页面(见输入参 ...

  3. 新旧版ubuntu镜像免费下载

    链接:https://pan.baidu.com/s/1hUNfiyA_Npj9QQ0vNLJ_Xw 密码:6k6i

  4. 三、create-react-app新旧版中使用less和antd并修改主题颜色

    引入less 如果项目根目录中没有config文件夹,首先暴露出项目配置文件,项目下执行: npm run eject 如果项目是从git仓库中pull下来的的话,必须确保本地项目与仓库中没有冲突,才 ...

  5. 最流行的JavaScript库jQuery不再支持旧版IE

    直到JQuery2.0的发布,流行的jQuery JavaScript库到了一个重要里程碑.2.0版本比前任版本在大小上缩减了12%,但是更大的新闻是,jQuery 2.0不在对IE6,7,8三个版本 ...

  6. Python之路【第二十篇】:python项目之旧版抽屉新热榜

    旧版抽屉新热榜 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  7. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  8. C++Primer第5版学习笔记(四)

    C++Primer第5版学习笔记(四) 第六章的重难点内容         你可以点击这里回顾第四/五章的内容       第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...

  9. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

随机推荐

  1. 怎样在caffe中添加layer以及caffe中triplet loss layer的实现

    关于triplet loss的原理.目标函数和梯度推导在上一篇博客中已经讲过了.详细见:triplet loss原理以及梯度推导.这篇博文主要是讲caffe下实现triplet loss.编程菜鸟.假 ...

  2. 数据挖掘算法之关联规则挖掘(二)FPGrowth算法

    之前介绍的apriori算法中因为存在许多的缺陷,例如进行大量的全表扫描和计算量巨大的自然连接,所以现在几乎已经不再使用 在mahout的算法库中使用的是PFP算法,该算法是FPGrowth算法的分布 ...

  3. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)

    题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...

  4. ural 1057 Amount of degrees 【数位dp】

    题意:求(x--y)区间转化为 c 进制 1 的个数为 k 的数的出现次数. 分析:发现其满足区间减法,所以能够求直接求0---x 的转化为 c 进制中 1 的个数为k的数的出现次数. 首先用一个数组 ...

  5. Android Studio+SVN配置生成apk文件

    Android Studio 是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发 ...

  6. Android apktool反编译资源文件为空解决办法(测试天猫、淘宝等apk成功)

    1 Exception in thread main brut.androlib.androlibexception multiple resources 解决办法:下载最新的apktool,在goo ...

  7. 记一次SmtpClient发送邮件引发的系列问题

    前提:公司同事离职,我接手同事负责的项目. 事件:某天公司的分析人员,说软件中的邮件发送功能不能使用,总是提示"邮件发送失败". 本地能够正常发送,发布WCF到服务器IIS上,再调 ...

  8. javascript跨浏览器事件对象类库

    一.前言 学习了javascript事件后,个人总结归纳了跨浏览器事件对象类库,方便以后使用,现分享给大家. 二.事件对象封装 将对浏览器事件对象的操作封装成eventObject.js方便调用 // ...

  9. Atitit.收银系统模块架构attilax 总结

    Atitit.收银系统模块架构attilax 总结 1. 常规收银系统模块结构1 1.1. 商品管理1 1.2. 会员系统1 1.3. 报表系统1 1.4. 会员卡系统1 1.5. 库存管理1 2.  ...

  10. js将用户上传gif动图分解成多张帧图片

    js将用户上传gif动图分解成多张帧图片 写在前面 工作中遇到一个这么一个需求:这是一个多图上传的场景,如果用户上传选择多张图片,则上传后直接展示多张图片,如果上传的图片是gif动图,则需要分解这张动 ...