源战役客户端
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

167 rader
5.2 KiB

1 månad sedan
  1. using UnityEngine;
  2. using UnityEditor;
  3. using UnityEditor.IMGUI.Controls;
  4. //带数据的TreeViewItem
  5. public class AssetViewItem : TreeViewItem
  6. {
  7. public ReferenceFinderData.AssetDescription data;
  8. }
  9. //资源引用树
  10. public class AssetTreeView : TreeView
  11. {
  12. //图标宽度
  13. const float kIconWidth = 18f;
  14. //列表高度
  15. const float kRowHeights = 20f;
  16. public AssetViewItem assetRoot;
  17. private GUIStyle stateGUIStyle = new GUIStyle { richText = true, alignment = TextAnchor.MiddleCenter };
  18. //列信息
  19. enum MyColumns
  20. {
  21. Name,
  22. Path,
  23. State,
  24. }
  25. public AssetTreeView(TreeViewState state,MultiColumnHeader multicolumnHeader):base(state,multicolumnHeader)
  26. {
  27. rowHeight = kRowHeights;
  28. columnIndexForTreeFoldouts = 0;
  29. showAlternatingRowBackgrounds = true;
  30. showBorder = false;
  31. customFoldoutYOffset = (kRowHeights - EditorGUIUtility.singleLineHeight) * 0.5f; // center foldout in the row since we also center content. See RowGUI
  32. extraSpaceBeforeIconAndLabel = kIconWidth;
  33. }
  34. //响应右击事件
  35. protected override void ContextClickedItem(int id)
  36. {
  37. SetExpanded(id, !IsExpanded(id));
  38. }
  39. //响应双击事件
  40. protected override void DoubleClickedItem(int id)
  41. {
  42. var item = (AssetViewItem)FindItem(id, rootItem);
  43. //在ProjectWindow中高亮双击资源
  44. if (item != null)
  45. {
  46. var assetObject = AssetDatabase.LoadAssetAtPath(item.data.path, typeof(UnityEngine.Object));
  47. EditorUtility.FocusProjectWindow();
  48. Selection.activeObject = assetObject;
  49. EditorGUIUtility.PingObject(assetObject);
  50. }
  51. }
  52. //生成ColumnHeader
  53. public static MultiColumnHeaderState CreateDefaultMultiColumnHeaderState(float treeViewWidth)
  54. {
  55. var columns = new[]
  56. {
  57. //图标+名称
  58. new MultiColumnHeaderState.Column
  59. {
  60. headerContent = new GUIContent("Name"),
  61. headerTextAlignment = TextAlignment.Center,
  62. sortedAscending = false,
  63. width = 200,
  64. minWidth = 60,
  65. autoResize = false,
  66. allowToggleVisibility = false,
  67. canSort = false
  68. },
  69. //路径
  70. new MultiColumnHeaderState.Column
  71. {
  72. headerContent = new GUIContent("Path"),
  73. headerTextAlignment = TextAlignment.Center,
  74. sortedAscending = false,
  75. width = 360,
  76. minWidth = 60,
  77. autoResize = false,
  78. allowToggleVisibility = false,
  79. canSort = false
  80. },
  81. //状态
  82. new MultiColumnHeaderState.Column
  83. {
  84. headerContent = new GUIContent("State"),
  85. headerTextAlignment = TextAlignment.Center,
  86. sortedAscending = false,
  87. width = 60,
  88. minWidth = 60,
  89. autoResize = false,
  90. allowToggleVisibility = true,
  91. canSort = false
  92. },
  93. };
  94. var state = new MultiColumnHeaderState(columns);
  95. return state;
  96. }
  97. protected override TreeViewItem BuildRoot()
  98. {
  99. return assetRoot;
  100. }
  101. protected override void RowGUI(RowGUIArgs args)
  102. {
  103. var item = (AssetViewItem)args.item;
  104. for(int i = 0; i < args.GetNumVisibleColumns(); ++i)
  105. {
  106. CellGUI(args.GetCellRect(i), item, (MyColumns)args.GetColumn(i), ref args);
  107. }
  108. }
  109. //绘制列表中的每项内容
  110. void CellGUI(Rect cellRect,AssetViewItem item,MyColumns column, ref RowGUIArgs args)
  111. {
  112. CenterRectUsingSingleLineHeight(ref cellRect);
  113. switch (column)
  114. {
  115. case MyColumns.Name:
  116. {
  117. var iconRect = cellRect;
  118. iconRect.x += GetContentIndent(item);
  119. iconRect.width = kIconWidth;
  120. if (iconRect.x < cellRect.xMax)
  121. {
  122. var icon = GetIcon(item.data.path);
  123. if(icon != null)
  124. GUI.DrawTexture(iconRect, icon, ScaleMode.ScaleToFit);
  125. }
  126. args.rowRect = cellRect;
  127. base.RowGUI(args);
  128. }
  129. break;
  130. case MyColumns.Path:
  131. {
  132. GUI.Label(cellRect, item.data.path);
  133. }
  134. break;
  135. case MyColumns.State:
  136. {
  137. GUI.Label(cellRect, ReferenceFinderData.GetInfoByState(item.data.state),stateGUIStyle);
  138. }
  139. break;
  140. }
  141. }
  142. //根据资源信息获取资源图标
  143. private Texture2D GetIcon(string path)
  144. {
  145. Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
  146. if (obj != null)
  147. {
  148. Texture2D icon = AssetPreview.GetMiniThumbnail(obj);
  149. if (icon == null)
  150. icon = AssetPreview.GetMiniTypeThumbnail(obj.GetType());
  151. return icon;
  152. }
  153. return null;
  154. }
  155. }