4.AB包的依赖包

4.AB包的依赖包


4.1 知识点

手动加载AB包的依赖包

创建红色材质球设置到cube上。材质球并没有选择打成哪个AB包。但是AB包窗口中model包自动依赖了红色材质球。



但是假如把红色材质球放到了icon包,那么就不会自动依赖到model包


点击重新生成AB包后,使用AB包同步加载cube,由于model包没有cube需要的材质,材质所在的icon包没有被加载。加载出来的cube会丢失。

AssetBundle modelAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
GameObject cube = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;
Instantiate(cube);//生成的cube会丢失依赖的材质

加载红色材质球所在的icon包,cube能正常显示了

//加载依赖包
AssetBundle iconlAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "icon");
Instantiate(cube);//生成的cube可以正常显示材质

通过主AB包的依赖关系清单文件加载AB包的依赖包

//加载主包 主包的名字和AB包生成路径一样
AssetBundle mainAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "PC");

//加载AB包依赖关系清单文件
//AssetBundleManifest是Unity中用于管理AB包依赖关系的类。
AssetBundleManifest assetBundleManifest = mainAssetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

//GetAllDependencies方法 传入AB包名得到AB包依赖的所有AB包
string[] modelDependencieAssetBundleNameArray = assetBundleManifest.GetAllDependencies("model");

//遍历依赖的所有AB包
for (int i = 0;i< modelDependencieAssetBundleNameArray.Length;i++)
{
    Debug.Log(modelDependencieAssetBundleNameArray[i]);//icon
    AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + modelDependencieAssetBundleNameArray[i]);//遍历加载所有依赖的AB包
}

GameObject cube2 = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;
Instantiate(cube2);//生成的cube因为加载了所需要的所有依赖包 不会丢失材质


4.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson04_AB包的依赖包 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 手动加载AB包的依赖包

        AssetBundle modelAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
        GameObject cube = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;
        Instantiate(cube);//生成的cube会丢失依赖的材质

        //加载依赖包
        //AssetBundle iconlAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "icon");
        //Instantiate(cube);//生成的cube可以正常显示材质

        #endregion

        #region 知识点二 通过主AB包的依赖关系清单文件加载AB包的依赖包

        //加载主包 主包的名字和AB包生成路径一样
        AssetBundle mainAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "PC");

        //加载AB包依赖关系清单文件
        //AssetBundleManifest是Unity中用于管理AB包依赖关系的类。
        AssetBundleManifest assetBundleManifest = mainAssetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        //GetAllDependencies方法 传入AB包名得到AB包依赖的所有AB包
        string[] modelDependencieAssetBundleNameArray = assetBundleManifest.GetAllDependencies("model");

        //遍历依赖的所有AB包
        for (int i = 0;i< modelDependencieAssetBundleNameArray.Length;i++)
        {
            Debug.Log(modelDependencieAssetBundleNameArray[i]);//icon
            AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + modelDependencieAssetBundleNameArray[i]);//遍历加载所有依赖的AB包
        }

        GameObject cube2 = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;
        Instantiate(cube2);//生成的cube因为加载了所需要的所有依赖包 不会丢失材质

        #endregion

    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏