一、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
待更。。。
三、熱更新
待更。。。