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

2021-03-01 07:26

阅读:652

标签:false   html   rect   leo   entry   lse   getdir   正则   tin   

代码如下:

  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("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     /// 
 37     /// 重置某分组
 38     /// 
 39     /// 资源类型
 40     /// 组名
 41     /// 资源目录
 42     /// 过滤器:
 43     /// 若以t:开头,表示用unity的方式过滤; 
 44     /// 若以f:开头,表示用windows的SearchPattern方式过滤; 
 45     /// 若以r:开头,表示用正则表达式的方式过滤。
 46     /// 通过 asset path 得到地址名
 47     static void ResetGroup(string groupName, string assetFolder, string filter, Funcstring, string> getAddress)
 48     {
 49         string[] assets = GetAssets(assetFolder, filter);
 50 #if Debug
 51         foreach (var assetPath in assets)
 52         {
 53             string address = getAddress(assetPath).ToLower();
 54             Debug.Log($"{assetPath}\t{address}");
 55         }
 56 #else
 57         AddressableAssetGroup group = CreateGroup(groupName);
 58         foreach (var assetPath in assets)
 59         {
 60             string address = getAddress(assetPath).ToLower();
 61             AddAssetEntry(group, assetPath, address);
 62         }
 63 #endif
 64 
 65         Debug.Log($"Reset group finished, group: {groupName}, asset folder: {assetFolder}, filter: {filter}, count: {assets.Length}");
 66     }
 67 
 68     // 创建分组
 69     static AddressableAssetGroup CreateGroup(string groupName)
 70     {
 71         AddressableAssetGroup group = Settings.FindGroup(groupName);
 72         if (group == null)
 73             group = Settings.CreateGroup(groupName, false, false, false, null, typeof(T));
 74         Settings.AddLabel(groupName, false);
 75         return group;
 76     }
 77 
 78     // 给某分组添加资源
 79     static AddressableAssetEntry AddAssetEntry(AddressableAssetGroup group, string assetPath, string address)
 80     {
 81         string guid = AssetDatabase.AssetPathToGUID(assetPath);
 82 
 83         AddressableAssetEntry entry = group.entries.FirstOrDefault(e => e.guid == guid);
 84         if (entry == null)
 85         {
 86             entry = Settings.CreateOrMoveEntry(guid, group, false, false);
 87         }
 88 
 89         entry.address = address;
 90         entry.SetLabel(group.Name, true, false, false);
 91         return entry;
 92     }
 93 
 94     /// 
 95     /// 获取指定目录的资源
 96     /// 
 97     /// 过滤器:
 98     /// 若以t:开头,表示用unity的方式过滤; 
 99     /// 若以f:开头,表示用windows的SearchPattern方式过滤; 
100     /// 若以r:开头,表示用正则表达式的方式过滤。
101     public static string[] GetAssets(string folder, string filter)
102     {
103         if (string.IsNullOrEmpty(folder))
104             throw new ArgumentException("folder");
105         if (string.IsNullOrEmpty(filter))
106             throw new ArgumentException("filter");
107 
108         folder = folder.TrimEnd(/).TrimEnd(\\);
109 
110         if (filter.StartsWith("t:"))
111         {
112             string[] guids = AssetDatabase.FindAssets(filter, new string[] { folder });
113             string[] paths = new string[guids.Length];
114             for (int i = 0; i )
115                 paths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
116             return paths;
117         }
118         else if (filter.StartsWith("f:"))
119         {
120             string folderFullPath = BuildingBundle.GetFullPath(folder);
121             string searchPattern = filter.Substring(2);
122             string[] files = Directory.GetFiles(folderFullPath, searchPattern, SearchOption.AllDirectories);
123             string[] paths = new string[files.Length];
124             for (int i = 0; i )
125                 paths[i] = BuildingBundle.GetAssetPath(files[i]);
126             return paths;
127         }
128         else if (filter.StartsWith("r:"))
129         {
130             string folderFullPath = BuildingBundle.GetFullPath(folder);
131             string pattern = filter.Substring(2);
132             string[] files = Directory.GetFiles(folderFullPath, "*.*", SearchOption.AllDirectories);
133             Liststring> list = new Liststring>();
134             for (int i = 0; i )
135             {
136                 string name = Path.GetFileName(files[i]);
137                 if (Regex.IsMatch(name, pattern))
138                 {
139                     string p = BuildingBundle.GetAssetPath(files[i]);
140                     list.Add(p);
141                 }
142             }
143             return list.ToArray();
144         }
145         else
146         {
147             throw new InvalidOperationException("Unexpected filter: " + filter);
148         }
149     }
150 }

 

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

 

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

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

标签:false   html   rect   leo   entry   lse   getdir   正则   tin   

原文地址:https://www.cnblogs.com/jietian331/p/14446825.html


评论


亲,登录后才可以留言!