AssetBundle相关_assetbundles-browser在菜单中看不到-程序员宅基地

1.AssetBundle的定义

把一些可以下载的内容放在AssetBundle里面,可以减少安装包的大小

压缩包可以使用LZMA和LZ4压缩算法,减少包的大小,更快的进行网络传输

什么是AssetBundle?

可以称之为压缩包,里面压缩了多个文件。两类:serialized file and resource files

serialized file:资源被打碎放在一个对象中,最后被写进一个单独的文件

resource files:二进制资源被单独保存,方便快速加载

AssetBundle加载到内存的时候,他是一个AssetBundle对象。

 

2.AssetBundle的使用流程

指定资源的AssetBundle属性

构建AssetBundle包

上传AB包

加载AB包和包里面的资源

 

3.AssetBundle的打包

(1)在unity中将要打包的AssetBundle包的AssetBundle属性添加上标签,可以通过加上/来划分子目录 eg:scenes/wall ,就会先创建一个scenes文件夹

(2)创建打包的代码

AB打包只会在editor状态的时候进行,使用BuildPipeline中的BuildAssetBundles方法,在目标文件中创建AB文件

[MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string dir = "AssetBundles";
        if (Directory.Exists(dir) == false)
        {
            Directory.CreateDirectory(dir);
        }
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);

    }

(3)MenuItem特性让这个方法在Assets中生成

 

4.AssetBundle的加载和使用


使用AssetBundle类中的LoadFromFile方法,得到AssetBundle对象,加载ab对象中的资源得到GameObject,

实例化GameObject

AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/wall.unity3d");
        GameObject wallPrefab = ab.LoadAsset<GameObject>("Wall");
        Instantiate(wallPrefab);

 

5.AssetBundle分组策略

逻辑实体分组

一个UI界面或者所有UI界面一个包,一个角色或者所有角色一个包,所有场景共享的部分(贴图和模型)一个包

按照类型分组

所有声音资源、shader打成一个包

按照使用分组

按照关卡分组

 

6.依赖打包

当不同物体用到同一材质时,将不同物体和材质一起打包,将大大减小整个ab包的大小

 

7.BuildAssetBundles的参数

(1)dir路径(硬盘上的路径)

(2)BuildAssetBundlesOptions.None:默认LAMA算法压缩,压缩的包更小,但是加载时间更长。需要整体解压,一旦被整体解压,这个包会使用LZ4重新压缩

BuildAssetBundlesOptions.UncompressedAssetBundle:不压缩、包大,加载快

BuildAssetBundlesOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是可以加载指定资源而不用全部解压。

(3)BuildTarget打包的平台

 

8.Manifest文件

BuildAsset会生成Manifest文件

CRC效验码,校验文件是否完整

Assets说明文件包含哪些资源

Dependencies依赖,当前ab文件依赖了那些包。一个资源有依赖,要先加载依赖

 

9.AssetBundles的使用

异步的方式读取ab包,从内存中读取

IEnumerator Start () {
        string path = "AssetBundles/cube.unity3d";

        //第一种加载AB的方式 异步的方式
        AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return request;
        AssetBundle ab = request.assetBundle;
        
        GameObject test1 = ab.LoadAsset<GameObject>("Cube");
        Instantiate(test1);

    }

从文件中读取

!

10.WWW.LoadFromCacheOrDownload下载并加载AssetBundle

资源如果第一次获取,会先下载到本地,第二次再用就会从缓存直接加载。

file:// file:///才可以加载文件

IEnumerator Start () {
        while (Caching.ready == false)
        {
            yield return null; 
        }

        WWW www = WWW.LoadFromCacheOrDownload(@"file:///F:\unity project\AssetBundle\AssetBundles\cube.unity3d", 1);
        yield return www;
        if(string.IsNullOrEmpty(www.error)==false)
        {
            Debug.Log(www.error);
            yield break;
        }
        AssetBundle ab = www.assetBundle;

        GameObject test1 = ab.LoadAsset<GameObject>("Cube");
        Instantiate(test1);

    }

 

11.搭建简单的Server服务器

NetBox2 会自动在当前目录下操作,你只要在当前目录下创建一个html,写上文本,你的localhost就会变成你写的东西

 

12.使用这句话访问远程服务器上的资源

 WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetBundles/cube.unity3d", 1);
        

13.UnityWebRequest下载AssetBundle

异步的接收文件,通过UnityWebRequest中的方法得到UnityWebRequest对象,调用Send方法才会从服务器端下载,

下载完成之后,使用DownloadHandlerAssetBundle.GetContent取得内容

IEnumerator Start () {
        //UnityWebRequest
        string uri = @"file:///F:\unity project\AssetBundle\AssetBundles\cube.unity3d";
        UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
        yield return request.Send();
        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

        GameObject test1 = ab.LoadAsset<GameObject>("Cube");
        Instantiate(test1);

    }

14.从AssetBundl加载资源

获取AssetBundleManifest,这个文件中包括了所有的资源的依赖。

通过GetAllDependencies得到我们使用的资源的依赖,再加载资源所依赖的包。

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
        AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        string[] strs = manifest.GetAllDependencies("cube.unity3d");
        foreach (string name in strs)
        {
            print(name);
            AssetBundle.LoadFromFile("AssetBundles/" + name);
        }

 

15.AssetBundle的卸载

卸载:减少内存使用,但是卸载不当会导致材质丢失
Unload方法参数为false,只有当资源不被引用的使用才卸载,如果Unload参数为true,不管资源是否引用,都会卸载

一般在场景切换的时候进行AB包的卸载。

 

16.关于文件校验

CRC、MD5、SHA1

对数据进行计算,来生成一个校验值,用来检测数据的完整性。MD5、SHA1的安全性比较高

 

17.AssetBundles浏览工具

AssetBundles-Browser通过文档找到github,再releases中可以下载导入到Unity的Editor文件中,再Window菜单栏中就可以查看了。

这个工具可以查看项目中使用到AB包的地方,也可以通过工具进行AB包的打包

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Game_Builder/article/details/81286971

智能推荐

scrapy读取settings.py文件-程序员宅基地

文章浏览阅读367次。 get_project_settingsfrom scrapy.utils.project import get_project_settings def __init__(self): #读取设置 self.mySetting = get_project_settings() #get获取参数 self.timeo..._scrapy读取settings

Java一次性递归解析json报文为Map(不使用第三方jar包)_java不引入依赖怎么字符串解析json为map或list-程序员宅基地

文章浏览阅读3.8k次,点赞4次,收藏3次。前言json报文相信大家都接触过,对于前段JavaScript来说,它是最方便处理的数据格式,而对于后端应用来说,解析json报文并没有xml格式来的那么清晰明了,尤其是对于通用的处理来说很难做到,这里在参考了阿里巴巴的json(非fastjson项目)处理后,十分佩服它的思路,尤其是递归迭代的应用,现在将其源码贴出,供自己以及大家学习。_java不引入依赖怎么字符串解析json为map或list

大数据中hive的安装_进入hive安装目录且登陆hive客户端-程序员宅基地

文章浏览阅读430次。hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以..._进入hive安装目录且登陆hive客户端

VarGFaceNet:地平线开源有效可变组卷积的人脸识别网络_地平线 人脸识别算法 研究-程序员宅基地

文章浏览阅读1.3k次。概述为了提高轻量级人脸识别网络的识别和泛化能力,提出了一种有效的可变群卷积网络vargfacenet。VarGNet它引入了一种刻板的卷积来解决小计算和块内计算强度不平衡之间的冲突。利用变群卷积方法设计了一个支持大规模人脸识别的网络,降低了计算量和参数。具体来说,作者在网络开始时设置了头部来保留基本信息,并提出了一种具体的嵌入方法来降低用于嵌入的全连接层的参数。为了改进解释,作者使..._地平线 人脸识别算法 研究

【嵌入式物联网实战项目】环境监测设备接入涂鸦IoT开发平台_产品如何打通涂鸦-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏38次。小熊派物联网开发板接入涂鸦 IoT 开发平台实现植物环境监测物联网的概念其实十几二十年前就已经有了,随着人工智能,大数据,云计算这些科技的发展,越来越多的物联网项目正式商用落地,比如,共享单车和共享汽车,全屋智能家居,等等。时至今天,国内的物联网生态可谓百花齐放,不乏一线大厂,比如华为腾讯小米;小米应该是布局物联网生态比较早的公司,大部分人都认为小米是做手机的,但发展到今天,小米已经成为一个生态链平台。大概在2015年左右,有一家公司渐渐进入物联网的生态圈,涂鸦智能。我最早接触涂鸦大概是在_产品如何打通涂鸦

求助,dubbo明明配置没有问题但是启动出现就UnsatisfiedDependencyException等很多错误,_unresolved dependency: 'in-project:dubbo:jar:2.7.2-程序员宅基地

文章浏览阅读219次。HTTP状态 500 - 内部服务器错误类型 异常报告消息 Servlet[dispatcherServlet]的Servlet.init()引发异常描述 服务器遇到一个意外的情况,阻止它完成请求。例外情况javax.servlet.ServletException: Servlet[dispatcherServlet]的Servlet.init()引发异常org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authenticat_unresolved dependency: 'in-project:dubbo:jar:2.7.22

随便推点

呈深绿色固体的化合物(ADEBHPP)n聚((2-蒽醒)[5,15-二乙炔基-10,20-二(3,4,5-三-(十六烷氧基)苯基)卟啉]锌-齐岳供应卟啉_深绿色的化合物-程序员宅基地

文章浏览阅读178次。呈深绿色固体的化合物(ADEBHPP)n聚((2-蒽醒)[5,15-二乙炔基-10,20-二(3,4,5-三-(十六烷氧基)苯基)卟啉]锌-齐岳供应卟啉_深绿色的化合物

webrtc 合流-程序员宅基地

文章浏览阅读126次。<template> <!-- 大窗口 --> <div class="liveVideos"> <video id="camaraVideo" width="100%" height="100%" ref="videoing" class="video" aut..._webrtc 合流

信息安全技术基础_信息安全基础技术-程序员宅基地

文章浏览阅读870次,点赞21次,收藏18次。一、信息安全基础1、信息安全的基本要素有机密性、完整性、可用性、可控性与可审查性。信息安全的范围包括设备安全、数据安全、内容安全和行为安全。其中数据安全即采取措施确保数据免受未授权的泄露、篡改和毁坏,包括秘密性、完整性和可用性 3 个方面。2、信息存储安全的范围:信息使用的安全、系统安全监控、计算机病毒防治、数据的加密和防止非法的攻击等。_信息安全基础技术

GIS瓦片3-WMTS瓦片-程序员宅基地

文章浏览阅读990次,点赞22次,收藏17次。WMTS( Web Map Tile Service)切片地图Web服务(OpenGIS Web Map Tile Service)当前最新版本是1.0.0。WMTS标准定义了一些操作,这些操作允许用户访问切片地图。WMTS可能是OGC首个支持RESTful访问的服务标准。WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案。WMTS弥补了WMS不能提供分块地图的不足。

Python虚拟环境配置-程序员宅基地

文章浏览阅读98次。1、命令提示符下创建demo环境conda create -n demo python=3.6备注:demo 为环境名;python=3.6指定python版本,也可以选最新3.7,若不指定则安装最新版本2、查询环境信息(当前激活的环境名后有一个*)conda info -e3、激活环境conda activate demo4、安装包pip install numpy*pip install numpy (==1.16.4)不加括号内容表示下载最新版本如果下载速度慢,可以换成国内

销售管理系统_手机销售信息管理系统 c 语言-程序员宅基地

文章浏览阅读1.1w次,点赞24次,收藏124次。C语言-------销售管理系统一.需求分析A.功能需求很多商品销售机构都需要用到销售管理系统,商品信息包含的字段很多,比如包括:商品编号、商品名称、商品类别(普通电视机、DVD、带DVD的电视机,带DVD的电视机的售价为普通电视机和DVD单价之和的80%)、商品进货价格、商品销售价格、商品数量、供应商名称等。对系统的具体要求如下: 销售商品信息增删改查。 销售商品退货管理。 销售商品进货价格管理。 销售商品销售价格管理。 销售商品统计功能。 销售商品排序(价格)功能。B.技_手机销售信息管理系统 c 语言

推荐文章

热门文章

相关标签