AssetBundle
AssetBundle
设置资源AB
基本上unity所包含的资源文件,除了脚本文件都可以设置成ab资源。
生成AB资产
生成AB有两种方式
- 自定义打包
- AssetBundles-Browser-master插件
- 预览AB
这里使用插件打包,对于目前所有ab资源一目了然,如有ab设置错误也会有错误提示,我们已经设置好ab资源用它打开如图
正是因为unity支持‘/’来分层,所以我们用文件层次来设置ab名称
才使得对应ab包层级目录结构清晰明确
2. 打包设置
根据当前ab资源选择不同压缩模式比较
压缩模式 | UnCompression | LZ4 | LZMA |
---|---|---|---|
Andriod平台大小 | 325kb | 160kb | 119kb |
- LZ4 解压读取速度快(推荐)
- LZMA 压缩率高,文件占用空间小,解压比较慢
获取AB加载
大致流程图示
下面示例从服务器中获取 tom ab资源一系列流程
要测试在服务中的ab资源
测试代码
1.连接服务器,获取主依赖
调用入口
StartCoroutine(GetDepends(host, "AB_Andriod_LZ4"));
具体实现
/// <summary>/// 服务器地址/// </summary>string host = @"https://ab-test-1258795305.cos.ap-shanghai.myqcloud.com/";/// <summary>/// ab-依赖/// </summary>public Dictionary<string/*ab path*/, AB_DATA> dic_AB = new Dictionary<string, AB_DATA>();/// <summary>/// 获取主依赖,本地存储依赖关系,下载全部ab/// </summary>/// <param name="host_path">服务器根地址</param>/// <param name="dir_name">服务器下ab根文件名,以及主ab文件名称</param>/// <returns></returns>IEnumerator GetDepends(string host_path, string dir_name){dic_AB.Clear();//目录跟路径string root_path = host_path + "/" + dir_name;//获取主ab,拿到manifest获取依赖关系AssetBundleManifest assetBundleManifestServer = null; //服务器 总的依赖关系 UnityWebRequest ServerManifestWWW = UnityWebRequestAssetBundle.GetAssetBundle(root_path + "/" + dir_name);Debug.Log("HTTP : " + ServerManifestWWW.url.ToString());yield return ServerManifestWWW.SendWebRequest();assetBundleManifestServer = (AssetBundleManifest)DownloadHandlerAssetBundle.GetContent(ServerManifestWWW).LoadAsset("AssetBundleManifest");//存储各依赖关系string[] depends_name = assetBundleManifestServer.GetAllAssetBundles();for (int i = 0; i < depends_name.Length; i++){AB_DATA ab_data = new AB_DATA();ab_data.name = depends_name[i];UnityWebRequest target_uwq = UnityWebRequestAssetBundle.GetAssetBundle(Path.Combine(root_path, ab_data.name));yield return target_uwq.SendWebRequest();if (target_uwq.isDone){//下载ab到本地StartCoroutine(DownLoadAssetBundelAbdSave(Path.Combine(root_path, ab_data.name)));//dependsvar depends = assetBundleManifestServer.GetAllDependencies(ab_data.name);ab_data.depends_name = new string[depends.Length];for (int j = 0; j < depends.Length; j++){ab_data.depends_name[j] = depends[j];}dic_AB.Add(depends_name[i], ab_data);}}}
2.缓存已下载的ab资源
/// <summary>/// 下载AB文件并保存到本地/// </summary>/// <returns></returns>IEnumerator DownLoadAssetBundelAbdSave(string url){WWW www = new WWW(url);yield return www;if (www.isDone){//表示资源下载完毕使用IO技术把www对象存储到本地SaveAssetBundle(Path.GetFileName(url), www.bytes, www.bytes.Length);}}/// <summary>/// 存储AB文件到本地/// </summary>private void SaveAssetBundle(string fileName, byte[] bytes, int count){string dir_path = Application.persistentDataPath + "/" + fileName;Debug.Log("存储路径 : " + dir_path);Stream sw = null;FileInfo fileInfo = new FileInfo(dir_path);sw = fileInfo.Create();sw.Write(bytes, 0, count);sw.Flush();sw.Close();sw.Dispose();Debug.Log(fileName + "下载并存储完成");}
3.从本地磁盘读取ab并实例化
调用入口
private void LoadStream_OnClick(){//设置要加载的目标物体名string ab_name = "tom.prefab";string dir_path = Application.persistentDataPath + "/" + ab_name;//从已缓存的字节文件中加载tomStartCoroutine(LoadABFormStream(dir_path));//加载tom所需的依赖string[] ad_names = dic_AB[ab_name].depends_name;for (int i = 0; i < ad_names.Length; i++){string dir_path_depends = Path.Combine(Application.persistentDataPath, ad_names[i]);//加载依赖时,直接加载出其ab包即可,不需要分解其依赖类型再去实例,unity自会处理AssetBundle.LoadFromFile(dir_path_depends);//所以下面部分就不需要了// StartCoroutine(LoadABFormStream(dir_path_depends));}}
相关方式实现
/// <summary>/// 从字节文件读取ab,并且实例化/// </summary>/// <param name="dir_path"></param>/// <returns></returns>IEnumerator LoadABFormStream(string dir_path){FileStream fileStream = new FileStream(dir_path, FileMode.Open, FileAccess.Read);AssetBundleCreateRequest request = AssetBundle.LoadFromStreamAsync(fileStream);yield return request;AssetBundle myLoadedAssetBundle = request.assetBundle;if (myLoadedAssetBundle == null){Debug.Log("Failed to load AssetBundle!");yield break;}//实例化abInstanceAB_FormAssetBundle(myLoadedAssetBundle, myLoadedAssetBundle.name);fileStream.Close();}private void InstanceAB_FormAssetBundle(AssetBundle assetBundle, string obj_name){Object gameObject = null;if (obj_name.Contains(".mat")){gameObject = assetBundle.LoadAsset<Material>(obj_name);Instantiate<Material>((Material)gameObject);}else if (obj_name.Contains(".prefab")){gameObject = assetBundle.LoadAsset<GameObject>(obj_name);Instantiate<GameObject>((GameObject)gameObject);}}
转载于:https://www.cnblogs.com/Jean90/p/10940299.html
AssetBundle相关推荐
- [小明爬坑系列]AssetBundle原理介绍
一.简介 Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利. 二.移动平台特点 A ...
- Unity5 AssetBundle系列——简单的AssetBundleManager
一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理. 下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数: using Unity ...
- 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法
问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查 ...
- 实力封装:Unity打包AssetBundle(大结局)
→→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...
- [Unity3d]制作打包并载入AssetBundle
通常在游戏执行过程中,并不希望一次将全部的资源都载入.而是在资源被使用的时候载入,以免占用过多的存储空间.所以我们可能会尽量规划好不同功能的场景,在需要的时候才载入场景并释放掉前个场景中不需要的资源. ...
- AssetBundle——外部加载资源Asset
几篇很不错的文章 AssetBundle创建到使用入门 全面理解Unity加载和内存管理 实用的创建AssetBundle的脚本 相关资源 相关的共享资源下载 本共享包括创建assetbundle的 ...
- (转)Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)...
这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Edi ...
- 关于Unity中从服务器下载资源压缩包AssetBundle的步骤
AssetBundle 1: 在Unity中,能为用户存储资源的一种压缩格式的打包集合,他可以存任意一种Unity引擎可以识别的资源: 模型,音频,纹理图,动画, 开发者自定义的二进制文件; 2: 这 ...
- unity3d AssetBundle包加密
原地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961587.html 保护资源管理文件的相关内容 Unity允许用户使用AssetBu ...
- U3D assetbundle加载与卸载的深入理解
U3D assetbundle加载与卸载的深入理解 using UnityEngine; using System.Collections; using System;public class tes ...
最新文章
- 再谈Erlang代码热替换
- Maven工程的分类
- KMP子串匹配算法(Knuth–Morris–Pratt algorithm)
- python参数传递_python中的*和**参数传递机制
- python中的tkinter模块
- JAVA内存模型与线程安全
- 精妙SQL语句集合(收集)
- 抓鸡 抓服务器 1433 3306 全自动效率抓鸡
- 【PC】TP-LINK WDN5200 AP模式无网络连接权限解决
- 信息差、技能差、资源差、认知差
- 台式计算机拆机步骤ppt,意式咖啡机的拆解评测ppt
- 【Python语言基础】——Python 数字
- Win7 X64 SQL SERVER 2000企业管理器无法建立新表
- Spring Boot 2 精髓学习笔记(五)---Beetl 模板引擎(1)
- win7 安装ox oracle,windows 2012 R2 core安装0x800f0906 -mgmt-infra出现0x800f0906
- 深扒“亚稳态”的底裤,从MOS管到CMOS门电路,再到亚稳态分析
- 微信小程序开发初学:图片组件 - image
- 搭建pxe远程安装服务器
- 用计算机写作信息技术集体备课,信息技术集体备课总结
- 基础知识 - Unicode码
热门文章
- GAN for NLP (论文笔记及解读
- ContentProvider源码分析(原)
- Android Studio系列(二)使用Android Studio开发/调试整个android系统源代码(不定时更新)
- r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解
- 关于QMap的几点总结思考
- java cookie p3p_P3P解决cookie存取的跨域问题
- [转载]关于申请国外博后的一点经验和想法
- [转载]出了国才明白的10件事~(MITBBS ZT)
- rhel6上使用udev配置oracle asm,Red Hat Enterprise Linux 6使用udev配置Oracle ASM总结文档
- beego mysql 存储过程_ioioj5