• Unity 之 Addressable Asset System 之用工具创建group


    代码如下:

      1 using System.Linq;
      2 using System.IO;
      3 using UnityEditor;
      4 using UnityEditor.AddressableAssets;
      5 using UnityEditor.AddressableAssets.Settings;
      6 using UnityEngine;
      7 using System;
      8 using AssetBundle;
      9 using System.Collections.Generic;
     10 using System.Text.RegularExpressions;
     11 using UObject = UnityEngine.Object;
     12 
     13 public class AddressableGroupSetter : ScriptableObject
     14 {
     15     static AddressableAssetSettings Settings
     16     {
     17         get { return AddressableAssetSettingsDefaultObject.Settings; }
     18     }
     19 
     20 
     21     [MenuItem("Test/Reset Groups")]
     22     static void ResetGroups()
     23     {
     24         // ui
     25         ResetGroup<GameObject>("ui_prefab", "Assets/UI/Prefab/", "f:*.prefab", assetPath =>
     26         {
     27             string fileName = Path.GetFileNameWithoutExtension(assetPath);
     28             string dirPath = Path.GetDirectoryName(assetPath);
     29             string dirName = Path.GetFileNameWithoutExtension(dirPath);
     30             return $"{dirName}/{fileName}";
     31         });
     32         
     33         // ...
     34     }
     35 
     36     /// <summary>
     37     /// 重置某分组
     38     /// </summary>
     39     /// <typeparam name="T">资源类型</typeparam>
     40     /// <param name="groupName">组名</param>
     41     /// <param name="assetFolder">资源目录</param>
     42     /// <param name="filter">过滤器:
     43     /// 若以t:开头,表示用unity的方式过滤; 
     44     /// 若以f:开头,表示用windows的SearchPattern方式过滤; 
     45     /// 若以r:开头,表示用正则表达式的方式过滤。</param>
     46     /// <param name="getAddress">通过 asset path 得到地址名</param>
     47     static void ResetGroup<T>(string groupName, string assetFolder, string filter, Func<string, string> getAddress)
     48     {
     49         string[] assets = GetAssets(assetFolder, filter);
     50         AddressableAssetGroup group = CreateGroup<T>(groupName);
     51         foreach (var assetPath in assets)
     52         {
     53             string address = getAddress(assetPath).ToLower();
     54             AddAssetEntry(group, assetPath, address);
     55         }
     56 
     57         Debug.Log($"Reset group finished, group: {groupName}, asset folder: {assetFolder}, filter: {filter}, count: {assets.Length}");
     58     }
     59 
     60     // 创建分组
     61     static AddressableAssetGroup CreateGroup<T>(string groupName)
     62     {
     63         AddressableAssetGroup group = Settings.FindGroup(groupName);
     64         if (group == null)
     65             group = Settings.CreateGroup(groupName, false, false, false, null, typeof(T));
     66         Settings.AddLabel(groupName, false);
     67         return group;
     68     }
     69 
     70     // 给某分组添加资源
     71     static AddressableAssetEntry AddAssetEntry(AddressableAssetGroup group, string assetPath, string address)
     72     {
     73         string guid = AssetDatabase.AssetPathToGUID(assetPath);
     74 
     75         AddressableAssetEntry entry = group.entries.FirstOrDefault(e => e.guid == guid);
     76         if (entry == null)
     77         {
     78             entry = Settings.CreateOrMoveEntry(guid, group, false, false);
     79         }
     80 
     81         entry.address = address;
     82         entry.SetLabel(group.Name, true, false, false);
     83         return entry;
     84     }
     85 
     86     /// <summary>
     87     /// 获取指定目录的资源
     88     /// </summary>
     89     /// <param name="filter">过滤器:
     90     /// 若以t:开头,表示用unity的方式过滤; 
     91     /// 若以f:开头,表示用windows的SearchPattern方式过滤; 
     92     /// 若以r:开头,表示用正则表达式的方式过滤。</param>
     93     public static string[] GetAssets(string folder, string filter)
     94     {
     95         if (string.IsNullOrEmpty(folder))
     96             throw new ArgumentException("folder");
     97         if (string.IsNullOrEmpty(filter))
     98             throw new ArgumentException("filter");
     99 
    100         folder = folder.TrimEnd('/').TrimEnd('\');
    101 
    102         if (filter.StartsWith("t:"))
    103         {
    104             string[] guids = AssetDatabase.FindAssets(filter, new string[] { folder });
    105             string[] paths = new string[guids.Length];
    106             for (int i = 0; i < guids.Length; i++)
    107                 paths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
    108             return paths;
    109         }
    110         else if (filter.StartsWith("f:"))
    111         {
    112             string folderFullPath = BuildingBundle.GetFullPath(folder);
    113             string searchPattern = filter.Substring(2);
    114             string[] files = Directory.GetFiles(folderFullPath, searchPattern, SearchOption.AllDirectories);
    115             string[] paths = new string[files.Length];
    116             for (int i = 0; i < files.Length; i++)
    117                 paths[i] = BuildingBundle.GetAssetPath(files[i]);
    118             return paths;
    119         }
    120         else if (filter.StartsWith("r:"))
    121         {
    122             string folderFullPath = BuildingBundle.GetFullPath(folder);
    123             string pattern = filter.Substring(2);
    124             string[] files = Directory.GetFiles(folderFullPath, "*.*", SearchOption.AllDirectories);
    125             List<string> list = new List<string>();
    126             for (int i = 0; i < files.Length; i++)
    127             {
    128                 string name = Path.GetFileName(files[i]);
    129                 if (Regex.IsMatch(name, pattern))
    130                 {
    131                     string p = BuildingBundle.GetAssetPath(files[i]);
    132                     list.Add(p);
    133                 }
    134             }
    135             return list.ToArray();
    136         }
    137         else
    138         {
    139             throw new InvalidOperationException("Unexpected filter: " + filter);
    140         }
    141     }
    142 }

    执行菜单 Test/Reset Groups 后效果如下:

     

    转载请注明出处:https://www.cnblogs.com/jietian331/p/14446825.html

  • 相关阅读:
    Web框架下安全漏洞的测试反思
    如何能低成本地快速获取大量目标用户,而不是与竞争对手持久战?
    Spring-Boot自定义Starter实践
    WM_QUERYENDSESSION与WM_ENDSESSION
    AutoMapper用法
    使用AutoMapper实现Dto和Model的自由转换(下)
    使用AutoMapper实现Dto和Model的自由转换(中)
    使用AutoMapper实现Dto和Model的自由转换(上)
    JSON中JObject和JArray的修改
    通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
  • 原文地址:https://www.cnblogs.com/jietian331/p/14446825.html
Copyright © 2020-2023  润新知