【Unity_AssetBundle】(三)从AB包中同步加载资源、异步加载资源的方法

1.同步加载

现在有一个名为"model"的包,里面有一个Cube模型资源
在这里插入图片描述
脚本:

public class ABTest : MonoBehaviour
{
    
    
    void Start()
    {
    
    
        //第一步:加载AB包
        //  注意:同一AB包不能重复加载,否则报错
        //  传入AB包的路径(因为Build时勾选了"Copy to StreamingAssets",所以直接从此路径加载)
        AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath +  "/" + "model");

        //第二步:加载AB包中的资源
        //  只使用资源名加载 会出现同名不同类型资源分不清楚
        //  建议使用泛型 或 Type指定类型加载
        GameObject obj = ab.LoadAsset<GameObject>("Cube");
        //实例化查看
        Instantiate(obj);
    }
}

运行:
在这里插入图片描述

2.异步加载

public class ABTest : MonoBehaviour
{
    
    
    void Start()
    {
    
    
        //开启携程
        StartCoroutine(LoadABRes("model", "Cube"));
    }

    /// <summary>
    /// 异步加载AB包资源
    /// </summary>
    /// <param name="ABName">包名</param>
    /// <param name="resName">资源名</param>
    /// <returns></returns>
    IEnumerator LoadABRes(string ABName, string resName)
    {
    
    
        //第一步:加载AB包
        AssetBundleCreateRequest abcr =  AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
        yield return abcr;//等待加载完

        //第二步:加载AB包里的资源
        AssetBundleRequest abr =  abcr.assetBundle.LoadAssetAsync<GameObject>(resName);
        yield return abr; //等待加载完

        //第三步:使用资源
        //  注意 AssetBundleRequest.asset时万物之父object,使用时要as成对应类型
        GameObject obj = abr.asset as GameObject;
        Instantiate(obj);
    }
}

运行:
在这里插入图片描述

3.卸载AB包

卸载所有加载的AB包:

        //填true:如果场景中有资源是通过AB包加载的,会一起把它卸载
        //填false:只卸载AB包,场景中的资源不受影响,一般填false
        AssetBundle.UnloadAllAssetBundles(false);

只卸载自己:

        //参数同上
        AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath +  "/" + "model");
        ab.Unload(false);

猜你喜欢

转载自blog.csdn.net/SEA_0825/article/details/127253642