namespace Scripts.Routes { using System.Collections; using System.Collections.Generic; using UnityEngine; using Scripts.Waypoints; using Scripts.IA; //! @authors MrWarzo //! Wakestufou //! @brief Trace la route entre le départ et l'arrivée. //! @details Récupère tout les points formants un chemin entre le départ et l'arrivée et crée une ligne visible en jeu pour le représenter. public class RouteTracer : MonoBehaviour { // Champs publiques public Material mat; //!< Matériaux de la ligne. public Transform linesParent; //!< @b GameObject contenant tout les morceaux de ligne. // Champs privés private List<Transform> _waypoints; //!< Liste de tout les waypoints par lesquels la ligne doit passer. [SerializeField] Transform _startObject; //!< @b GameObject de début de la ligne. [SerializeField] Transform _finishObject; //!< @b GameObject de fin de la ligne. //! @brief Se lance au lancement du script. //! @details Initialise une coroutine sur @b CreateLine(). private void Start() { StartCoroutine(CreateLine()); } //! @brief Création d'une ligne entre deux @b GameObject //! @details Récupère les waypoints de départ et d'arrivée et utilise le script @b Waypoints.WaypointsFactory afin de récupérer la liste des points suivant les routes réelles. //! Lance ensuite la fonction @b DrawLine(Vector3, Vector3, Color, float) avec en paramètre des couples de cette liste de manière à tracer une ligne complète suivant les étapes entre le départ et l'arrivée. //! Une fois la ligne entière terminée, active la @b IA.RunnersFactory puis arrête la coroutine. //! @return @eIEnumerator Permet d'assigner un délai à la répétition de la coroutine. IEnumerator CreateLine() { yield return new WaitUntil(() => WaypointsFactory.getInstance().getTest() == false); Debug.Log(WaypointsFactory.getInstance().getTest()); _waypoints = WaypointsFactory.getInstance().getWp(); _startObject = GameObject.FindGameObjectWithTag("start_wp").transform; _finishObject = GameObject.FindGameObjectWithTag("end_wp").transform; for (int i = 0; i < _waypoints.Count - 1; i++) { if (i == 0) { _startObject = GameObject.FindGameObjectWithTag("start_wp").transform; _finishObject = _waypoints[i + 1]; } else if (i == _waypoints.Count - 2) { _startObject = _waypoints[i]; _finishObject = GameObject.FindGameObjectWithTag("end_wp").transform; } else { _startObject = _waypoints[i]; _finishObject = _waypoints[i + 1]; } DrawLine(_startObject.transform.position, _finishObject.transform.position, Color.cyan, 1f); } while(Ui.start == false) { } GameObject.Find("Player").transform.position = new Vector3( (float)((GameObject.FindGameObjectWithTag("start_wp").transform.position.x + GameObject.FindGameObjectWithTag("end_wp").transform.position.x) / 2d), GameObject.Find("Player").transform.position.y, (float)((GameObject.FindGameObjectWithTag("start_wp").transform.position.z + GameObject.FindGameObjectWithTag("end_wp").transform.position.z) / 2d) ); GameObject.Find("Sportifs").GetComponent<RunnersFactory>().enabled = true; } //! @param start Position du @b GameObject de départ. //! @param end Position du @b GameObject d'arrivée. //! @param color Couleur de la ligne. //! @param width Largeur de la ligne. //! @brief Crée une ligne entre deux @b GameObject. //! @details Crée un @b GameObject, lui assigne un @b LineRenderer et initialise celui-ci pour rejoindre les objets @a start et @a end afin de former une ligne. void DrawLine(Vector3 start, Vector3 end, Color color, float width) { GameObject myLine = new GameObject(); myLine.transform.position = start; myLine.AddComponent<LineRenderer>(); myLine.transform.parent = linesParent; LineRenderer lr = myLine.GetComponent<LineRenderer>(); lr.material = mat; lr.startColor = color; lr.endColor = color; lr.startWidth = width; lr.endWidth = width; lr.SetPosition(0, start); lr.SetPosition(1, end); } } }