(转)Resources和AssetBundle(新旧版)学习

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/

时间: 2024-08-03 11:24:22

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

Resources和AssetBundle(新旧版)学习(来自蛮牛)

Resources: Resources的缺点:1.与显示Inspector上直接引用相比,Resources使用不方便. 2.不管你Resources上的资源是否调用了,当你发布的时候,Resources上的资源会全部一起打包掉,无法作更新. Resources里的方法: Resources.Load :动态加载特殊文件夹Resources里的文件. Resources.UnloadAsset:回收指定的缓存. Resources.UnloadUnusedAsset:回收没有被引用的缓存 这里

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

1.新/旧版本的chrome和firefox都可支持,IE下不支持因此设置为了在最小化窗口处闪烁显示提示文字. 2.设置为提示窗口显示5秒即关闭. 3.可设置图标和点击提示窗口要跳转到的页面(见输入参数). var timer = null, title = $('title').text(); $('body').on('click', function() { clearInterval(timer); $('title').text(title); }); function showMsg

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

AGSDynamicLayer(ForSubclassEyesOnly) Category Reference Description This category organizes the methods that are relevant to subclassing a dynamic layer. Developer can create custom dynamic layers by paying special attention to the methods in this ca

Hbase新旧版的API

1 package com.felix.hbaseapi_test; 2 3 /* 这是旧版的 API操作 */ 16 public class hbaseapifelix { 17 18 public static final String TABLE_NAME = "testapi"; 19 public static final String COLUMNFAMILY_NAME = "cf"; 20 public static final String ROW

Windows系列远程桌面工具2020年新旧版使用

 IIS7远程桌面程序截图更新日志:2020版远程桌面截图于2020年1月8日更新,由于有客户依旧使用旧版,此页面将保留旧版截图  IIS7远程桌面程序:http://yczm.iis7.com/?lxmd 旧版远程连接工具截图 新版远程桌面工具截图 原文地址:https://www.cnblogs.com/cclxm99/p/12335104.html

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个

opencv的C++接口与旧版C风格接口的一些区别

之前一直使用旧版的opencv接口,也就是IplImage* , CvMat* 一类的东西,后来觉得需要学习新东西,然后也是被偶尔的内存泄漏折磨的半死,所以使用了新的C++接口.两个版本虽然很多地方可以用简单的方式找到共同之处,比如cv::namedWindow和cvNamedWindow, 仅仅是把cv去掉,改成cv::外加首字母小写. 不过新版本有一些不同之处,记起来就稍稍写一下: 1:cv::Scalar 和 CvScalar 用相通的三个值去赋值得到的颜色是不一样的,偶尔有些蛋疼.不记得

HIVE自定义TextInputFormat (旧版MapReduceAPI ok, 新版MapReduceAPI实现有BUG?)

我们的输入文件 hello0, 内容如下: xiaowang 28 [email protected][email protected] 38 [email protected][email protected] 100 unknown 逻辑上有3条记录, 它们以@[email protected]分隔. 我们将分别用旧版MapReduce API 和新版MapReduce API实现自定义TextInputFormat,然后在hive配置使用, 加载数据. 首先用旧版API 1, 自定义For

stm32寄存器版学习笔记07 ADC

STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把ADC转换分成2个通道组:规则通道组相当于正常运行的程序:注入通道组相当于中断.程序初始化阶段设置好不同的转换组,系统运行中不用变更循环转换的配置,从而达到任务互不干扰和快速切换. 有16个多路通道.可以把转换组织成两组:规则组和注入组.在任意多个通道上以任意顺序进行的一系列转换构成成组转换.例如,可