使用Adressable完成游戏更新-一键动态标志资源地址

工具类,这是网上找的,可以动态的创建或删除组,为资源添加label 加入到组。

using System.Collections.Generic;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;

public class AASUtility : UnityEditor.Editor
{
    public static UnityEditor.AddressableAssets.Settings.AddressableAssetSettings GetSettings()
    {
        //アドレサブルアセットセッティング取得
        var d = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEditor.AddressableAssets.Settings.AddressableAssetSettings>(
            "Assets/AddressableAssetsData/AddressableAssetSettings.asset"
            );
        return d;
    }


    public static UnityEditor.AddressableAssets.Settings.AddressableAssetGroup CreateGroup(string groupName, bool setAsDefaultGroup = false)
    {
        //アドレサブルアセットセッティング取得
        var s = GetSettings();
        //スキーマ生成
        List<UnityEditor.AddressableAssets.Settings.AddressableAssetGroupSchema> schema = new List<UnityEditor.AddressableAssets.Settings.AddressableAssetGroupSchema>() {
             ScriptableObject.CreateInstance<UnityEditor.AddressableAssets.Settings.GroupSchemas.BundledAssetGroupSchema>(),
             ScriptableObject.CreateInstance<UnityEditor.AddressableAssets.Settings.GroupSchemas.ContentUpdateGroupSchema>(),
        };
        //グループの作成
        var f = s.groups.Find((g) => {
            return g.name == groupName;
        });
        if (f == null)
        {
            f = s.CreateGroup(groupName, setAsDefaultGroup, false, true, schema);
        }

        return f;
    }

    public static AddressableAssetEntry AddAssetToGroup(string assetGuid, string groupName)
    {
        if (assetGuid.Equals(""))
        {
            Debug.Log($"assetGuid is empty, groupName: {groupName}");
            return null;
        }
        var s = GetSettings();
        var g = CreateGroup(groupName);
        var entry = s.CreateOrMoveEntry(assetGuid, g);
        return entry;
    }
    public static void SetLabelToAsset(List<string> assetGuidList, string label, bool flag)
    {
        var s = GetSettings();
        //ラベルを追加するように呼んでおく。追加されていないと設定されない。
        s.AddLabel(label);
        List<UnityEditor.AddressableAssets.Settings.AddressableAssetEntry> assetList = new List<UnityEditor.AddressableAssets.Settings.AddressableAssetEntry>();
        s.GetAllAssets(assetList, true);
        foreach (var assetGuid in assetGuidList)
        {
            var asset = assetList.Find((a) => { return a.guid == assetGuid; });
            if (asset != null)
            {
                asset.SetLabel(label, flag);
            }
        }
    }
    public static void RemoveAssetFromGroup(string assetGuid)
    {
        var s = GetSettings();
        s.RemoveAssetEntry(assetGuid);
    }

    public static void RemoveAllGroups()
    {
        var s = GetSettings();
        var list = s.groups;
        List<AddressableAssetGroup> temp_list = new List<AddressableAssetGroup>();
        for (int i = list.Count - 1; i >= 0; i--)
        {
            temp_list.Add(list[i]);
        }
        for (int i = temp_list.Count - 1; i >= 0; i--)
        {
            s.RemoveGroup(temp_list[i]);
        }
    }

    //public static void AddGroup(string groupName, bool setAsDefaultGroup, bool readOnly, bool postEvent, List<AddressableAssetGroupSchema> schemasToCopy, params Type[] types)
    //{
    //    var s = GetSettings();
    //    s.CreateGroup(groupName, setAsDefaultGroup,readOnly,postEvent,schemasToCopy,types);
    //}

    public static void BuildPlayerContent()
    {
        //System.Threading.Thread.Sleep(30000);
        var d = GetSettings();
        d.ActivePlayerDataBuilderIndex = 3;
        //AddressableAssetSettings.CleanPlayerContent(d.ActivePlayerDataBuilder);
        AddressableAssetSettings.BuildPlayerContent();
    }

    public static void CleanPlayerContent()
    {
        // var d = GetSettings();
        // d.ActivePlayerDataBuilderIndex = 3;
        //AddressableAssetSettings.CleanPlayerContent(d.ActivePlayerDataBuilder);
        AddressableAssetSettings.CleanPlayerContent();
        UnityEditor.Build.Pipeline.Utilities.BuildCache.PurgeCache(false);
        // AssetImportMgr.OnDataBuilderComplete();
    }

    static public void Test()
    {
        var d = GetSettings();

        var matguid = UnityEditor.AssetDatabase.AssetPathToGUID("Assets/Data/hogeMat.mat");
        AddAssetToGroup(matguid, "CreatedGroup");
        ////List<string> assetGuidList = new List<string>() { matguid };
        ////SetLabelToAsset(assetGuidList, "mat", true);
        //CreateGroup("CreatedGroup");
    }
}


静态方法,提供给编辑器扩展菜单使用

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine.ResourceManagement.ResourceProviders;

public class AddressableTool
{
    private static string PackPath = Config.PackPath; //图集碎片目录名字
    private static string AssetDataPath = Config.AssetDataPath; //打包资源的目录名字
    private static Dictionary<string, bool> originGroups;
    private static Dictionary<string, AddressableAssetGroup> originGroupMaps;

    //严禁一级目录下有需要打包文件,全用二级目录做好分配
    public static void MarkAssets()
    {
        //AASUtility.RemoveAllGroups(); 不要移除所有的组 为改变guid 导致每次的bundle的hash都不一样

        //记录原来的组
        originGroups = new Dictionary<string, bool>();
        originGroupMaps = new Dictionary<string, AddressableAssetGroup>();
        var setting = AASUtility.GetSettings();
        var groups = setting.groups;
        if (groups != null)
        {
            foreach (var g in groups)
            {
                originGroups.Add(g.Name, false);
                originGroupMaps.Add(g.Name, g);
            }
        }

        string assetPath = Path.Combine(Application.dataPath, AssetDataPath);
        DirectoryInfo[] levelsDataDirs = new DirectoryInfo(assetPath).GetDirectories();
        foreach (var dir in levelsDataDirs)
        {
            //场景目录
            MarkLevelDataDir(dir);
        }

        //对比移除无用的组
        foreach (var iter in originGroups)
        {
            if (!iter.Value && originGroupMaps.ContainsKey(iter.Key))
            {
                setting.RemoveGroup(originGroupMaps[iter.Key]);
            }
        }

        AssetDatabase.Refresh();
    }

    private static void MarkLevelDataDir(DirectoryInfo dir)
    {
        string parentName = dir.Name;
        DirectoryInfo[] dirs = dir.GetDirectories();
        foreach (var d in dirs)
        {
            //场景资源分类目录 一个打一个组
            MarkDir(d, parentName);
        }
    }

    private static void MarkDir(DirectoryInfo dir,string parentName)
    {
        if (dir.Name == PackPath) return;
        bool isTipLabel = false;
        if (parentName == "Src")//Lua脚本
        {
            isTipLabel = true;
        }
        string groudName = string.Format("{0}.{1}", parentName, dir.Name);
        AASUtility.CreateGroup(groudName);
        if (originGroups.ContainsKey(groudName))
        {
            originGroups[groudName] = true;
        }

        List<string> allFiles = new List<string>();
        List<string> allFileGuids = new List<string>();
        GetMarkFiles(allFiles, dir);
        foreach(var fileStr in allFiles)
        {
            string uFilePath = UtilityTool.ChangePath(fileStr);
            string guid = AssetDatabase.AssetPathToGUID(uFilePath);
            var entry = AASUtility.AddAssetToGroup(guid, groudName);
            //缩减 可寻址的长度 lua脚本的同步require的路径
            entry.address = uFilePath.Replace("Assets/" + "LevelsData" + "/", "").Replace("Src" + "/", "");
            allFileGuids.Add(guid);
        }

        if (isTipLabel)
        {
            AASUtility.SetLabelToAsset(allFileGuids, groudName, true);//脚本设置lable 用于预加载
        }

        AASUtility.SetLabelToAsset(allFileGuids, "default", true);//所有资源都设为default,以前是拿来检测更新的,现在好像没用了
    }

    private static void GetMarkFiles(List<string> list, DirectoryInfo dir)
    {
        if (dir.Name == PackPath) return;

        FileInfo[] files = dir.GetFiles();
        foreach (var file in files)
        {
            if (file.FullName.EndsWith(".meta")) continue;
            list.Add(file.FullName);
        }

        DirectoryInfo[] dirs = dir.GetDirectories();
        foreach (var d in dirs)
        {
            GetMarkFiles(list, d);
        }
    }
}


image.png

image.png


首页 我的博客
粤ICP备17103704号