一、AssetBundle Browser資源的導(dǎo)入
進(jìn)入unity手冊中,搜素 Unity Asset Bundle Browser 工具,選擇你使用的版本號,根據(jù)顯示出的操作進(jìn)行資源導(dǎo)入即可。
注:有的版本可能沒有資源鏈接,可以百度一下有很多。
二、AssetBundle Browser 打包
1、制作預(yù)制體(省略)?
2、選擇一個預(yù)制體,在Inspector窗口下方,設(shè)置預(yù)制體的ab包名(包名只能為小寫字母)
3、包體設(shè)置
在Window-AssetBundle Browser出現(xiàn)操作頁面。
這是剛才把兩個預(yù)制體設(shè)置為ab包,現(xiàn)在兩個包后面顯示黃色感嘆號,這是因?yàn)閮蓚€預(yù)制體里有相同的材質(zhì)和預(yù)制體。 如果直接打包這兩個包體存在相同的資源,包體會大,還會重復(fù)加載資源。我們這里把相同的資源存放到另外的包體中當(dāng)作依賴來加載。
4、處理依賴資源
在左側(cè)區(qū)域右鍵-Add new bundle命名為rackmat,把其中一個包體里帶有黃色感嘆號的資源拖到rackmat里。
5、輸出打包
在Build頁面,設(shè)置打包的配置,選擇要打包的平臺,勾選Clear Folders重新打包時會清除之前打包的文件。?點(diǎn)擊Build后,資源會打包的輸出路徑的位置,同時也會復(fù)制出一個StreamingAssets文件夾,里面也會有一份打包文件。
? ? ? ? ? ? ? ?
????????????????????????輸出的文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 復(fù)制出的文件?
三、AssetBundle Browser 加載
/// <summary>
/// 緩存加載的AssetBundle,防止多次加載
/// </summary>
private Dictionary<string, AssetBundle> m_abDic = new Dictionary<string, AssetBundle>();
/// <summary>
/// 它保存了各個AssetBundle的依賴信息
/// </summary>
private AssetBundleManifest abMainfest = null;
/// <summary>
/// 主包
/// </summary>
private AssetBundle abMain = null;
/// <summary>
/// 打包成不同平臺對應(yīng)的路徑
/// </summary>
private string PathURL
{
get
{
#if UNITY_EDITOR || UNITY_STANDALONE
return Application.dataPath + "/StreamingAssets/";
#elif UNITY_IPHONE
return Application.dataPath + "/Raw/";
#elif UNITY_ANDROID
return Application.dataPath + "!/assets/";
#endif
}
}
/// <summary>
/// 打包成不同平臺對應(yīng)的主包名稱
/// </summary>
private string MainABName
{
get
{
#if UNITY_EDITOR || UNITY_STANDALONE
return "StandaloneWindows";
#elif UNITY_IPHONE
return "IOS";
#elif UNITY_ANDROID
return "Android";
#endif
}
}
1、先加載主包,就是包含所有依賴信息的包。
2、通過主包文件,就可以看到當(dāng)前一共有三個ab包分別是bigrack、smallrack和rackmat,和上文創(chuàng)建的ab包一致。在上文中,把bigrack和samllrack的材質(zhì)和其他共同資源放到了rackmat包里,所以rackmat是bigrack和smallrack的依賴包。
????????????????????????????????????????????????????????????????????????依賴包信息?
3、當(dāng)加載ab包時,先通過主包查看它是否有依賴,如果有就加載它加入到字典中,方便下次再次加載,然后再加載ab包。
// 初始化,加載AssetBundleManifest,方便后面查找依賴
public void Init(string abName)
{
//加載主包
if (abMain == null)
{
abMain = AssetBundle.LoadFromFile(PathURL + MainABName);
//獲取主包下的AssetBundleManifest資源文件(存有依賴信息)
abMainfest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
}
//加載依賴
AssetBundle ab = null;
string[] dependences = abMainfest.GetAllDependencies(abName);
if (dependences.Length > 0)
{
for (int i = 0; i < dependences.Length; i++)
{
if (!m_abDic.ContainsKey(dependences[i]))
{
ab = AssetBundle.LoadFromFile(PathURL + dependences[i]);
m_abDic.Add(dependences[i], ab);
}
}
}
//加載ab包
if (!m_abDic.ContainsKey(abName))
{
ab = AssetBundle.LoadFromFile(PathURL + abName);
m_abDic[abName] = ab;
}
}
4、同步加載?
//====================同步加載方式=================
/// <summary>
/// 指定類型同步加載
/// </summary>
/// <param name="abName">ab包名</param>
/// <param name="resName">包里資源的具體名(預(yù)制體)</param>
/// <returns></returns>
public Object LoadAssetBundle(string abName, string resName)
{
Init(abName);
Object obj = m_abDic[abName].LoadAsset(resName);
return obj;
}
//泛型
public T LoadAssetBundle<T>(string abName, string resName) where T : Object
{
Init(abName);
T obj = m_abDic[abName].LoadAsset<T>(resName);
return obj;
}
5、異步加載?
//====================異步加載方式=================
/// <summary>
/// 指定類型異步加載
/// </summary>
/// <param name="abName">ab包名</param>
/// <param name="resName">包里資源的具體名(預(yù)制體)</param>
/// <param name="callBack">回調(diào)函數(shù)</param>
public void LoadAssetAsync(string abName, string resName, UnityAction<Object> callBack)
{
StartCoroutine(ReallyLoadResAsync(abName, resName, callBack));
}
private IEnumerator ReallyLoadResAsync(string abName, string resName, UnityAction<Object> callBack)
{
Init(abName);
AssetBundleRequest abRuqest = m_abDic[abName].LoadAssetAsync(resName);
yield return abRuqest;
callBack(abRuqest.asset);
}
//泛型
public void LoadAssetAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
{
StartCoroutine(ReallyLoadResAsync<T>(abName, resName, callBack));
}
private IEnumerator ReallyLoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
{
Init(abName);
AssetBundleRequest abRuqest = m_abDic[abName].LoadAssetAsync<T>(resName);
yield return abRuqest;
callBack(abRuqest.asset as T);
}
6、卸載ab包?
//====================AB包的兩種卸載方式=================
//單個包卸載
public void UnLoad(string abName)
{
if (m_abDic.ContainsKey(abName))
{
m_abDic[abName].Unload(false);
//注意緩存需一并移除
m_abDic.Remove(abName);
}
}
//所有包卸載
public void UnLoadAll()
{
AssetBundle.UnloadAllAssetBundles(true);
//注意清空緩存
m_abDic.Clear();
abMain = null;
abMainfest = null;
}
7、測試
public Transform[] bigRackPos;
public Transform[] smallRackPos;
private void Start()
{
LoadRack();
LoadRackAsync();
}
//同步加載
public void LoadRack()
{
GameObject prefab = AssetBundleLoaderMgr.Instance.LoadAssetBundle<GameObject>("smallrack", "SmallRack");
for (int i = 0; i < smallRackPos.Length; i++)
{
//實(shí)例化預(yù)設(shè)
Instantiate(prefab, smallRackPos[i].position, Quaternion.Euler(0, 90, 0));
}
}
//異步加載
public void LoadRackAsync()
{
AssetBundleLoaderMgr.Instance.LoadAssetRequest<GameObject>("bigrack", "BigRack", (obj) =>
{
for (int i = 0; i < bigRackPos.Length; i++)
{
//實(shí)例化預(yù)設(shè)
Instantiate(obj, bigRackPos[i].position, Quaternion.identity);
}
});
}
8、成功加載出ab包?
文章來源:http://www.zghlxwxcb.cn/news/detail-849544.html
注:當(dāng)前這些方法適合PC、IOS、Android項(xiàng)目加載ab包資源,對于WebGL項(xiàng)目加載ab包資源就不適用了。由于WebGL的特殊性,我會專門寫一篇針對web的ab包加載。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-849544.html
到了這里,關(guān)于Unity-AssetBundle Browser 打包和加載的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!