• 第51天-AssetBundle(AB包)


    笔记:

    一.直接导入Project文件下

    二.打开window工具栏下的AssetBundle Browser,如果有则导入成功

    三,创建AB包

    1.创建资源,选择New名字,名字不区分大小写

    2.打开window工具栏下的AssetBundle Browser

    3.选择要构建的平台,建立AB包文件

    4.如果没有报错,则表示创建成功,会在Assets同级目录下生成AssetBundles文件夹,打开该文件夹下一级目录的名字和Output Path最后一级名字相同

     

    5.打开后里面有4个文件

    6.写代码载入

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class LessonAB : MonoBehaviour
    {
    
        // Use this for initialization
        void Start () {
            //1.加载AB包
            AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/StandaloneWindows/Prefabs");                
            //AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath  + "/Prefabs");  //或者streamingAssetsPath路径下的
    
            //2.从ab保重加载资源
            GameObject cubePrefab = ab.LoadAsset<GameObject>("Cube");
            //3.克隆显示预制体
            Instantiate(cubePrefab);
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    }

    AB包管理器:ABManager

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    /// <summary>
    /// AB包的管理器, 单例类, 需要继承MonoBehaviour,异步加载时需要使用协同程序
    /// </summary>
    public class ABManager : AutoMonoSingle<ABManager>
    {
    
        //解决不重复加载的问题, 将加载进来的AB包存储到一个字典中
        //键: ab包的名字,  值: ab包
        private Dictionary<string, AssetBundle> loaded
            = new Dictionary<string, AssetBundle>();
    
        //加载AB包的路径
        private string path;
    
        public string Path
        {
            get {
                if (path == null || path == "")
                {
                    //根据平台的不同,使用不同的路径
    #if UNITY_EDITOR || UNITY_STRANDALONE_WIN
                    path = Application.streamingAssetsPath + "/";
    #else
                    path = Application.persistentDataPath + "/";
    #endif
                }
                return path;
            }
        }
    
        //解决加载AB包的同时,加载依赖, 依赖是从主包来的
    
        //平台不同,主包的名字不同
        public string MainABName
        {
            get {
    #if UNITY_STANDALONE_WIN
                return "StandaloneWindows";
    #elif UNITY_ANDROID
                return "Android";
    #elif UNITY_IOS
                return "iOS";
    #else
                return "Main";
    #endif
            }
        }
    
        /// <summary>
        /// 主包单独存储, 经常使用
        /// </summary>
        private AssetBundle main;
        /// <summary>
        /// 从中获取每个ab包的依赖, 经常使用
        /// </summary>
        private AssetBundleManifest manifest;
    
    
        /// <summary>
        /// 通过AB包的名字加载AB包
        /// </summary>
        /// <param name="abName">AB包的名字</param>
        /// <returns></returns>
        public AssetBundle Load(string abName)
        {
            AssetBundle ab = null;
            //判断ab包是否加载过
            if (!loaded.TryGetValue(abName, out ab))
            {
                //未加载过加载
                //加载主包与Manifest
                //判断主包是否加载过
                if (main == null)
                {
                    main = AssetBundle.LoadFromFile(Path + MainABName);
                }
                if (manifest == null)
                {
                    manifest = main.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
                }
    
                //通过Manifest获取AB包的依赖
                string[] deps = manifest.GetAllDependencies(abName);
    
                //加载AB包前, 先加载AB包对应的依赖的AB包
                foreach (string depName in deps)
                {
                    //不能递归加载依赖项, 如果两个AB包相互依赖,那么最终递归就没有跳出条件
                    //Load(depName);  两个包互相依赖的情况下,直接死递归
    
                    //判断依赖是否加载过
                    if (!loaded.ContainsKey(depName))
                    {
                        AssetBundle depAB = AssetBundle.LoadFromFile(Path + depName);
                        //将依赖的AB包存储到字典中
                        loaded.Add(depName, depAB);
                    }
                }
    
                //再加载当前要加载的AB包
                ab = AssetBundle.LoadFromFile(Path + abName);
                //添加到字典中
                loaded.Add(abName, ab);
            }
            return ab;
        }
    
        /// <summary>
        /// 卸载指定名字的AB包
        /// </summary>
        /// <param name="abName">AB包的名字</param>
        /// <param name="unloadAllLoadedObjects">是否同时卸载从AB包中加载的资源</param>
        public void Unload(string abName, bool unloadAllLoadedObjects = false)
        {
            AssetBundle ab = null;
            //判断是否加载过
            if (loaded.TryGetValue(abName, out ab))
            {
                //只有获取到AB包的情况下才卸载
                ab.Unload(unloadAllLoadedObjects);
                //将其中字典中移除
                loaded.Remove(abName);
            }
        }
    
        /// <summary>
        /// 卸载所有的AB包
        /// </summary>
        /// <param name="unloadAllLoadedObjects"></param>
        public void UnloadAll(bool unloadAllLoadedObjects = false)
        {        
            //遍历加载过的所有的AB包,依次卸载
            foreach (var ab in loaded.Values)
            {
                ab.Unload(unloadAllLoadedObjects);
            }
            //清空字典
            loaded.Clear();
        }
    
    
        /// <summary>
        /// 非泛型的,从指定的AB包中加载指定的资源 
        /// </summary>
        /// <param name="abName">AB包的名字</param>
        /// <param name="assetName">资源的名字</param>
        /// <returns></returns>
        public Object LoadAsset(string abName, string assetName)
        {
            //加载AB包
            AssetBundle ab = Load(abName);
            //再从AB包中加载资源
            if (ab != null)
            {
                return ab.LoadAsset(assetName);
            }
            return null;
        }
    
        /// <summary>
        /// 泛型,从指定的AB包中加载指定的资源
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="abName"></param>
        /// <param name="assetName"></param>
        /// <returns></returns>
        public T LoadAsset<T>(string abName, string assetName) where T : Object
        {
            //加载AB包
            AssetBundle ab = Load(abName);
            //再从AB包中加载资源
            if (ab != null)
            {
                return ab.LoadAsset<T>(assetName);
            }
            return default(T);
        }
    
    }
  • 相关阅读:
    关键两招就解决Wampserver 打开localhost显示IIS7图片问题
    死磕!Windows下Apache+PHP+phpmyadmin的配置
    宝塔linux面板运行jsp文件的配置工作
    Python关于self用法重点分析
    Atom窗口切换和放大或者缩小
    容易掉坑的地方The value for the useBean class attribute XXX is invalid
    JS 之如何在插入元素时插在原有元素的前面而不是末尾
    ul或者ol中添加li元素
    页面右下角广告
    getAttribute与setAttribute
  • 原文地址:https://www.cnblogs.com/yifengs/p/14536423.html
Copyright © 2020-2023  润新知