ItemDatabase.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using UnityEditor;
  6. using UnityEditor.UIElements;
  7. using UnityEngine;
  8. using UnityEngine.UIElements;
  9. public class ItemDatabase : EditorWindow {
  10. private Sprite defaultItemIcon;
  11. private static List<Item> databaseItems = new List<Item>();
  12. private static List<PlacedObjectTypeSO> buildableItems = new List<PlacedObjectTypeSO>();
  13. private static List<UIMenuItem> menuItems = new List<UIMenuItem>();
  14. private VisualElement itemsTab;
  15. private static VisualTreeAsset m_ItemRowTemplate;
  16. private ListView itemListView;
  17. private float itemHeight = 40;
  18. private ScrollView detailSection;
  19. private VisualElement largeDisplayIcon;
  20. private Item activeItem;
  21. private VisualTreeAsset BuildableObjectButtonTemplate;
  22. private VisualTreeAsset MenuItemTemplate;
  23. [MenuItem("WUG/Item Database")]
  24. public static void Init() {
  25. ItemDatabase wnd = GetWindow<ItemDatabase>();
  26. wnd.titleContent = new GUIContent("Item Database");
  27. Vector2 size = new Vector2(800, 475);
  28. wnd.minSize = size;
  29. wnd.maxSize = size;
  30. }
  31. public void CreateGUI() {
  32. var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/WUG/Editor/ItemDatabase.uxml");
  33. VisualElement rootFromUXML = visualTree.Instantiate();
  34. rootVisualElement.Add(rootFromUXML);
  35. var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/WUG/Editor/ItemDatabase.uss");
  36. rootVisualElement.styleSheets.Add(styleSheet);
  37. defaultItemIcon = (Sprite)AssetDatabase.LoadAssetAtPath("Assets/WUG/Sprites/UnknownIcon.png", typeof(Sprite));
  38. m_ItemRowTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Scripts/UI/ItemDatabase/ItemRowTemplate.uxml");
  39. BuildableObjectButtonTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Scripts/UI/ItemDatabase/BuildableObjectTemplate.uxml");
  40. MenuItemTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Scripts/UI/ItemDatabase/MenuItemTemplate.uxml");
  41. LoadAllItems();
  42. LoadAllBuildableItems();
  43. GenerateMenuItems();
  44. itemsTab = rootVisualElement.Q<VisualElement>("ItemsTab");
  45. GenerateListView();
  46. detailSection = rootVisualElement.Q<ScrollView>("ScrollView_Details");
  47. detailSection.style.visibility = Visibility.Hidden;
  48. largeDisplayIcon = detailSection.Q<VisualElement>("Icon");
  49. rootVisualElement.Q<Button>("Btn_AddItem").clicked += AddItem_OnClick;
  50. detailSection.Q<TextField>("ItemName").RegisterValueChangedCallback(evt => {
  51. activeItem.FriendlyName = evt.newValue;
  52. itemListView.Rebuild();
  53. });
  54. detailSection.Q<ObjectField>("IconPicker").RegisterValueChangedCallback(evt => {
  55. Sprite newSprite = evt.newValue as Sprite;
  56. activeItem.Icon = newSprite == null ? defaultItemIcon : newSprite;
  57. largeDisplayIcon.style.backgroundImage = newSprite == null ? defaultItemIcon.texture : newSprite.texture;
  58. itemListView.Rebuild();
  59. rootVisualElement.Q<Button>("Btn_DeleteItem").clicked += DeleteItem_OnClick;
  60. });
  61. }
  62. private void DeleteItem_OnClick() {
  63. // Get the path of the fie and delete it through AssetDatabase
  64. string path = AssetDatabase.GetAssetPath(activeItem);
  65. AssetDatabase.DeleteAsset(path);
  66. databaseItems.Remove(activeItem);
  67. itemListView.Rebuild();
  68. detailSection.style.visibility = Visibility.Hidden;
  69. }
  70. private void AddItem_OnClick() {
  71. // Create an instance of the scriptable object and set the default parameters
  72. Item newItem = CreateInstance<Item>();
  73. newItem.FriendlyName = $"New Item";
  74. newItem.Icon = defaultItemIcon;
  75. // Create an asset, using the unique ID for the name
  76. AssetDatabase.CreateAsset(newItem, $"Assets/Data/{newItem.ID}.asset");
  77. // Add it to the item list
  78. databaseItems.Add(newItem);
  79. // Refresh the listView so everyting is redrawn again
  80. itemListView.Rebuild();
  81. itemListView.style.height = databaseItems.Count * itemHeight;
  82. }
  83. private void GenerateListView() {
  84. Func<VisualElement> makeItem = () => m_ItemRowTemplate.CloneTree();
  85. Action<VisualElement, int> bindItem = (e, i) => {
  86. e.Q<VisualElement>("Icon").style.backgroundImage = databaseItems[i] == null ? defaultItemIcon.texture :
  87. databaseItems[i].Icon.texture;
  88. e.Q<Label>("Name").text = databaseItems[i].FriendlyName;
  89. };
  90. itemListView = new ListView(databaseItems, 35, makeItem, bindItem);
  91. itemListView.selectionType = SelectionType.Single;
  92. // itemListView.style.height = databaseItems.Count * itemHeight;
  93. itemsTab.Add(itemListView);
  94. itemListView.onSelectionChange += ListView_onSelectionChange;
  95. }
  96. private void GenerateMenuItems() {
  97. Func<VisualElement> menuItem = () => MenuItemTemplate.CloneTree();
  98. Action<VisualElement, int> bindItem = (e, i) => {
  99. e.Q<Button>("MenuButton").text = menuItems[i].MenuText;
  100. };
  101. }
  102. private void GenerateBuildableObjectsList() {
  103. Func<VisualElement> makeItem = () => BuildableObjectButtonTemplate.CloneTree();
  104. Action<VisualElement, int> bindItem = (e, i) => {
  105. e.Q<Button>("BuildButton").text = buildableItems[i].ButtonText;
  106. };
  107. }
  108. private void LoadAllItems() {
  109. databaseItems.Clear();
  110. string[] allPaths = Directory.GetFiles("Assets/Data", "*.asset", SearchOption.AllDirectories);
  111. foreach (string path in allPaths) {
  112. string cleanedPath = path.Replace("\\", "/");
  113. databaseItems.Add((Item)AssetDatabase.LoadAssetAtPath(cleanedPath, typeof(Item)));
  114. }
  115. }
  116. private void LoadAllBuildableItems() {
  117. buildableItems.Clear();
  118. string[] allMenuPaths = Directory.GetFiles("Assets/Data/UI/Menus", "*.assets", SearchOption.AllDirectories);
  119. string[] allBuildablePaths = Directory.GetFiles("Assets/Data/Buildables", "*.assets", SearchOption.AllDirectories);
  120. foreach (string path in allMenuPaths) {
  121. string cleanedPath = path.Replace("\\", "/");
  122. menuItems.Add((UIMenuItem)AssetDatabase.LoadAssetAtPath(cleanedPath, typeof(UIMenuItem)));
  123. }
  124. foreach (string path in allBuildablePaths) {
  125. string cleanedPath = path.Replace("\\", "/");
  126. buildableItems.Add((PlacedObjectTypeSO)AssetDatabase.LoadAssetAtPath(cleanedPath, typeof(PlacedObjectTypeSO)));
  127. }
  128. }
  129. private void ListView_onSelectionChange(IEnumerable<object> selectedItems) {
  130. activeItem = (Item)selectedItems.First();
  131. SerializedObject so = new SerializedObject(activeItem);
  132. detailSection.Bind(so);
  133. if (activeItem.Icon != null) {
  134. largeDisplayIcon.style.backgroundImage = activeItem.Icon.texture;
  135. }
  136. detailSection.style.visibility = Visibility.Visible;
  137. }
  138. }