我在写这边文章之前参照了如下文章:
https://www.jianshu.com/p/5d4145cd900c
----------------------------我是分割线--------------------------
Asset Bundle的作用:
1.AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
2.AssetBundle自身保存着互相的依赖关系;
3.压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;
4.把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;
什么是AssetBundle
可以归为两点:
1,它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)
serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载
2,它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
如何操作?
1.首先,先将游戏物体设置成Prefab预设体(在U3D中创建游戏物体,然后在Assets文件夹下创建一个Prefab文件夹,并将物体拖拽到该文件夹中,就形成了预设体)
然后对该预设体进行编辑:
这里的含义是:生成的AssetBundle文件会生成在scene文件夹下的model.ab文件中,用户可以自定义。
2.在Assets目录下创建一个Editor文件夹,并在Editor文件夹下创建编辑扩展脚本(一定要在Editor文件夹下创建编辑扩展脚本,否则不会生效!!!)
这里名字随便命名,注意规范!
3.该脚本代码如下:
using UnityEditor;
using System;
using System.IO;
public class CreateAssetbundles
{
//可以让U3D的菜单栏生成指定名称的菜单项,点击后,用来调用该方法
[MenuItem("AssetsBundle/Build AssetBundles")]
static void BuildAllAssetBundles()//进行打包
{
string dir = "AssetBundles";
//判断该目录是否存在
if (Directory.Exists(dir) == false)
{
Directory.CreateDirectory(dir);//在工程下创建AssetBundles目录
}
//参数一为打包到哪个路径,参数二压缩选项 参数三 平台的目标
/*
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。
一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。
在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。
注意使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小。
*/
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
编写好代码之后,U3D的菜单栏会生成一个菜单项: