3.代码加载AB包和AB包中的资源

3.使用AB包资源文件


3.1 知识点

同步加载AB包和AB包中的资源

AssetBundle.LoadFromFile同步地从指定路径加载AB包,返回加载后的AB包。

//LoadFromFile方法 同步的从指定路径加载AB包 返回加载后的AB包
//由于我们选择了StreamingAssets中多拷贝一份 可以直接从StreamingAssets加载AB包
AssetBundle modelAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//其他加载AB包的API不太常用 理解即可

//注意: 同一个AB包不能加载两次 否则报错
//The AssetBundle 'model' can't be loaded because another AssetBundle with the same files is already loaded.
//AssetBundle modelAssetBundle2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");//报错

AssetBundle.LoadAsset 同步的从一个已加载的AB包中加载指定资源

//LoadAsset方法 同步的从一个已加载的AB包中加载指定资源
//GameObject cube = modelAssetBundle.LoadAsset("Cube") as GameObject; ;//假如只传名字可能会得到同名不同类型的资源 不建议使用
//GameObject cube = modelAssetBundle.LoadAsset<GameObject>("Cube");//泛型加载 可以使用 但是Lua中不支持
GameObject cube = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;//传入资源的Type 要as成实际类型 Lua中支持
Instantiate(cube);

//同一个AB包可以用于加载多个不同资源
GameObject sphere = modelAssetBundle.LoadAsset<GameObject>("Sphere");
Instantiate(sphere);

异步加载AB包和AB包中的资源

AssetBundle.LoadFromFileAsync 异步地从指定路径加载AB包,返回异步加载AB包的类

AssetBundle.LoadAssetAsync 异步地从一个已加载的AB包中加载指定资源

IEnumerator LoadAssetBundleAsync<T>(string AssetBundleName, string resourceName, Type resourceType)
{
    //LoadFromFileAsync方法 异步的从指定路径加载AB包 返回异步加载AB包的类
    AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + AssetBundleName);
    yield return assetBundleCreateRequest;

    //LoadAssetAsync方法 异步的从一个已加载的AB包中加载指定资源
    //和同步加载类似 异步加载也有三个重载
    //异步加载AB包的类中的assetBundle属性代表已加载的AB包 返回异步加载AB包中的资源的类
    //AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName);//假如只传名字可能会得到同名不同类型的资源 不建议使用
    AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName, resourceType);//传入资源的Type
    //AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync<T>(resourceName);//泛型加载 可以使用 但是Lua中不支持
    yield return assetBundleRequest;

    //异步加载AB包中的资源的类中的asset属性代表实际加载出的资源 要as成实际类型
    image.sprite = assetBundleRequest.asset as Sprite;
}

使用协程进行异步加载

//开启协程 一定要注意传进来的Type对不对
StartCoroutine(LoadAssetBundleAsync<Sprite>("icon", "quanlity_0",typeof(Sprite)));

卸载AB包和AB包中的资源

AssetBundle.Unload 卸载指定的AB包 传入的参数是是否卸载场景上加载出来的AB包资源

//Unload方法 卸载指定的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
modelAssetBundle.Unload(false);

AssetBundle.UnloadAllAssetBundles 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源。

//UnloadAllAssetBundles方法 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
AssetBundle.UnloadAllAssetBundles(false);

3.2 知识点代码

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

public class Lesson03_使用AB包资源文件 : MonoBehaviour
{
    public Image image;

    void Start()
    {
        #region 知识点一 同步加载AB包和AB包中的资源

        //LoadFromFile方法 同步的从指定路径加载AB包 返回加载后的AB包
        //由于我们选择了StreamingAssets中多拷贝一份 可以直接从StreamingAssets加载AB包
        AssetBundle modelAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
        //其他加载AB包的API不太常用 理解即可

        //注意: 同一个AB包不能加载两次 否则报错
        //The AssetBundle 'model' can't be loaded because another AssetBundle with the same files is already loaded.
        //AssetBundle modelAssetBundle2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");//报错

        //LoadAsset方法 同步的从一个已加载的AB包中加载指定资源
        //GameObject cube = modelAssetBundle.LoadAsset("Cube") as GameObject; ;//假如只传名字可能会得到同名不同类型的资源 不建议使用
        //GameObject cube = modelAssetBundle.LoadAsset<GameObject>("Cube");//泛型加载 可以使用 但是Lua中不支持
        GameObject cube = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;//传入资源的Type 要as成实际类型 Lua中支持
        Instantiate(cube);

        //同一个AB包可以用于加载多个不同资源
        GameObject sphere = modelAssetBundle.LoadAsset<GameObject>("Sphere");
        Instantiate(sphere);

        #endregion

        #region 知识点二 异步加载AB包和AB包中的资源

        //开启协程 一定要注意传进来的Type对不对
        StartCoroutine(LoadAssetBundleAsync<Sprite>("icon", "quanlity_0",typeof(Sprite)));

        #endregion

        #region 知识点三 卸载AB包和AB包中的资源

        //Unload方法 卸载指定的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
        modelAssetBundle.Unload(false);

        //UnloadAllAssetBundles方法 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
        AssetBundle.UnloadAllAssetBundles(false);

        #endregion
    }

    #region 知识点二 异步加载AB包和AB包中的资源
    IEnumerator LoadAssetBundleAsync<T>(string AssetBundleName, string resourceName, Type resourceType)
    {
        //LoadFromFileAsync方法 异步的从指定路径加载AB包 返回异步加载AB包的类
        AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + AssetBundleName);
        yield return assetBundleCreateRequest;

        //LoadAssetAsync方法 异步的从一个已加载的AB包中加载指定资源
        //和同步加载类似 异步加载也有三个重载
        //异步加载AB包的类中的assetBundle属性代表已加载的AB包 返回异步加载AB包中的资源的类
        //AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName);//假如只传名字可能会得到同名不同类型的资源 不建议使用
        AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName, resourceType);//传入资源的Type
        //AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync<T>(resourceName);//泛型加载 可以使用 但是Lua中不支持
        yield return assetBundleRequest;

        //异步加载AB包中的资源的类中的asset属性代表实际加载出的资源 要as成实际类型
        image.sprite = assetBundleRequest.asset as Sprite;
    }
    #endregion

    #region 知识点三 卸载AB包和AB包中的资源

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            //UnloadAllAssetBundles方法 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
            AssetBundle.UnloadAllAssetBundles(true);
        }
    }

    #endregion
}

3.3 练习题

如何解决AB包不允许重复加载的问题?

用字典记录已加载的AB包,如果存在则不重复加载。如果要记录,那么一定要提供卸载的方法。



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

×

喜欢就点赞,疼爱就打赏