ButtonPanelUIScript.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using UnityEditor;
  7. using UnityEngine;
  8. using UnityEngine.UIElements;
  9. public class ButtonPanelUIScript : MonoBehaviour {
  10. private Button buildButton;
  11. private IMGUIContainer buttonContainer;
  12. bool building = false;
  13. private VisualTreeAsset MenuItemTemplate;
  14. private static List<PlacedObjectTypeSO> buildableItems = new List<PlacedObjectTypeSO>();
  15. private static List<UIMenuItem> menuItems = new List<UIMenuItem>();
  16. private void OnEnable() {
  17. VisualElement rootVisualElement = GetComponent<UIDocument>().rootVisualElement;
  18. buildButton = rootVisualElement.Q<Button>("BuildButton");
  19. buildButton.RegisterCallback<ClickEvent>(ev => StartBuilding());
  20. MenuItemTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/UI Toolkit/MenuItemTemplate.uxml");
  21. buttonContainer = rootVisualElement.Q<IMGUIContainer>("BuildPerfabsPanel");
  22. CreateGui();
  23. }
  24. private void CreateGui() {
  25. LoadAllBuildableItems();
  26. GenerateMenuItems();
  27. }
  28. private void StartBuilding() {
  29. buttonContainer.style.display = building ? DisplayStyle.None : DisplayStyle.Flex;
  30. building = !building;
  31. }
  32. private void GenerateMenuItems() {
  33. foreach (UIMenuItem item in menuItems) {
  34. TemplateContainer templateContainer = MenuItemTemplate.Instantiate();
  35. ScrollView scrollView = templateContainer.Q<ScrollView>("BuildableItemsList");
  36. Button button = templateContainer.Q<Button>("Button");
  37. button.text = item.MenuText;
  38. button.clicked += () => {
  39. scrollView.style.display =
  40. scrollView.style.display == DisplayStyle.None ? DisplayStyle.Flex : DisplayStyle.None;
  41. };
  42. foreach (TemplateContainer i in item.GetBuildableItemsList()) {
  43. templateContainer.Q<ScrollView>("BuildableItemsList").Add(i);
  44. }
  45. buttonContainer.Add(templateContainer);
  46. }
  47. }
  48. private void LoadAllBuildableItems() {
  49. buildableItems.Clear();
  50. string[] allMenuPaths = Directory.GetFiles("Assets/Data/UI/Menus", "*.asset", SearchOption.AllDirectories);
  51. string[] allBuildablePaths = Directory.GetFiles("Assets/Data/UI/Buildables", "*.asset", SearchOption.AllDirectories);
  52. foreach (string path in allBuildablePaths) {
  53. string cleanedPath = path.Replace("\\", "/");
  54. buildableItems.Add((PlacedObjectTypeSO)AssetDatabase.LoadAssetAtPath(cleanedPath, typeof(PlacedObjectTypeSO)));
  55. }
  56. foreach (string path in allMenuPaths) {
  57. string cleanedPath = path.Replace("\\", "/");
  58. UIMenuItem uIMenuItem = (UIMenuItem)AssetDatabase.LoadAssetAtPath(cleanedPath, typeof(UIMenuItem));
  59. uIMenuItem.SetBuildableItems(buildableItems.FindAll(i => i.category.Equals(uIMenuItem.category)));
  60. menuItems.Add(uIMenuItem);
  61. }
  62. }
  63. }