【Unity_AssetBundle】(四)什么是依赖?怎样加载依赖包?

1.什么是依赖?

概念:
在包中的一个对象资源,如果关联了另一个对象资源
会自动把另一个资源打在同一个包中

例:
现有一个Cube:在这里插入图片描述
已经把他打入名为“model”的AB包中
现在为Cube创建一个材质球在这里插入图片描述关联给Cube
打开AB包查看器:
可以看到,材质球并没有手动打入model的AB包中
但他自动关联进去了
在这里插入图片描述

2.依赖包

概念:
一个资源身上用到了别的AB包中的资源
这时,如果只加载资源自己的AB包,会出现资源丢失
此时需要把依赖包也一起加载!

那么问题来了
如果这个资源的依赖包非常多, 我不知道都用了哪个包里的资源呢?
这时就要利用"主包"来获取依赖信息
在这里插入图片描述

现在把材质球打进一个新包"material"中去
而"model"包中的Cube需要用到此材质球
也就是说 material包是model包的依赖包
在这里插入图片描述

public class ABTest : MonoBehaviour
{
    void Start()
    {
        //第一步:加载model包
        AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath +  "/" + "model");

        //第二步:加载依赖包信息
        //  1.加载主包
        AssetBundle abMain =  AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "PC");
        //  2.加载主包中的固定文件
        //      (固定写法,死死记住即可)
        AssetBundleManifest abMainfest =  abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        //  3.从固定文件中得到依赖信息
        //      (想得到哪个包的依赖信息 就把哪个包的包名传入)
        string[] strs = abMainfest.GetAllDependencies("model");

        //第三步:加载依赖包
        for (int i = 0; i < strs.Length; i++)
        {
            print("model的依赖包有:" + strs[i]);
            AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" +  strs[i]);
        }

        //实例化Cube,看是否有材质
        Instantiate(ab.LoadAsset<GameObject>("Cube"));
    }
}

运行:材质正常加载了
在这里插入图片描述在这里插入图片描述

补充
这个方法有小缺点
只能找到这个"包"依赖了哪些包,包中的所有资源都会参与寻找
而不是找到某个特定"资源"依赖了哪些包

用文本编辑器打开主包配置文件,可以看到此特性
在这里插入图片描述

Unity中,自定义AssetBundle依赖是通过AssetBundleManifest来管理的。AssetBundleManifest是一个含了所有AssetBundle依赖关系的文件。 首先,你需要创建一个AssetBundleBuild结构体来定义你的AssetBundle。在这个结构体中,你可以指定AssetBundle的名称、构建的资源列表以及依赖的AssetBundle。 然后,你可以使用BuildPipeline.BuildAssetBundles方法来构建你的AssetBundle。这个方法会返回一个AssetBundleManifest对象,其中含了所有AssetBundle依赖关系信息。 接下来,你可以使用AssetBundleManifest对象来获取指定AssetBundle的所有依赖AssetBundle。通过调用GetAllDependencies方法,你可以获取指定AssetBundle依赖的所有其他AssetBundle的名称。 最后,你可以加载这些依赖的AssetBundle并使用其中的资源。 以下是一个示例代码: ```csharp // 定义一个AssetBundleBuild结构体 AssetBundleBuild build = new AssetBundleBuild(); build.assetBundleName = "myassetbundle"; build.assetNames = new string[] { "Assets/MyResource.prefab" }; build.assetBundleVariant = "variant"; build.addressableNames = new string[] { "MyResource" }; // 构建AssetBundle BuildPipeline.BuildAssetBundles("Assets/AssetBundles", new AssetBundleBuild[] { build }, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); // 获取AssetBundleManifest var manifest = BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows).manifest; // 获取指定AssetBundle依赖关系 string[] dependencies = manifest.GetAllDependencies("myassetbundle"); // 加载依赖的AssetBundle foreach (string dependency in dependencies) { AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, dependency)); } // 使用资源 GameObject myResource = Instantiate(AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetbundle"))); ``` 这是一个简单的示例,你可以根据你的项目需求进行相应的修改和扩展。希望能帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值