• 【Unity】AssetBundle加载与卸载


    unity官方apiAssetBundle-LoadFromFileAsync - Unity 脚本 API

    异步加载AB包

    1. using UnityEngine;
    2. using System.Collections;
    3. using System.IO;
    4. public class LoadFromFileAsyncExample : MonoBehaviour
    5. {
    6. IEnumerator Start()
    7. {
    8. var bundleLoadRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
    9. yield return bundleLoadRequest;
    10. var myLoadedAssetBundle = bundleLoadRequest.assetBundle;
    11. if (myLoadedAssetBundle == null)
    12. {
    13. Debug.Log("Failed to load AssetBundle!");
    14. yield break;
    15. }
    16. var assetLoadRequest = myLoadedAssetBundle.LoadAssetAsync("MyObject");
    17. yield return assetLoadRequest;
    18. GameObject prefab = assetLoadRequest.asset as GameObject;
    19. Instantiate(prefab);
    20. myLoadedAssetBundle.Unload(false);
    21. }
    22. }

    需要注意的是同一个ab包一次只能加载一个,不可以同时加载,

    报错:The AssetBundle 'xxxxx' can't be loaded because another AssetBundle with the same files is already loaded.

    如果AB包已经加载过则先进行卸载:

    1. if (myLoadedAssetBundle != null)
    2. {
    3. myLoadedAssetBundle.Unload(false);//关键代码
    4. }

    卸载AB包

    1、卸载全部的目前没有使用的资源: Resources.UnloadUnusedAssets()

    2、卸载 AssetBundle 释放其数据: AssetBundle.Unload(true/false);

    3、卸载当前已加载的所有 AssetBundle: AssetBundle.UnloadAllAssetBundles(true/false)

    当 为 false 时,将释放当前加载的捆绑包中的压缩文件数据,但已从捆绑包中加载的任何对象实例将保持不变。
    UnloadAllAssetBundles不会中断异步加载过程,如果已经在进行异步加载了此时调用AssetBundle.UnloadAllAssetBundles,那么这个AB包还是会加载出来。

    1. using UnityEngine;
    2. public class AssetBundleManager : MonoBehaviour
    3. {
    4. public void LoadAssetBundle(string bundleName)
    5. {
    6. AssetBundle bundle = AssetBundle.LoadFromFile(bundleName);
    7. if (bundle != null)
    8. {
    9. // 假设你有一个你想要加载的资源的名字
    10. string assetName = "myAsset";
    11. UnityEngine.Object asset = bundle.LoadAsset(assetName);
    12. // 使用 asset ...
    13. // 卸载AssetBundle
    14. bundle.Unload(false);
    15. // 如果确定没有其他引用,可以进一步释放内存
    16. Resources.UnloadUnusedAssets();
    17. System.GC.Collect();
    18. }
    19. }
    20. }

  • 相关阅读:
    java 单元测试Junit
    使用4G模块(EC200T)发送UDP数据到内网PC端(内网穿透)
    SpringBoot是如何做到自动装配的
    SIMetrix 8.30 电路仿真软件用表达式为元器件值赋值的方法
    Python学习 - 类与对象
    6.2 Sunday搜索内存特征
    Linux .dhpcd导致cpu飙升问题
    错误:ModuleNotFoundError: No module named ‘httplib‘
    day2324_jdbc
    leetcode 算法-二叉树java总结——正在更新
  • 原文地址:https://blog.csdn.net/qq_35064654/article/details/138170800