为ab包添加命名的操作,需要手动输入,但是当项目不断深入,目录结构也会变得更为复杂,手动输入不仅没有效率还容易出错。
所以有必要为AssetBundle开发一个自动命名的脚本,当需打包的文件创建、修改、移动完成后,立即生成ab包的名字。
既然要在创建完成后自动命名,那必须要有文件创建完成后的回调。这里就需要用到unity编辑器开发的类AssetPostProcessor,需要创建一个脚本继承这个类,并实现对应的通知方法。
我们的需求并不需要对特定类型的资源进行处理,只要是资源修改就需要回调,然后在回调中对不同类型资源,进行不同的处理即可,所以实现OnPostProcessAllAssets通知消息。
代码实现如下:
public class AssetBundleAutoName : AssetPostprocessor
{
private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
AutoName(importedAssets);
AutoName(movedAssets);
}
static void AutoName(string[] assetPath)
{
//根据导入路径,判断是否是需要自动打包的资源
foreach(string importedAsset in assetPath)
{
//prefab资源处理
if(importedAsset.StartsWith("Assets/UGUI/prefabs/") && importedAsset.EndsWith(".prefab"))
{
string prefabName = Path.GetFileNameWithoutExtension(importedAsset);
//资源导入器的引用
AssetImporter assetImporter = AssetImporter.GetAtPath(importedAsset);
assetImporter.assetBundleName = "Assets/UGUI/prefabs/" + prefabName + ".unity3d";
continue;
}
//图片资源处理
if (importedAsset.StartsWith("Assets/UGUI/atlas/") && IsTexture(importedAsset))
{
string[] folders = importedAsset.Split('/');
//图片资源只需对上层文件夹打包
if(folders.Length >= 4)
{
string atlasPath = folders[0] + "/" + folders[1] + "/" + folders[2] + "/" + folders[3];
AssetImporter assetImporter = AssetImporter.GetAtPath(atlasPath);
assetImporter.assetBundleName = atlasPath + ".unity3d";
}
continue;
}
//字体资源处理
if(importedAsset.StartsWith("Assets/UGUI/font") && IsFont(importedAsset))
{
string prefabName = Path.GetFileNameWithoutExtension(importedAsset);
AssetImporter assetImporter = AssetImporter.GetAtPath(importedAsset);
assetImporter.assetBundleName = "Assets/UGUI/font/" + prefabName + ".unity3d";
continue;
}
//模型预制体资源处理
if (importedAsset.StartsWith("Assets/UGUI/models") && IsModel(importedAsset))
{
string prefabName = Path.GetFileNameWithoutExtension(importedAsset);
AssetImporter assetImporter = AssetImporter.GetAtPath(importedAsset);
assetImporter.assetBundleName = "Assets/UGUI/models/" + prefabName + ".unity3d";
continue;
}
}
}
// 判断是否是贴图
static bool IsTexture(string assetPath)
{
return assetPath.EndsWith(".png") || assetPath.EndsWith(".tga") || assetPath.EndsWith(".psd") || assetPath.EndsWith(".jpg") || assetPath.EndsWith(".bmp");
}
// 判断是否是字体文件
static bool IsFont(string assetPath)
{
return assetPath.EndsWith(".ttf");
}
// 判断是否是模型预制体文件
static bool IsModel(string assetPath)
{
return assetPath.EndsWith(".prefab");
}
}
在这里只处理了需要自动打包的文件夹和文件类型,这些都可以根据自己的需要灵活变动。