Unity3D中实现按资源名称自动化命名打包AssetBundle
- 首先把模型变成预制体
- 一般当需要打包成AssetBundle的资源不多时,可以自己通过AssetLabels窗口手动命名,然后再打包,但是当需要打包的资源过多时,一个一个的去手动编辑就特别的麻烦,因此如果能按资源名称自动命名打包AssetBundle,这样子就会方便很多。(我的就是资源太多了,好几百个,上千个)
- 实现功能:只需点击一下“自动打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包后缀 } }
想需要自动刷新编辑器的,自己加一个当时忘记加了
有需要会继续补充
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!