AssetBundle

UnityAssetBundle

设置资源AB

基本上unity所包含的资源文件,除了脚本文件都可以设置成ab资源。

生成AB资产

生成AB有两种方式

  • 自定义打包
  • AssetBundles-Browser-master插件
  1. 预览AB

这里使用插件打包,对于目前所有ab资源一目了然,如有ab设置错误也会有错误提示,我们已经设置好ab资源用它打开如图

正是因为unity支持‘/’来分层,所以我们用文件层次来设置ab名称
才使得对应ab包层级目录结构清晰明确
2. 打包设置

enter description here

根据当前ab资源选择不同压缩模式比较

压缩模式 UnCompression LZ4 LZMA
Andriod平台大小 325kb 160kb 119kb
  • LZ4 解压读取速度快(推荐)
  • LZMA 压缩率高,文件占用空间小,解压比较慢

获取AB加载

大致流程图示

1559045934508.drawio.html 42.38 KB

下面示例从服务器中获取 tom ab资源一系列流程

要测试在服务中的ab资源

enter description here

测试代码

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相关推荐

  1. [小明爬坑系列]AssetBundle原理介绍

    一.简介 Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利. 二.移动平台特点 A ...

  2. Unity5 AssetBundle系列——简单的AssetBundleManager

    一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理. 下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数: using Unity ...

  3. 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

    问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查 ...

  4. 实力封装:Unity打包AssetBundle(大结局)

    →→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...

  5. [Unity3d]制作打包并载入AssetBundle

    通常在游戏执行过程中,并不希望一次将全部的资源都载入.而是在资源被使用的时候载入,以免占用过多的存储空间.所以我们可能会尽量规划好不同功能的场景,在需要的时候才载入场景并释放掉前个场景中不需要的资源. ...

  6. AssetBundle——外部加载资源Asset

    几篇很不错的文章 AssetBundle创建到使用入门 全面理解Unity加载和内存管理 实用的创建AssetBundle的脚本 相关资源 相关的共享资源下载  本共享包括创建assetbundle的 ...

  7. (转)Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)...

    这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor  和 /Edi ...

  8. 关于Unity中从服务器下载资源压缩包AssetBundle的步骤

    AssetBundle 1: 在Unity中,能为用户存储资源的一种压缩格式的打包集合,他可以存任意一种Unity引擎可以识别的资源: 模型,音频,纹理图,动画, 开发者自定义的二进制文件; 2: 这 ...

  9. unity3d AssetBundle包加密

    原地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961587.html 保护资源管理文件的相关内容 Unity允许用户使用AssetBu ...

  10. U3D assetbundle加载与卸载的深入理解

    U3D assetbundle加载与卸载的深入理解 using UnityEngine; using System.Collections; using System;public class tes ...

最新文章

  1. 再谈Erlang代码热替换
  2. Maven工程的分类
  3. KMP子串匹配算法(Knuth–Morris–Pratt algorithm)
  4. python参数传递_python中的*和**参数传递机制
  5. python中的tkinter模块
  6. JAVA内存模型与线程安全
  7. 精妙SQL语句集合(收集)
  8. 抓鸡 抓服务器 1433 3306 全自动效率抓鸡
  9. 【PC】TP-LINK WDN5200 AP模式无网络连接权限解决
  10. 信息差、技能差、资源差、认知差
  11. 台式计算机拆机步骤ppt,意式咖啡机的拆解评测ppt
  12. 【Python语言基础】——Python 数字
  13. Win7 X64 SQL SERVER 2000企业管理器无法建立新表
  14. Spring Boot 2 精髓学习笔记(五)---Beetl 模板引擎(1)
  15. win7 安装ox oracle,windows 2012 R2 core安装0x800f0906 -mgmt-infra出现0x800f0906
  16. 深扒“亚稳态”的底裤,从MOS管到CMOS门电路,再到亚稳态分析
  17. 微信小程序开发初学:图片组件 - image
  18. 搭建pxe远程安装服务器
  19. 用计算机写作信息技术集体备课,信息技术集体备课总结
  20. 基础知识 - Unicode码

热门文章

  1. GAN for NLP (论文笔记及解读
  2. ContentProvider源码分析(原)
  3. Android Studio系列(二)使用Android Studio开发/调试整个android系统源代码(不定时更新)
  4. r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解
  5. 关于QMap的几点总结思考
  6. java cookie p3p_P3P解决cookie存取的跨域问题
  7. [转载]关于申请国外博后的一点经验和想法
  8. [转载]出了国才明白的10件事~(MITBBS ZT)
  9. rhel6上使用udev配置oracle asm,Red Hat Enterprise Linux 6使用udev配置Oracle ASM总结文档
  10. beego mysql 存储过程_ioioj5