(完整代码–懒人笔记–学习用)
一、AssetBundle用处
1,AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载,可以理解成资源包;
2,AssetBundle可以相互依赖,比如说,预制体模型包(一个包)可以依赖与材质包(另一个包);
3,压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;
4,把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小,游戏更新时下载的包也是如此;
二、什么是AssetBundle
1、它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file(资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)) 和 resource files(某些二进制资源(图片、声音)被单独保存,方便快速加载)。(序列化文件和源文件)
2、它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。(所谓的面向对象吧~)
三、AssetBundle使用流程
比如:将更新需加载的资源打成AssetBundle包放到服务器上(可能会有多个AssetBundle包)
玩家检测到游戏需要更新时,从服务器将资源包下载下来。如果检查到不需要更新就不用了从服务器上下载。(下载后会保存到本地)
我们要如何使用(步骤)
1,指定资源的AssetBundle属性(xxxa/xxx)这里xxxa会生成目录,名字为xxx(比如我这里的选择一个材质)
2,构建AssetBundle包,用Editor写一个打包工具方便操作嘛
上面那东西的代码在这,看注释理解
using UnityEditor; //unity编辑器
using System.IO;
public class CreateAssetBundles{
//将此方法设置为菜单选项
[MenuItem("Assets/Build AssetBundle")]
static void BuildAllAssetBundles() {
//创建目录 Directory
string dir = "AssetBundles";
if (Directory.Exists(dir)==false) {
Directory.CreateDirectory(dir); //判断目录是否存在,不存在的话创建
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
//"AssetBundles":文件夹创建在根目录下,(代码在unity内运行)以相对路径创建,相对路径以工程的根目录为准
//BuildAssetBundleOptions.None : 默认为LZMA算法压缩
// StandaloneWindows64 : 按平台进行打包(这里只能在Win64下可以使用)
}
}
打出来的AssetBundle长这样(加载Manifests文件可以处理资源的依赖)
3,上传AB包,说白了就是把包丢到服务器上去
4,加载AB包和包里面的资源(下面给代码详细讲)
四、AssetBundle的加载方式
(个人感觉嘛就把ab包当成对象那样加载使用就好了。)
① 从内存加载(AssetBundle.LoadFromMemoryAsync)
同步加载,我这里加载得可能有点累赘了…但最直接的方法就是这么加载
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class LoadFromMemoryExample : MonoBehaviour {
void Start() {
//同步方式加载
string path_m = "AssetBundles/share.ab";
string path_p1 = "AssetBundles/sphere.ab";
string path_p2 = "AssetBundles/cylinder.ab"