TownBuilding.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using UnityEngine;
  2. using UnityEngine.UIElements;
  3. using System;
  4. public enum BuildingType
  5. {
  6. Shop,
  7. AdventurersGuild,
  8. Harbor,
  9. Inn,
  10. House,
  11. Other
  12. }
  13. [System.Serializable]
  14. public class TownBuilding : MonoBehaviour
  15. {
  16. [Header("Building Configuration")]
  17. public string buildingName = "Building";
  18. public BuildingType buildingType = BuildingType.Other;
  19. public Sprite buildingIcon;
  20. public string description = "A building in the town";
  21. [Header("Visual Settings")]
  22. public Vector2Int gridPosition = Vector2Int.zero;
  23. public Vector2Int buildingSize = Vector2Int.one;
  24. public Color buildingColor = Color.white;
  25. [Header("Interaction")]
  26. public bool isInteractable = true;
  27. public string interactionText = "Click to interact";
  28. protected Action<TownBuilding> onClickCallback;
  29. protected VisualElement buildingElement;
  30. protected virtual void Start()
  31. {
  32. if (buildingName == "Building")
  33. buildingName = gameObject.name;
  34. }
  35. public virtual void SetupClickHandler(Action<TownBuilding> callback)
  36. {
  37. onClickCallback = callback;
  38. }
  39. public virtual void CreateVisualElement(VisualElement parent)
  40. {
  41. buildingElement = new VisualElement();
  42. buildingElement.name = $"Building_{buildingName}";
  43. buildingElement.AddToClassList("town-building");
  44. // Set position and size based on grid
  45. buildingElement.style.position = Position.Absolute;
  46. buildingElement.style.left = gridPosition.x * 50; // 50px per grid unit
  47. buildingElement.style.top = gridPosition.y * 50;
  48. buildingElement.style.width = buildingSize.x * 50;
  49. buildingElement.style.height = buildingSize.y * 50;
  50. buildingElement.style.backgroundColor = buildingColor;
  51. // Add click handler
  52. if (isInteractable)
  53. {
  54. buildingElement.RegisterCallback<ClickEvent>(OnBuildingClick);
  55. buildingElement.AddToClassList("town-building-interactive");
  56. }
  57. // Add building label
  58. var label = new Label(buildingName);
  59. label.AddToClassList("building-label");
  60. buildingElement.Add(label);
  61. parent.Add(buildingElement);
  62. }
  63. protected virtual void OnBuildingClick(ClickEvent evt)
  64. {
  65. if (isInteractable && onClickCallback != null)
  66. {
  67. onClickCallback.Invoke(this);
  68. }
  69. }
  70. public virtual void HighlightBuilding(bool highlight)
  71. {
  72. if (buildingElement != null)
  73. {
  74. if (highlight)
  75. buildingElement.AddToClassList("town-building-highlighted");
  76. else
  77. buildingElement.RemoveFromClassList("town-building-highlighted");
  78. }
  79. }
  80. }