using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using Pools; using Roads; using UnityEngine; using Valve.VR.InteractionSystem; namespace Routes { public class Turn : MonoBehaviour { public RoadDirection comingFrom; public RoadDirection goingTo; [CanBeNull] private Pool arrowPool; private bool arrowPoolAvailable; private TurnDirection turnDirection; private List usedArrows = new List(); public Action OnTriggerExitBicycle { get; set; } private void Awake() { arrowPool = FindObjectsOfType().FirstOrDefault(o => o.CompareTag("ArrowPool")); arrowPoolAvailable = arrowPool != null; if (!arrowPoolAvailable) Debug.LogWarning("Arrow Pool not found"); } private void Start() { UpdateArrows(); } protected virtual Transform RoadDirectionToTransform(RoadDirection position) { throw new NotImplementedException(); } private void AddArrows(RoadDirection position, GameObject arrows) { if (!arrowPoolAvailable) return; var t = RoadDirectionToTransform(position); SetRotation(arrows, position); arrows.transform.position = t.position; } private void SetRotation(GameObject arrows, RoadDirection position) { var t = arrows.transform; //by default, the arrows show to east switch (position) { case RoadDirection.West: { if (turnDirection == TurnDirection.Left || turnDirection == TurnDirection.Straight && goingTo == RoadDirection.South) { t.rotation = Quaternion.Euler(0, 90, 0); //arrows.transform.Rotate(Vector3.up, 90); } else if (turnDirection == TurnDirection.Right || turnDirection == TurnDirection.Straight && goingTo == RoadDirection.North) { t.rotation = Quaternion.Euler(0, 270, 0); //arrows.transform.Rotate(Vector3.up, 90); } break; } case RoadDirection.North: if (turnDirection == TurnDirection.Left || turnDirection == TurnDirection.Straight && goingTo == RoadDirection.West) { t.rotation = Quaternion.Euler(0, 180, 0); //arrows.transform.Rotate(Vector3.up, 180); } break; case RoadDirection.East: if (turnDirection == TurnDirection.Right || turnDirection == TurnDirection.Straight && goingTo == RoadDirection.South) { t.rotation = Quaternion.Euler(0, 90, 0); //arrows.transform.Rotate(Vector3.up, 90); } else if (turnDirection == TurnDirection.Left || turnDirection == TurnDirection.Straight && goingTo == RoadDirection.North) { t.rotation = Quaternion.Euler(0, 270, 0); //arrows.transform.Rotate(Vector3.up, -90); } break; case RoadDirection.South: if (turnDirection == TurnDirection.Right || turnDirection == TurnDirection.Straight && goingTo == RoadDirection.West) { t.rotation = Quaternion.Euler(0, 180, 0); //arrows.transform.Rotate(Vector3.up, 180); } break; case RoadDirection.None: throw new ArgumentException("RoadDirection.None not allowed for adding arrows"); default: throw new ArgumentOutOfRangeException(nameof(position), position, null); } } public void UpdateArrows() { if (comingFrom == RoadDirection.None || goingTo == RoadDirection.None) { if (!arrowPoolAvailable) return; usedArrows.ForEach(o => { // ReSharper disable once PossibleNullReferenceException arrowPool.ReturnToPool(o); }); usedArrows.Clear(); return; } turnDirection = TurnDirectionMapper.GetTurnDirection(comingFrom, goingTo); var items = new[] {RoadDirection.West, RoadDirection.North, RoadDirection.East, RoadDirection.South}; var usedArrowIndex = 0; foreach (var position in items.Where(i => i != comingFrom && i != goingTo)) { GameObject arrows; if (usedArrowIndex < usedArrows.Count) { arrows = usedArrows[usedArrowIndex]; } else { // ReSharper disable once PossibleNullReferenceException arrows = arrowPool.GetItem(); usedArrows.Add(arrows); } AddArrows(position, arrows); usedArrowIndex++; } } private void OnTriggerExit(Collider other) { if (other.CompareTag("bike")) { OnTriggerExitBicycle(); } } private void OnCollisionEnter(Collision other) { Debug.Log("Colission"); } private void OnTriggerEnter(Collider other) { Debug.Log("Trigger"); } } }