介绍
-
AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。
-
为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。
-
AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。
-
是一个AssetBundle对象:通过代码从特定压缩包加载出来的对象。这个对象包括了所有内容,可以通过对象加载出来使用
-
在硬盘上:一个文件夹压缩包,里面包括多个文件。
- serialized file(序列化文件):资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)
- resource files(源文件):某些二进制资源(图片、声音)被单独保存,方便快速加载(可以独立打开,不依附unity)
使用流程
一共四步:
第一步: 为 AssetBundle 分配资源
- 指定资源的AssetBundle属性(是否需要打包)
- 如果起名字为“scenes/wall“,这里scenes打包时会生成目录,名字为wall”
第二步:构建AssetBundle包
-
创建Editor文件夹,并将包含以下内容的脚本放在该文件夹中:
using UnityEditor; using System.IO; public class CreateAssetBundles { //方法放到菜单选项里,可以直接调用 [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { //要创建在哪个 目录。如果不存在,创建这个目录 string assetBundleDirectory = "AssetBundleProject/AssetBundles"; if(!Directory.Exists(assetBundleDirectory)) Directory.CreateDirectory(assetBundleDirectory); //BuildPipeline是UnityEditor下的类 BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }结果如下:打包成功 |
|
| | --- | --- |
第三步:上传AB包到服务器
第四步:从服务器 加载AB包和包里的资源
- 本地加载AB包。
- 挂一个脚本,写如下代码
using System.IO;
using UnityEngine;
public class LoadFromFileExample : MonoBehaviour
{
void Start()
{
var myLoadedAssetBundle = AssetBundle.LoadFromFile(“AssetBundles/scene/wall.unity3d”);
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
//加载所有资源可以这样写
//Object[] objs = ab.LoadAllAssets();
//foreach(Object o in objs){
// Instantiate(o);
//}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
Instantiate(prefab); // 实例化该物体
}
}
UnityWebRequestAssetBundle 从服务器下载
- 创造一个网页请求,来下载和加载AssetBundle
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class DownloadExample : MonoBehaviour
{
IEnumerator Start()
{
string uri = "https://myserver/myBundles/bundle123";
uint crc = 1098980; // Expected content CRC
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri, crc);
yield return request.SendWebRequest();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
var loadAsset = bundle.LoadAssetAsync<GameObject>("Assets/Players/MainPlayer.prefab");
yield return loadAsset;
Instantiate(loadAsset.asset);
}
}