AssetsBundle简单打包(根据文件夹打包,未打包依赖)

  • AssetsBundle简单打包(根据文件夹打包,未打包依赖)
    • Ⅰ.什么叫打包
    • Ⅱ.为什么要对资源进行打包
    • Ⅲ.简单文件夹打包工具介绍
      • 一.总体介绍
      • 二.打包最基本的代码流程
      • 三.拓展基本流程
      • 四.拓展流程代码实现过程
        • 1.大体流程
        • 2.细节流程
          • (1)递归遍历选中目录的所有子文件夹找到资源文件夹。
          • (2)在该文件夹遍历所有的文件进行后缀过滤并保存下来。
          • (3)对保存下来的文件列表进行打包。
    • Ⅳ.总结
    • Ⅴ.代码资源和使用方法

Ⅰ.什么叫打包

打包就是将一些资源压缩

Ⅱ.为什么要对资源进行打包

因为在实际的游戏商业开发中,美术资源很大,如果直接把资源打成apk的包,那么会导致包很大,而且加载起来也十分消耗性能。引入资源打包,可以对资源进行压缩,直接减小apk包的容量。况且打包以后在游戏运行的过程中,可以用到哪个模块加载哪个模块的资源,也会大大降低性能消耗,比如王者荣耀的万象天宫的不同模式下载就是这样。

Ⅲ.简单文件夹打包工具介绍

一.总体介绍

今天本文介绍的打包工具是根据CSDN中神码编程大佬的代码进行了一些修改。神码编程大佬的打包工具,通过填写资源个数,然后选择对应的资源,最后对这些资源打包。详情请看下面的链接,链接: Unity 5.X扩展编辑器之打包assetbundle.
而我修改过后的打包工具则是通过选择文件夹和要打包文件的后缀名进行打包。先找到资源的最深层的文件夹也就是没有子文件夹的文件夹,根据那个文件夹以及配置的后缀选择资源文件,然后对其内部的资源进行打包。

二.打包最基本的代码流程

引用神码编程大佬的博客引用神码编程大佬的博客

三.拓展基本流程

根据上面说的我们已经了解了打包的大体流程,但是为了方便,我们不能仅仅只写上面的代码,我们的需求是针对不同的文件夹从而对不同类型的文件进行打包,就如这样
在这里插入图片描述 Animation里面放后缀是anim的文件
AnimationCtrl里面放后缀是Controller的文件
Prefab里面放后缀是prefab的文件
而且prefab文件夹里面还有子文件夹在这里插入图片描述
就比如上图,我们需要将这四个文件打包成一个叫prefab2的AB包

四.拓展流程代码实现过程

1.大体流程

(1)递归遍历选中目录的所有子文件夹找到没有子文件夹的文件夹。
(2)在该文件夹遍历所有的文件进行后缀过滤并保存下来。(.meta文件不能打包进去哟)
(3)对保存下来的文件列表进行打包。

2.细节流程

(1)递归遍历选中目录的所有子文件夹找到资源文件夹。

直接上代码,里面有注释~~,总体的思路大概是这样的
首先找传入目录的

 private static List<string> lastFolder = new List<string>();//不能声明局部变量,会造成子文件夹消失
 //参数是选择的目录,返回资源文件夹的list,也就是最后文件夹的list
 public static List<string> GetSubDirectory(string strFolder)
 {
 if (string.IsNullOrEmpty(strFolder)) return null;
        DirectoryInfo directoryInfo = new DirectoryInfo(strFolder);
        DirectoryInfo[] a = directoryInfo.GetDirectories();//找子文件夹
        if (directoryInfo.GetDirectories().Length == 0)//如果没有子目录直接把该目录加到lastFolder
        {
            lastFolder.Add(strFolder);
            return lastFolder;
        }
        foreach (DirectoryInfo NextFolder in directoryInfo.GetDirectories())
        {
            if (NextFolder.GetDirectories().Length != 0)//递归遍历子目录
            {
                GetSubDirectory(NextFolder.FullName);
            }
            else//如果到了最后一个那么调用其重载函数
            {
                GetSubDirectory(NextFolder.FullName, lastFolder);
            }
        }
        return lastFolder;
 }
 

//重载函数,将文件全名添加到lastFolder
 private static List<string> GetSubDirectory(string FullName, List<string> lastFolder)
 {
  if (!lastFolder.Contains(FullName))
            lastFolder.Add(FullName);
        // Debug.Log(FullName);
        return lastFolder;
 }
(2)在该文件夹遍历所有的文件进行后缀过滤并保存下来。

该代码通过我们设置的规定文件后缀来筛选文件并弄到一个Filelist中
其中的比较麻烦的点就是对于路径的字符串操作了,但是可以使用断点调试的方法来一步步弄会简单一点。

 private string[] CollectFiles(string folder, string filter)
 {
    string fixedFolder = folder.Replace("\\", "/");
     string[] itemspilt = fixedFolder.Split('/');
        string CheckString = "Assets";
        int removePoint = Array.LastIndexOf(itemspilt, CheckString);//检测选择的目录
        string strFileName = "";
         for (int m = removePoint + 1; m < itemspilt.Length - 1; m++)
        {
            strFileName += itemspilt[m] + "/";
        }
         strFileName += itemspilt[itemspilt.Length - 1];//到这里是asset下的目录
        //fixedFolder = fixedFolder.Replace("Assets/", "");
        string searchPath = Application.dataPath + "/" + strFileName;
        string[] fileEntries = null;
        //fileEntries = Directory.GetFiles(searchPath, filter, SearchOption.TopDirectoryOnly);
        fileEntries = System.IO.Directory.GetFiles(searchPath, filter, SearchOption.AllDirectories);//筛选文件
        List<string> filesList = new List<string>();
        foreach (string filePath in fileEntries)
        {
            string fixedPath = filePath.Replace("\\", "/");
            fixedPath = fixedPath.Replace(Application.dataPath, "");
            fixedPath = fixedPath.Insert(0, "Assets");
            filesList.Add(fixedPath);
        }
         return filesList.ToArray();
 }

(3)对保存下来的文件列表进行打包。

代码如下

 private void BuildPackage(List<string> fileList)
    {
        //需要打包的资源
        AssetBundleBuild[] buildMap = new AssetBundleBuild[1];
        //资源包的名称
        buildMap[0].assetBundleName = fileList[0].Split('/')[fileList[0].Split('/').Length - 2].ToLower()+".pak";
        //资源包下的资源名称,一个资源包可以包含多个资源,资源由asset开始的路径组成且包含自身后缀名
        buildMap[0].assetNames = fileList.ToArray();
        BuildPipeline.BuildAssetBundles(_assetBundleOutputPath, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
        AssetDatabase.Refresh();
    }

Ⅳ.总结

蟹蟹大家能看到这里,如果大家有想要研究的技术,可以加扣扣:五零四九三七四三零一起讨论

Ⅴ.代码资源和使用方法

代码资源:
链接:https://pan.baidu.com/s/1JhlIVqPTW6OfCeQE46ikRQ
提取码:t989

请将代码放进Assets中的Editor文件夹
然后在Unity菜单栏上会出现
在这里插入图片描述
打开窗口以后在以下图片配置好参数,打包就可以了

在这里插入图片描述

原文链接:https://blog.csdn.net/PMxiang/article/details/108290435

最后修改日期:2020年8月31日