必知:
①真正打包出去的时候,和Assets同级的文件夹AssetsBundle里面的资源肯定不会被打包出去。
②所以我们选择拷贝的StreamingAssets文件夹。会随着U3D打包出去的时候打包出去,不会对文件进行压缩。在PC平台可读可写,在IOS和Android只读。

AB包同步加载案例

image.png

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ABTest : MonoBehaviour
  5. {
  6. //AB包同步加载案例:
  7. void Start()
  8. {
  9. //第一步 加载AB包
  10. AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
  11. //第二部 加载AB包中的资源
  12. //只是使用名字加载 会使用 同名不同类型资源 分不清
  13. //建议大家用1泛型加载 或者 是 Type指定类型
  14. GameObject obj = ab.LoadAsset<GameObject>("Cube");//此处利用泛型(Lua不支持泛型)
  15. //GameObject obj = ab.LoadAsset("Cube", typeof(GameObject)) as GameObject;
  16. //------>到此处只是加载出来而已
  17. Instantiate(obj);//实例化
  18. //AB包不能重复加载,否则报错
  19. //卸载所有加载的AB包方法:
  20. //1.为true时,场景中如果有资源是通过AB加载的,会一起被卸载(场景物体丢失)
  21. //2.为false时,场景物体不管,只卸载AB包。
  22. AssetBundle.UnloadAllAssetBundles(false);
  23. //卸载单个AB包方法:
  24. ab.Unload(false);
  25. }
  26. }

AB包异步加载案例

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ABTest : MonoBehaviour
  5. {
  6. public Image img;
  7. void Start()
  8. {
  9. //异步加载->协程
  10. StartCoroutine(LoadABRes("image","image_1"));
  11. }
  12. IEnumerator LoadABRes(string ABName,string resName)
  13. {
  14. //第一步 加载AB包
  15. AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
  16. yield return abcr;
  17. //第二部加载资源
  18. AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync(resName, typeof(Sprite));
  19. yield return abq;
  20. img.sprite = abq.asset as Sprite;
  21. //此处两个yield return,至少要等待两帧
  22. }
  23. }