一、AssetBundle
1、打包AssetBundle包
①以模型为例,将模型拖为预制体
②设置预制资源的ab包名称和后缀(后缀自定义有混淆视听的作用);文件名加“/”可以直接作为文件夹管理,比如scene/sphere,这样在打包后就会生成一个文件夹scene里面存着sphere包
③创建打包ab包的Editor脚本(此脚本必须放在Editor文件夹内)
using UnityEditor;
using System.IO;
public class CaretAssetBundle {
[MenuItem("Assets/Build AssetBundles")]
static void BuildAssetBundles()
{
string dir = "AssetBundles";
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
④然后在菜单栏Assets/Build AssetBundles下点击即可生成ab包。
2、加载AssetBundle包
本地加载方式:在场景中创建一个脚本,运行时加载以下代码,则可以本地加载ab包资源,可异步
void Start () {
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/cube.unity3d");
GameObject obj = ab.LoadAsset<GameObject>("Plane");//Plane为cube.unity3d里面的一个对象
Instantiate(obj);
//记载包里面的所有对象
//object[] objs = ab.LoadAllAssets();
//foreach (Object item in objs)
//{
// Instantiate(item);
//}
}
服务器加载方式:UnityWebRequest方式适用于5.x以后的版本,是WWW方式的升级版
IEnumerator WebLoadAB(){
//服务器加载:使用UnityWebRequest
string url = @"http://localhost/AssetBundles/cube.unity3d";
UnityWebRequest request = UnityWebRequest.GetAssetBundle(url);
yield return request.Send();
AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
//GameObject obj = ab.LoadAsset<GameObject>("Plane");
//Instantiate(obj);
object[] objs = ab.LoadAllAssets();
foreach (Object item in objs)
{
Instantiate(item);
}
}
manifest文件加载方式:可以加载所有所有包,也可以得到包的依赖
manifest文件中的CRC,是对应网络出现异常的时候作为判断的,如果CRC码对不上则没有下载完成,文件缺失需要重新下载。
3、AssetBundle分组打包策略
①依赖打包:对于多个模型共用贴图、材质资源的,减小ab包的大小非常有效;做法为分别将模型、材质贴图各自打包,比如有A模型、B模型,共用了C材质贴图,那么分别给ABC各自打包,总共打包了3个assetbundle包,在加载运行后,AB模型会自动关联C资源。如下图,右侧的底下三个为依赖打包,左侧的没有共享到贴图材质打出来的包累计大小将更大。
4、AssetBundle的卸载
资源不使用时需要卸载掉,以释放内存
二、xLua
待更。。。
三、热更新
待更。。。