Unity 3-7 AssetBundle从入门到掌握
任务1&2&3:课程介绍
AssetBundle -- 用于资源的更新
为了之后的xLua (Lua热更新的框架)打下基础
任务4&5:AssetBundle的定义和作用
AssetBundle的学习 -- 一手学习资源:UnityManual -> AssetBundles -> 教程式的文档
AssetBundle是一个压缩包(也可以认为是一个文件夹)
包含模型Model、贴图Texture、预制体Prefab、声音AudioClip、甚至整个场景
在游戏运行的时候可以被加载
这个压缩包被打包出来存在硬盘中,里面包含的文件可以分为两类:serialized file和resource files
serialized file:资源,如模型、预制体,被打碎放在一个对象中,最后统一被写进一个单独的文件
resource file:某些二进制资源,如图片、声音,被单独保存,方便快速加载 -- 一个单独的图片或声音就会被打包成一个.resource文件
压缩包可以使用LZMA和LZ4压缩算法,便于更快的进行网络传输 -- 区别之后会讲
为什么会用到网络传输呢?
1. 把一些可以下载的资源放在AssetBundle中,而不放在app中,而在需要的时候从网上直接加载资源
-- 减少安装包的大小
安装包过大:影响用户体验,或导致用户不想下载
2. 方便更新
-- 对于某些模型,如果进行某些活动更新,用户不需要更新安装包
进入游戏后,检查资源更新,从服务器上下载模型并加载即可
第一次启动后,或之后有更新时,下载更新包到本地,之后就不用下载了
AssetBundle自身保存着互相的依赖关系
比如一个包是专门保存模型的,而另一个包是专门保存贴图的,那这两个包之间就会有依赖关系
AssetBundle在加载时,作为一个AssetBundle对象,对象中包含的内容就是AssetBundle压缩包中的内容
任务6:AssetBundle使用流程
https://docs.unity3d.com/Manual/AssetBundles-Workflow.html
1. 指定资源的AssetBundle属性
2. 构建AssetBundle包
AssetBundle包可以有多个,每个AssetBundle包中可以有多个文件
Unity会搜寻项目中的资源,如果资源被标记了需要打包,则会被打包到AssetBundle包中
3. 上传AssetBundle包
一般情况下都会上传到服务器
4. 加载AssetBundle包及其中的资源
启动游戏之后,游戏会在服务器上检查更新,将更新包下载到本地,加载上面的资源
任务7&8:打包AssetBundle
1. 指定资源的AssetBundle属性
从AssetStore上搜索Material资源
创建一个Cube,拉伸成一个墙壁的形状,将mat资源附加上
制作成一个名为wall的prefab
修改wall prefab的AssetBundle标签,New -> Wall (不区分大小写)
后缀协程assetbundle,不是必要的,随意填写都行
2. 使用Unity的API进行构建AssetBundle包
这个API是只有在Editor模式下才运行的
创建Editor文件夹
新建CreateAssetBundles.cs脚本
using UnityEditor;
不继承自MonoBehaviour
BuildPipeline.BuildAssetBundles(string outputPath, BuildAssetBundleOptions option, BuildTarget platform);
string path; // path是以工程的根目录为基础的 -- 输出目录需要已存在,Unity不会自动创建路径
因此需要进行路径是否存在的判断
using System.IO;
if(!Directory.Exists(path)) {
Directory.CreateDirectory(path);
}
BuildAssetBundleOptions.None // 表示不去设置该选项
BuildTarget.StandaloneWindows64 // 表示为了window64平台打包的
using UnityEditor; using System.IO; public class CreateAssetBundle { [MenuItem("Assets/BuildAssetBundles")] static void BuildAllAssetBundles() { string path = "AssetBundles"; if (!Directory.Exists(path)){ Directory.CreateDirectory(path); } BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); }}
[MenuItem("Assets/BuildAssetBundles")] // 表示这个方法在菜单栏Assets下创建子菜单BuildAssetBundles
Unity中,Assets -> 点击BuildAssetBundles,就会进行AssetBundle的打包了
Unity中的Project下没有任何变化,
在系统中打开工程根目录,会发现新建了一个AssetBundles文件夹