接着上篇,本節寫如何更加科學的打包,以及打包中的一些依賴關係。
科學打包:
一般來說會把物體打成一個assetbundle包,把材質打成另個包,然後在加載的時候都加載出來。
當然如果是有的模型會頻繁更新,那就要把更新的單獨打包了。這些都是在打包之前的計劃工作,但是非常重要。
接下來繼續講打包的知識:
下面要打包三種東西,一種是模型、一種是材質、一種是場景。
如下圖,有一個工程,exprot是從max裏導入的模型文件,prefabs是做成的預製物體。一般來說被打包的物體都會做成預製物體。
現在要把prefabs裏的所有的物體全選然後統一打包成名字爲mod後綴爲mo的assetbundle文件
材質球名爲爲tietu.ab的格式的assetbundle文件
將場景testscene也進行打包,該場景中只有一個cube。
定義assetbundle名爲testscene.unity。如下:
然後在文件夾中會看到打包出來的文件及對應的manifest文件。如下:
然後我們打開mod的manifest文件,會看到mod在路徑對應的模型文件有哪些,以及他們的依賴關係。如下:
很明顯Dependencies的是在該文件夾下的tietu.ab這個assetbundle文件。說明如果要加載這個模型文件,必須要把所依賴的tietu.ab這個也加載了,不然就會出現依賴丟失。如
上篇文章中出現貼圖丟失的現象。
然後再看一下大boss級別的assetbundle.manifest文件,可以看到整個文件夾裏有三個assetbundle文件,只有mod存在依賴關係,其他的都沒有。
至此我們的打包工作都完成了。。。也明白瞭如果要加載某個模型或者場景的時候應該把對應的依賴關係也加載上。
下面開始加載,方法有兩種,第一種是我們通過manifest文件知道需要加載tietu.ab這個文件纔可以,所以直接加載這個文件。
如下:
using UnityEngine;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour
{
// Use this for initialization
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/mod.mo");
AssetBundle tietu = AssetBundle.LoadFromFile("AssetBundles/tietu.ab");
Object[] obj = ab.LoadAllAssets<GameObject>();//加載出來放入數組中
//創建出來
foreach (Object o in obj)
{
Instantiate(o);
Debug.Log(o.name);
}
ab.Unload(false);
tietu.Unload(false);
}
第二種:如果我們沒有去看manifest文件,我們還可以使用另一種方法 即獲得mod這個assetbundle所依賴的文件,並且加載它們。代碼如下:
代碼中通過 GetAllAssetBundles這個獲得到所有的manifest的文件,可以通過GetAllDependencies方法獲得到對應assetbundle文件的所有依賴名稱,然後加載。
AssetBundle manifesAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
//打印所有manifest中的文件名
print(name);
}
//獲得所有依賴。例如材質球貼圖等
string[] strs = manifest.GetAllDependencies("mod.mo");
foreach (var name in strs)
{
//加載所有依賴
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
以上兩種方法效果都如圖:
-----加載場景的方法也是一樣----因爲加載的場景如果不跳轉是看不出的所以加載之後加上了跳轉方法,代碼如下:
//加載場景,並跳轉
AssetBundle scenesload = AssetBundle.LoadFromFile("AssetBundles/testscene.unity");
Application.LoadLevel("testscene");
所以本次案例的完整代碼如下:
using UnityEngine;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour
{
// Use this for initialization
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/mod.mo");
// AssetBundle tietu = AssetBundle.LoadFromFile("AssetBundles/tietu.ab");
Object[] obj = ab.LoadAllAssets<GameObject>();//加載出來放入數組中
//創建出來
foreach (Object o in obj)
{
Instantiate(o);
Debug.Log(o.name);
}
ab.Unload(false);
////加載場景,並跳轉
//AssetBundle scenesload = AssetBundle.LoadFromFile("AssetBundles/testscene.unity");
//Application.LoadLevel("testscene");
AssetBundle manifesAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
//打印所有manifest中的文件名
print(name);
}
//獲得所有依賴。例如材質球貼圖等
string[] strs = manifest.GetAllDependencies("mod.mo");
foreach (var name in strs)
{
//加載所有依賴
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
}
}
這樣就完成了完整打包和加載的過程工作。當然這些都是從硬盤的加載方法,下一篇講從網絡服務器加載assetbundle的方法。