Asset Bundle资源的加载与使用

本文详细介绍了Unity中AssetBundle的加载与卸载方法,包括同步加载、异步加载以及依赖关系处理。通过AssetBundle.LoadFromFile和LoadFromFileAsync函数加载资源,使用Unload释放资源,确保游戏性能。同时,还展示了如何处理AssetBundle间的依赖关系,以避免资源丢失问题。
摘要由CSDN通过智能技术生成

Asset Bundle的资源加载与使用

资源加载 与 卸载

AB加载方式:

  • AssetBundle.LoadFromFile 从本地加载
	// 以编辑器为使用案例, AB包的资源拷贝到了 streamingAssetsPath 的目录下, 加载AB包资源操作如下
	// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
	string path = Application.streamingAssetsPath + "/" + "common/main.ab";
	AssetBundle ab = AssetBundle.LoadFromFile(path);
  • AssetBundle.LoadFromFileAsync 异步加载
    void Start()
    {
        StartCoroutine(LoadABPackRes());
    }

    IEnumerator LoadABPackRes()
    {
    	// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
		// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
		string path = Application.streamingAssetsPath + "/" + "common/main.ab";
        AssetBundleCreateRequest abPack = AssetBundle.LoadFromFileAsync(path);
        yield return abPack;
        // TODD 操作使用已加载的AB包资源 abPack 
    }
  • 注意事项:已经加载过的AB包,不可重复加载,重复加载会报错

Asset Bundle 使用

    void Start()
    {
    	// AssetBundle.LoadFromFile加载AB包
        AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "common/main.ab");
        // 使用 LoadAsset 泛型的方法(lua不支持泛型,只能再C#) 获取AB包中的资源
        GameObject obj = ab.LoadAsset<GameObject>("Sphere");
        // 实例资源
        Instantiate(obj);

		// 异步加载AB包资源
        StartCoroutine(LoadABPackRes());
    }

    IEnumerator LoadABPackRes()
    {
    	// AssetBundle.LoadFromFileAsync 异步加载AB资源
        AssetBundleCreateRequest abLoad = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + "mode/base_mode.ab");
        yield return abLoad;
        // abLoad.assetBundle.LoadAssetAsync 异步加载资源,使用typeof转换类型, lua常用方式
        AssetBundleRequest abRes = abLoad.assetBundle.LoadAssetAsync("Cube", typeof(GameObject));
        yield return abRes;
        // 实例资源
        GameObject obj = abRes.asset as GameObject;
        Instantiate(obj);
    }

Asset Bundle 卸载

  • AssetBundle.Unload 卸载当前包资源
	// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
	//如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
    string path = Application.streamingAssetsPath + "/" + "common/main.ab";
    AssetBundle abPack = AssetBundle.LoadFromFile(path);
    
    // 卸载当前已经已加载abPack的AB包, 参数true表示卸载AB包时,同时卸载掉所有的资源引用, false则只卸载AB包,不卸载掉当前已经使用的资源
    abPack .Unload(true);
  • AssetBundle.UnloadAllAssetBundles 卸载所有AB包资源
	// 卸载所有已加载的AB包, 参数true表示卸载AB包时,同时卸载掉所有的资源引用, false则只卸载AB包,不卸载掉当前已经使用的资源
	AssetBundle.UnloadAllAssetBundles(true);

AB包存在依赖关系的使用

依赖关系:一个AB包(M包)中的资源用到了其他AB包(P包)中的资源,这种就指 A包 依赖了 B包,所以在使用M包中存在依赖P包的资源时,需要同时加载M包、P包两个AssetBundle,不会就会存在资源丢失的问题。ab包依赖关系如图:
在这里插入图片描述

依赖包的加载方式
  • 使用AssetBundle.LoadFromFile同时加载依赖的AB包
	// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
	// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
	string path_1 = Application.streamingAssetsPath + "/common/main.ab";
    AssetBundle ab_1 = AssetBundle.LoadFromFile(path_1 );
    
    string path_2 = Application.streamingAssetsPath + "/mode/base_mode.ab";
	AssetBundle ab_2 = AssetBundle.LoadFromFileAsync(path_2 );
  • 使用主包中缓存的依赖关系,同时加载其存在依赖包的其他包
    PC 是在AB包打包后,自动会生成所有AB包的相关信息,其中包含就包含有AB包之间的依赖关系
    在这里插入图片描述
	// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
	// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
	// PC 是在AB包打包后,自动会生成所有AB包的相关信息,其中包含就包含有AB包之间的依赖关系
    string sMainPath = Application.streamingAssetsPath + "/PC";
    AssetBundle abMain = AssetBundle.LoadFromFile(sMainPath);
    // 获取主文件AB包相关的信息,其类型固定是 AssetBundleManifest
    AssetBundleManifest abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
    // 获取这个 mode/base_mode.ab 的依赖关系
    string[] sRelyon = abManifest.GetAllDependencies("mode/base_mode.ab");
    for(int i = 0; i < sRelyon.Length; i++)
    {
    	// 输出mode/base_mode.ab的其他依赖包文件名
        Debug.Log(sRelyon[i]);
    }

输出效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值