一、AssetBundle定义及作用
1. AssetBundle是一个压缩包,相当于一个文件夹,包含特定于平台的非代码的归档文件(模型、贴图、预制体、声音及场景 ),在游戏运行时候就会被加载。AssetBundle的文件是分为A serialized file和Resource files两类。
(1)A serialized file(序列化文件):资源被分解到它们各自的对象中,并写入到这个单个文件中。
(2)Resource files(资源文件):特定二进制资源(图片和声音)单独保存以便于加载。
2. AssetBundle能够表示相互间的依赖关系,其压缩包通常是采用LZMA和LZ4压缩算法,目的就是减少包的大小,从而可以满足更快网络速率的传输。
3. AssetBundles可以用来下载内容(DLC),加载针对使用用户平台的优化资产并减少运行时内存压力,即是减小安装包的大小。
二、AssetBundle使用流程
1. 流程
(1)指定资源的AssetBundle属性;
(2)开始构建AssetBundle包;
(3)上传AssetBundle包到相应的服务器;
(4)用户游戏加载AssetBundle包及资源。
2. 代码打包方法
using UnityEditor;
using System.IO;
public class CreateAssetBundle
{
//编辑器中创建菜单选项(编辑器中点击Assets中的Build AssetBundles开始构建)
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if (!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows);
}
}
打包出来的文件
3. 打包注意事项
AssetBundle打包命名可以通过“/”划分文件夹分类打包。
4. 本地文件加载AssetBundle包及资源
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class LoadFromFile : MonoBehaviour
{
void Start()
{
var myLoadedAssetBundle
= AssetBundle.LoadFromFile("Assets/AssetBundles/ground.assetbundle");
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
//加载指定资源
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("Cube");
Instantiate(prefab);
//加载全部资源
Object[] obj = myLoadedAssetBundle.LoadAllAssets();
foreach(Object i in obj)
{
Instantiate(i);
}
}
}
未完待续.................................