DebuggerBundleListViewer.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. #if UNITY_2019_4_OR_NEWER
  2. using System.IO;
  3. using System.Linq;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEditor.UIElements;
  8. using UnityEngine.UIElements;
  9. namespace YooAsset.Editor
  10. {
  11. internal class DebuggerBundleListViewer
  12. {
  13. private VisualTreeAsset _visualAsset;
  14. private TemplateContainer _root;
  15. private ListView _bundleListView;
  16. private ListView _usingListView;
  17. private DebugReport _debugReport;
  18. /// <summary>
  19. /// 初始化页面
  20. /// </summary>
  21. public void InitViewer()
  22. {
  23. // 加载布局文件
  24. _visualAsset = UxmlLoader.LoadWindowUXML<DebuggerBundleListViewer>();
  25. if (_visualAsset == null)
  26. return;
  27. _root = _visualAsset.CloneTree();
  28. _root.style.flexGrow = 1f;
  29. // 资源包列表
  30. _bundleListView = _root.Q<ListView>("TopListView");
  31. _bundleListView.makeItem = MakeBundleListViewItem;
  32. _bundleListView.bindItem = BindBundleListViewItem;
  33. #if UNITY_2020_1_OR_NEWER
  34. _bundleListView.onSelectionChange += BundleListView_onSelectionChange;
  35. #else
  36. _bundleListView.onSelectionChanged += BundleListView_onSelectionChange;
  37. #endif
  38. // 使用列表
  39. _usingListView = _root.Q<ListView>("BottomListView");
  40. _usingListView.makeItem = MakeIncludeListViewItem;
  41. _usingListView.bindItem = BindIncludeListViewItem;
  42. #if UNITY_2020_3_OR_NEWER
  43. SplitView.Adjuster(_root);
  44. #endif
  45. }
  46. /// <summary>
  47. /// 清空页面
  48. /// </summary>
  49. public void ClearView()
  50. {
  51. _debugReport = null;
  52. _bundleListView.Clear();
  53. _bundleListView.ClearSelection();
  54. _bundleListView.itemsSource.Clear();
  55. _bundleListView.Rebuild();
  56. }
  57. /// <summary>
  58. /// 填充页面数据
  59. /// </summary>
  60. public void FillViewData(DebugReport debugReport, string searchKeyWord)
  61. {
  62. _debugReport = debugReport;
  63. _bundleListView.Clear();
  64. _bundleListView.ClearSelection();
  65. _bundleListView.itemsSource = FilterViewItems(debugReport, searchKeyWord);
  66. _bundleListView.Rebuild();
  67. }
  68. private List<DebugBundleInfo> FilterViewItems(DebugReport debugReport, string searchKeyWord)
  69. {
  70. List<DebugBundleInfo> result = new List<DebugBundleInfo>(1000);
  71. foreach (var pakcageData in debugReport.PackageDatas)
  72. {
  73. Dictionary<string, DebugBundleInfo> tempDic = new Dictionary<string, DebugBundleInfo>(1000);
  74. foreach (var providerInfo in pakcageData.ProviderInfos)
  75. {
  76. foreach (var bundleInfo in providerInfo.DependBundleInfos)
  77. {
  78. if (string.IsNullOrEmpty(searchKeyWord) == false)
  79. {
  80. if (bundleInfo.BundleName.Contains(searchKeyWord) == false)
  81. continue;
  82. }
  83. if (tempDic.ContainsKey(bundleInfo.BundleName) == false)
  84. {
  85. bundleInfo.PackageName = pakcageData.PackageName;
  86. tempDic.Add(bundleInfo.BundleName, bundleInfo);
  87. }
  88. }
  89. }
  90. var tempList = tempDic.Values.ToList();
  91. tempList.Sort();
  92. result.AddRange(tempList);
  93. }
  94. return result;
  95. }
  96. /// <summary>
  97. /// 挂接到父类页面上
  98. /// </summary>
  99. public void AttachParent(VisualElement parent)
  100. {
  101. parent.Add(_root);
  102. }
  103. /// <summary>
  104. /// 从父类页面脱离开
  105. /// </summary>
  106. public void DetachParent()
  107. {
  108. _root.RemoveFromHierarchy();
  109. }
  110. // 顶部列表相关
  111. private VisualElement MakeBundleListViewItem()
  112. {
  113. VisualElement element = new VisualElement();
  114. element.style.flexDirection = FlexDirection.Row;
  115. {
  116. var label = new Label();
  117. label.name = "Label0";
  118. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  119. label.style.marginLeft = 3f;
  120. //label.style.flexGrow = 1f;
  121. label.style.width = 150;
  122. element.Add(label);
  123. }
  124. {
  125. var label = new Label();
  126. label.name = "Label1";
  127. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  128. label.style.marginLeft = 3f;
  129. label.style.flexGrow = 1f;
  130. label.style.width = 280;
  131. element.Add(label);
  132. }
  133. {
  134. var label = new Label();
  135. label.name = "Label3";
  136. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  137. label.style.marginLeft = 3f;
  138. //label.style.flexGrow = 1f;
  139. label.style.width = 100;
  140. element.Add(label);
  141. }
  142. {
  143. var label = new Label();
  144. label.name = "Label4";
  145. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  146. label.style.marginLeft = 3f;
  147. //label.style.flexGrow = 1f;
  148. label.style.width = 120;
  149. element.Add(label);
  150. }
  151. return element;
  152. }
  153. private void BindBundleListViewItem(VisualElement element, int index)
  154. {
  155. var sourceData = _bundleListView.itemsSource as List<DebugBundleInfo>;
  156. var bundleInfo = sourceData[index];
  157. // Package Name
  158. var label0 = element.Q<Label>("Label0");
  159. label0.text = bundleInfo.PackageName;
  160. // Bundle Name
  161. var label1 = element.Q<Label>("Label1");
  162. label1.text = bundleInfo.BundleName;
  163. // Ref Count
  164. var label3 = element.Q<Label>("Label3");
  165. label3.text = bundleInfo.RefCount.ToString();
  166. // Status
  167. StyleColor textColor;
  168. if (bundleInfo.Status == BundleLoaderBase.EStatus.Failed.ToString())
  169. textColor = new StyleColor(Color.yellow);
  170. else
  171. textColor = label1.style.color;
  172. var label4 = element.Q<Label>("Label4");
  173. label4.text = bundleInfo.Status.ToString();
  174. label4.style.color = textColor;
  175. }
  176. private void BundleListView_onSelectionChange(IEnumerable<object> objs)
  177. {
  178. foreach (var item in objs)
  179. {
  180. DebugBundleInfo bundleInfo = item as DebugBundleInfo;
  181. FillUsingListView(bundleInfo);
  182. }
  183. }
  184. // 底部列表相关
  185. private VisualElement MakeIncludeListViewItem()
  186. {
  187. VisualElement element = new VisualElement();
  188. element.style.flexDirection = FlexDirection.Row;
  189. {
  190. var label = new Label();
  191. label.name = "Label1";
  192. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  193. label.style.marginLeft = 3f;
  194. label.style.flexGrow = 1f;
  195. label.style.width = 280;
  196. element.Add(label);
  197. }
  198. {
  199. var label = new Label();
  200. label.name = "Label2";
  201. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  202. label.style.marginLeft = 3f;
  203. //label.style.flexGrow = 1f;
  204. label.style.width = 150;
  205. element.Add(label);
  206. }
  207. {
  208. var label = new Label();
  209. label.name = "Label3";
  210. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  211. label.style.marginLeft = 3f;
  212. //label.style.flexGrow = 1f;
  213. label.style.width = 150;
  214. element.Add(label);
  215. }
  216. {
  217. var label = new Label();
  218. label.name = "Label4";
  219. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  220. label.style.marginLeft = 3f;
  221. //label.style.flexGrow = 1f;
  222. label.style.width = 100;
  223. element.Add(label);
  224. }
  225. {
  226. var label = new Label();
  227. label.name = "Label5";
  228. label.style.unityTextAlign = TextAnchor.MiddleLeft;
  229. label.style.marginLeft = 3f;
  230. //label.style.flexGrow = 1f;
  231. label.style.width = 120;
  232. element.Add(label);
  233. }
  234. return element;
  235. }
  236. private void BindIncludeListViewItem(VisualElement element, int index)
  237. {
  238. List<DebugProviderInfo> providers = _usingListView.itemsSource as List<DebugProviderInfo>;
  239. DebugProviderInfo providerInfo = providers[index];
  240. // Asset Path
  241. var label1 = element.Q<Label>("Label1");
  242. label1.text = providerInfo.AssetPath;
  243. // Spawn Scene
  244. var label2 = element.Q<Label>("Label2");
  245. label2.text = providerInfo.SpawnScene;
  246. // Spawn Time
  247. var label3 = element.Q<Label>("Label3");
  248. label3.text = providerInfo.SpawnTime;
  249. // Ref Count
  250. var label4 = element.Q<Label>("Label4");
  251. label4.text = providerInfo.RefCount.ToString();
  252. // Status
  253. var label5 = element.Q<Label>("Label5");
  254. label5.text = providerInfo.Status.ToString();
  255. }
  256. private void FillUsingListView(DebugBundleInfo selectedBundleInfo)
  257. {
  258. List<DebugProviderInfo> source = new List<DebugProviderInfo>();
  259. foreach (var packageData in _debugReport.PackageDatas)
  260. {
  261. if (packageData.PackageName == selectedBundleInfo.PackageName)
  262. {
  263. foreach (var providerInfo in packageData.ProviderInfos)
  264. {
  265. foreach (var bundleInfo in providerInfo.DependBundleInfos)
  266. {
  267. if (bundleInfo.BundleName == selectedBundleInfo.BundleName)
  268. {
  269. source.Add(providerInfo);
  270. continue;
  271. }
  272. }
  273. }
  274. }
  275. }
  276. _usingListView.Clear();
  277. _usingListView.ClearSelection();
  278. _usingListView.itemsSource = source;
  279. _usingListView.Rebuild();
  280. }
  281. }
  282. }
  283. #endif