MazeAgentController.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using UnityEngine;
  2. namespace MazeGen
  3. {
  4. /// <summary>
  5. /// Scene-facing wrapper around a MazeAgent: positions a GameObject at the agent's
  6. /// current room and drives exit traversal (generating the next room lazily if needed).
  7. /// </summary>
  8. public class MazeAgentController : MonoBehaviour
  9. {
  10. private MazeGenerator _generator;
  11. public MazeAgent Agent { get; private set; }
  12. public void Initialize(MazeGenerator generator)
  13. {
  14. _generator = generator;
  15. }
  16. public void Spawn(Room startRoom)
  17. {
  18. Agent = new MazeAgent(gameObject.name, startRoom);
  19. transform.position = startRoom.Position;
  20. transform.localScale = Vector3.one * 0.5f;
  21. Agent.RoomEntered += room => transform.position = room.Position;
  22. var sr = gameObject.AddComponent<SpriteRenderer>();
  23. sr.sprite = RoomView.SharedSquareSprite;
  24. sr.color = Color.white;
  25. sr.sortingOrder = 3;
  26. }
  27. /// <summary>
  28. /// Attempts to move the agent through the given exit. Returns false if the exit
  29. /// doesn't belong to the agent's current room. Backtracking through an already-used
  30. /// exit (moving back to a previously generated room) is allowed.
  31. /// </summary>
  32. public bool TryUseExit(Exit exit)
  33. {
  34. if (Agent == null || Agent.CurrentRoom == null) return false;
  35. if (exit.OwnerRoomId != Agent.CurrentRoom.Id) return false;
  36. Room nextRoom = exit.ConnectedRoomId.HasValue
  37. ? _generator.Graph.Get(exit.ConnectedRoomId.Value)
  38. : _generator.GenerateConnectedRoom(Agent.CurrentRoom, exit, Agent);
  39. Agent.EnterRoom(nextRoom, exit);
  40. return true;
  41. }
  42. }
  43. }