Unity3D中实现按资源名称自动化命名打包AssetBundle

  1. 首先把模型变成预制体
  2. 一般当需要打包成AssetBundle的资源不多时,可以自己通过AssetLabels窗口手动命名,然后再打包,但是当需要打包的资源过多时,一个一个的去手动编辑就特别的麻烦,因此如果能按资源名称自动命名打包AssetBundle,这样子就会方便很多。(我的就是资源太多了,好几百个,上千个)
  3. 实现功能:只需点击一下“自动打ab包”,即可将指定目录的资源全部自动生成按文件名称命名的AssetBundle,如下所示

      

 下面直接上编辑器脚本

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
/// <summary>
/// 设置好路径,点击 自动打ab包  即可 脚本必须放在Editor文件下面
/// </summary>
public class AssetBundleBuilder: MonoBehaviour
{

    //资源存放路径
    static string assetsDir =  "Assets/Prefabs/EQ设备/4k";
    //打包后存放路径
    const string assetBundlesPath = "Assets/StreamingAssets/预制体";

    BuildAssetBundleOptions sdsd = new BuildAssetBundleOptions();

    [MenuItem("AssetBundle/自动打ab包")]
    static void AutoBuildAll()
    {
        //清除所有的AssetBundleName
        ClearAssetBundlesName();
        //设置指定路径下所有需要打包的assetbundlename
        SetAssetBundlesName(assetsDir);
        //打包所有需要打包的asset   //看你是什么平台 打包对应平台要不然加载不出来
        BuildPipeline.BuildAssetBundles(assetBundlesPath, BuildAssetBundleOptions.None, BuildTarget.WebGL);
    }

    /// <summary>
    /// 清除所有的AssetBundleName,由于打包方法会将所有设置过AssetBundleName的资源打包,所以自动打包前需要清理
    /// </summary>
    static void ClearAssetBundlesName()
    {
        //获取所有的AssetBundle名称
        string[] abNames = AssetDatabase.GetAllAssetBundleNames();

        //强制删除所有AssetBundle名称
        for (int i = 0; i < abNames.Length; i++)
        {
            AssetDatabase.RemoveAssetBundleName(abNames[i], true);
        }
      
    }

    /// <summary>
    /// 设置所有在指定路径下的AssetBundleName
    /// </summary>
    static void SetAssetBundlesName(string _assetsPath)
    {
        //先获取指定路径下的所有Asset,包括子文件夹下的资源
        DirectoryInfo dir = new DirectoryInfo(_assetsPath);
        FileSystemInfo[] files = dir.GetFileSystemInfos(); //GetFileSystemInfos方法可以获取到指定目录下的所有文件以及子文件夹
        Debug.Log(files.Length);
        for (int i = 0; i < files.Length; i++)
        {
           
            if (files[i] is DirectoryInfo)  //如果是文件夹则递归处理
            {
                SetAssetBundlesName(files[i].FullName);
            }
            else if (!files[i].Name.EndsWith(".meta")) //如果是文件的话,则设置AssetBundleName,并排除掉.meta文件
            {
                SetABName(files[i].FullName);     //逐个设置AssetBundleName
            }
        }

    }

    /// <summary>
    /// 设置单个AssetBundle的Name
    /// </summary>
    /// <param name="filePath"></param>
    static void SetABName(string assetPath)
    {
        string importerPath = "Assets" + assetPath.Substring(Application.dataPath.Length);  //这个路径必须是以Assets开始的路径
        AssetImporter assetImporter = AssetImporter.GetAtPath(importerPath);  //得到Asset

        string tempName = assetPath.Substring(assetPath.LastIndexOf(@"\") + 1);
        string assetName = tempName.Remove(tempName.LastIndexOf(".")); //获取asset的文件名称
        assetImporter.assetBundleName = assetName;    //最终设置assetBundleName
        assetImporter.assetBundleVariant = "ab";      //设置ab包后缀
    }
}

 想需要自动刷新编辑器的,自己加一个当时忘记加了

 

 

 

有需要会继续补充

 

posted @ 2022-11-09 16:10  剑起苍穹  阅读(393)  评论(0编辑  收藏  举报
/*鼠标点击特效*/