Unity 之 Addressable Asset System 之用工具创建group
标签: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
评论