AssetBundle加载资源二:加载ab包并加载到场景(包含一,打包+加载)

放在Editor文件夹下的编辑器扩展脚本,用于打包ab包,输出目录为StreamingAssets文件夹下
BuildAssetBundle .cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;

namespace FWork
{
   
    public class BuildAssetBundle 
    {
   
        public static KeyValueInfo keyValueList = null;//存储设置label的ab配置数据
        /// <summary>
        /// 打包生成所有AssetBundles
        /// </summary>
        [MenuItem("AssetBundleTools/BuildAllAssetBundles")]
        public static void BuildAllAB()
        {
   
            //(打包)AB的输出路径
            string strABOutPathDIR = "";
            BuildTarget buildTarget = BuildTarget.NoTarget;
            buildTarget = GetActiveBuildTarget();
            strABOutPathDIR = PathManger.GetABOutFile();
            if (!Directory.Exists(strABOutPathDIR))
            {
   
                Directory.CreateDirectory(strABOutPathDIR);
            }
            
            //打包生成
            BuildPipeline.BuildAssetBundles(strABOutPathDIR, BuildAssetBundleOptions.ChunkBasedCompression, buildTarget);
            AssetDatabase.Refresh();
            Debug.Log("AB资源打包完成-文件路径:" + strABOutPathDIR);
        }

        /// <summary>
        ///  删除AssetBundle包文件
        /// </summary>
        [MenuItem("AssetBundleTools/DeleteAllAssetBundles")]
        public static void DeleteAllABs()
        {
   
            //(打包)AB的输出路径
            string strNeedDeleteDIR = "";

            strNeedDeleteDIR = PathManger.GetABOutFile();
            if (!string.IsNullOrEmpty(strNeedDeleteDIR))
            {
   
                try
                {
   
                    //参数true 表示可以删除非空目录。
                    Directory.Delete(strNeedDeleteDIR, true);
                    //去除删除警告
                    File.Delete(strNeedDeleteDIR + ".meta");
                    //刷新
                    AssetDatabase.Refresh();
                    Debug.Log("资源删除完成!");
                }
                catch (System.Exception)
                {
   
                    Debug.Log(strNeedDeleteDIR+"文件夹不存在");
                }             
            }          
        }


        /// <summary>
        /// (自动)给资源文件(预设)添加标记
        /// </summary>
        [MenuItem("AssetBundleTools/Set AB Label")]
        public static void SetABLabels()
        {
   
            keyValueList = new KeyValueInfo();
            keyValueList.KeyValueList = new List<KeyValueNode>();
            keyValueList.KeyValueList.Clear();
            //需要给AB做标记的根目录
            string strNeedSetABLableRootDIR = "";
            //目录信息
            DirectoryInfo[] dirScenesDIRArray = null;

            //清空无用AB标记
            AssetDatabase.RemoveUnusedAssetBundleNames();
            //定位需要打包资源的文件夹根目录。
            strNeedSetABLableRootDIR = PathManger.GetABResoursesPath();
            DirectoryInfo dirTempInfo = new DirectoryInfo(strNeedSetABLableRootDIR);
            dirScenesDIRArray = dirTempInfo.GetDirectories();
            //遍历每个“场景”文件夹(目录)
            foreach (DirectoryInfo currentDIR in dirScenesDIRArray)
            {
   
                //遍历本场景目录下的所有的目录或者文件,
                //如果是目录,则继续递归访问里面的文件,直到定位到文件。
                string tmpScenesDIR = strNeedSetABLableRootDIR + "/" + currentDIR.Name;//res/**
                DirectoryInfo tmpScenesDIRInfo = new DirectoryInfo(tmpScenesDIR);  //场景目录信息res/**/**
                int tmpIndex = tmpScenesDIR.LastIndexOf("/");
                string tmpScenesName = tmpScenesDIR.Substring(tmpIndex + 1);         //场景名称
                //递归调用与处理目录或文件系统,如果找到文件,修改AssetBundle 的标签(label)
                JudgeDIROrFileByRecursive(currentDIR, tmpScenesName);
            }//foreach_end
            //将生成的bundle名与资源名添加到json文件
            JsonConfigManger.DataToJson(PathManger.jsonInfoPath, keyValueList);
            Debug.Log("Json数据配置完成!");
            //刷新
            AssetDatabase.Refresh();
            //提示
            Debug.Log("AssetBundles 标签设置完成!");
        }

        /// <summary>
        /// 递归调用与处理目录或文件系统
        /// 1:如果是目录,则进行递归调用。
        /// 2:如果是文件,则给文件做“AB标记”
        /// </summary>
        /// <param name="dirInfo">目录信息</param>
        /// <param name="scenesName">场景名称</param>
        private static void JudgeDIROrFileByRecursive(FileSystemInfo fileSysInfo, string scenesName)
        {
   
            if (!fileSysInfo.Exists)
            {
   
                Debug.LogError("文件或目录名称: " + fileSysInfo.Name + " 不存在,请检查!");
                return;
            }

            //得到当前目录下一级的文件信息集合
            DirectoryInfo dirInfoObj = fileSysInfo as DirectoryInfo;
            FileSystemInfo[] fileSysArray = dirInfoObj.GetFileSystemInfos();
            foreach (FileSystemInfo fileInfo in fileSysArray)
            {
   
                FileInfo fileInfoObj = fileInfo as FileInfo;
                //文件类型
                if (fileInfoObj != null)
                {
   
                    //修改此文件的AssetBundle的标签
                    // SetFileABLabel(fileInfoObj, scenesName);
                    SetFileABLabel(fileInfoObj, dirInfoObj.Name);
                }
                //目录类型
                else
                {
   
                    //递归下一层
                    JudgeDIROrFileByRecursive(fileInfo, scenesName);
                }
            }       
        }

        /// <summary>
        /// 修改文件的AssetBundle 标记
        /// </summary>
        /// <param name="fileInfo">文件信息</param>
        /// <param name="scenesName">场景名称</param>
        private static void SetFileABLabel(FileInfo fileInfo, string prefabName)
        {
   
            //AssetBundle 包名称
            string strABName = string.Empty;
            //(资源)文件路径(相对路径)
            string strAssetFilePath = string.Empty;

            //参数检查
            if (fileInfo.Extension == ".meta") return;
            //得到AB包名
            //  strABName = GetABName(fileInfo, prefabName).ToLower();
            
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值