RoomView.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using UnityEngine;
  2. namespace MazeGen
  3. {
  4. /// <summary>
  5. /// Placeholder visual for a Room: a flat tinted square sized to the room's radius.
  6. /// Swap this out for real prefabs later without touching generation logic.
  7. /// </summary>
  8. [RequireComponent(typeof(SpriteRenderer))]
  9. public class RoomView : MonoBehaviour
  10. {
  11. private static Sprite _sharedSquareSprite;
  12. public static Sprite SharedSquareSprite
  13. {
  14. get
  15. {
  16. if (_sharedSquareSprite == null)
  17. {
  18. var tex = Texture2D.whiteTexture;
  19. _sharedSquareSprite = Sprite.Create(
  20. tex, new Rect(0, 0, tex.width, tex.height),
  21. new Vector2(0.5f, 0.5f), tex.width);
  22. }
  23. return _sharedSquareSprite;
  24. }
  25. }
  26. public Room RoomData { get; private set; }
  27. public void Initialize(Room room)
  28. {
  29. RoomData = room;
  30. // Elbow-connector hallways know both doors they join - render as a stretched
  31. // strip along that path instead of a small square, so the corridor actually
  32. // looks like it spans the gap between the two rooms it connects.
  33. if (room.Kind == RoomKind.Hallway && room.CorridorWaypoints != null && room.CorridorWaypoints.Length >= 2)
  34. {
  35. GetComponent<SpriteRenderer>().enabled = false;
  36. Color color = ColorFor(room.Kind);
  37. for (int i = 0; i < room.CorridorWaypoints.Length - 1; i++)
  38. SpawnCorridorSegment(room.CorridorWaypoints[i], room.CorridorWaypoints[i + 1], room.Radius, color);
  39. return;
  40. }
  41. transform.position = room.Position;
  42. transform.localScale = Vector3.one * (room.Radius * 2f);
  43. var sr = GetComponent<SpriteRenderer>();
  44. sr.sprite = SharedSquareSprite;
  45. sr.color = ColorFor(room.Kind);
  46. }
  47. private void SpawnCorridorSegment(Vector2 a, Vector2 b, float radius, Color color)
  48. {
  49. Vector2 mid = (a + b) * 0.5f;
  50. float length = Vector2.Distance(a, b);
  51. if (length < 0.01f) return;
  52. float angle = Mathf.Atan2(b.y - a.y, b.x - a.x) * Mathf.Rad2Deg;
  53. var segmentGO = new GameObject("CorridorSegment");
  54. segmentGO.transform.SetParent(transform, false);
  55. segmentGO.transform.position = new Vector3(mid.x, mid.y, transform.position.z);
  56. segmentGO.transform.rotation = Quaternion.Euler(0f, 0f, angle);
  57. segmentGO.transform.localScale = new Vector3(length, radius * 2f, 1f);
  58. var sr = segmentGO.AddComponent<SpriteRenderer>();
  59. sr.sprite = SharedSquareSprite;
  60. sr.color = color;
  61. }
  62. private static Color ColorFor(RoomKind kind)
  63. {
  64. switch (kind)
  65. {
  66. case RoomKind.Start: return new Color(0.2f, 0.6f, 1f);
  67. case RoomKind.Exit: return new Color(1f, 0.3f, 0.3f);
  68. case RoomKind.Hallway: return new Color(0.6f, 0.6f, 0.6f);
  69. default: return new Color(0.3f, 0.8f, 0.4f);
  70. }
  71. }
  72. }
  73. }