AssetBundle自动根据文件夹目录命名,无需手动输入命名处理--unity学习笔记

为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");
    }
}

在这里只处理了需要自动打包的文件夹和文件类型,这些都可以根据自己的需要灵活变动。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值