Route.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using System.Collections.Generic;
  3. using Roads;
  4. using UnityEngine;
  5. namespace Routes
  6. {
  7. [Serializable]
  8. public struct RouteItem
  9. {
  10. public Turn turn;
  11. public RoadDirection from;
  12. public RoadDirection to;
  13. public void Apply()
  14. {
  15. if (turn.comingFrom != from || turn.goingTo != to)
  16. {
  17. turn.comingFrom = from;
  18. turn.goingTo = to;
  19. turn.UpdateArrows();
  20. }
  21. }
  22. public void Clear()
  23. {
  24. if (turn.comingFrom != RoadDirection.None || turn.goingTo != RoadDirection.None)
  25. {
  26. turn.comingFrom = RoadDirection.None;
  27. turn.goingTo = RoadDirection.None;
  28. turn.UpdateArrows();
  29. }
  30. }
  31. }
  32. public class Route : MonoBehaviour
  33. {
  34. public delegate void OnFinishPassedEvent();
  35. public delegate void OnStartEnteredEvent();
  36. public List<RouteItem> items;
  37. public Transform customStartTransform;
  38. public StraightRoadExtras start;
  39. public StraightRoadExtras finish;
  40. private int visibleLength;
  41. private int visibleStart;
  42. private int VisibleStart => Math.Max(0, visibleStart - 1);
  43. private int VisibleEnd => Math.Min(items.Count, VisibleStart + visibleLength);
  44. private void Start()
  45. {
  46. start.ShowArc();
  47. SetupEvents();
  48. var routeManager = GetComponentInParent<RouteManager>();
  49. visibleStart = 0;
  50. visibleLength = routeManager.visibleLength;
  51. items.ForEach(item => item.turn.OnTriggerExitBicycle = NextTurn);
  52. UpdateRouteItems();
  53. }
  54. public event OnStartEnteredEvent OnStartEntered;
  55. public event OnFinishPassedEvent OnFinishPassed;
  56. private void SetupEvents()
  57. {
  58. start.OnArcEntered += () => { OnStartEntered?.Invoke(); };
  59. finish.OnArcPassed += () => { OnFinishPassed?.Invoke(); };
  60. }
  61. private void NextTurn()
  62. {
  63. //Debug.Log("Route: left intersection - show next turn");
  64. visibleStart++;
  65. UpdateRouteItems();
  66. }
  67. private void UpdateRouteItems()
  68. {
  69. if (VisibleEnd == items.Count - 1) finish.ShowArc();
  70. for (var i = 0; i < VisibleEnd; i++)
  71. {
  72. var item = items[i];
  73. if (i >= VisibleStart)
  74. item.Apply();
  75. else
  76. item.Clear();
  77. }
  78. }
  79. }
  80. }