Skip to content
Snippets Groups Projects
WaypointsFactory.cs 5.4 KiB
Newer Older
namespace Scripts.Waypoints
{
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Mapbox.Utils;
    using Mapbox.Directions;
    using Mapbox.Unity;
    using Mapbox.Unity.Map;
    using Mapbox.Unity.Utilities;


    //! @authors Wakestufou
    //! @brief Gère les Waypoints
    //! @details Cette classe permet de créer les waypoints pour créer la course
    public class WaypointsFactory : MonoBehaviour
    {
        // Champs publiques
        public static List<Vector2d> points; //<! Coordonnées des waypoints
        private string coordonnee1; //<! Coordonnées du point de départ
        private string coordonnee2; //<! Coordonnées du point de fin
        public Transform _prefabs_parent; //<! Objet qui va contenir les waypoints

        // Champs privés
        Directions _directions; //<! Contient les informations gps de la course
        private GameObject map; //<! Map
        private static WaypointsFactory instance; //<! Instance de @b Waypoints.WaypointsFactory
        Vector2d[] _coordinates; //<! Va contenir @a coordonnee1 et @a coordonnee2
        DirectionResource _directionResource; //<! Contient les informations sous forme de json deserialize
        private DirectionsResponse _DirectionResourceResultat; //<! Contient les informations de @a _directionRessource
        private bool test = true; //<! Test si la création des waypoints est finie
        private AbstractMap abstractmap; //<! Map Google Street View.

        //! @brief Se lance au lancement du script.
        //! @details Initialise les variables
        void Start()
        {
            instance = this;
            map = GameObject.Find("Map");
            abstractmap = map.GetComponent<AbstractMap>();
            points = new List<Vector2d>();
            coordonnee1 = "";
            coordonnee2 = "";
            _directions = MapboxAccess.Instance.Directions;

            _coordinates = new Vector2d[2];

            _directionResource = new DirectionResource(_coordinates, RoutingProfile.Driving);
            _directionResource.Steps = true;
        }

        //! @brief Retourne l'instance
        //! @details return @a instance
        //! @return @e WaypointsFactory Instance actuelle.
        public static WaypointsFactory getInstance()
        {
            return instance;
        }
LE-CUDENEC JOFFREY's avatar
LE-CUDENEC JOFFREY committed
        /*
        //! @brief Retourne si les waypoints ont fini d'être crée
        //! @details Retourne si les waypoints ont fini d'être crée
        public bool getTest()
        {
            return test;
LE-CUDENEC JOFFREY's avatar
LE-CUDENEC JOFFREY committed
        }*/

        //! @brief Retourne les coordonnées des waypoints
        //! @details Retourne la liste des coordonnées des waypoints
        public List<Vector2d> getWp()

        //! @brief Créer la route
        //! @details Créer la route avec le point de départ et de fin
        void Route()
        {
            _coordinates[0] = Conversions.StringToLatLon(coordonnee1);
            _coordinates[1] = Conversions.StringToLatLon(coordonnee2);
            _directionResource.Coordinates = _coordinates;
            _directions.Query(_directionResource, HandleDirectionsResponse);
        }

        //! @param res Réponse de la direction.
        //! @brief Enregistre les informations
        //! @details Enregistre les informations en format json deserialize
        void HandleDirectionsResponse(DirectionsResponse res)
        {
            _DirectionResourceResultat = res;
        //! @param coord1 Coordonnée 1
        //! @param coord2 Coordonnée 2
        //! @brief Lance la création de route
        //! @details Lance la création de route
        public void click(string coord1, string coord2)
        {
            coordonnee1 = coord1;
            coordonnee2 = coord2;
            Debug.Log(coordonnee1);
            Debug.Log(coordonnee2);
            StartCoroutine(createRoad());
        }


        //! @brief Lance la création de route
        //! @details Lance la création de route
        //! @return @e IEnumerator Permet d'assigner un délai à la répétition de la coroutine.
        IEnumerator createRoad()
        {
            if (coordonnee1 == "" || coordonnee2 == "")
            {

            }
            else
            {
                Route();
                yield return new WaitUntil(() => test == false);
                PlacementWaypoint(abstractmap.WorldToGeoPosition(GameObject.FindGameObjectWithTag("start_wp").transform.position));
                foreach (var val in _DirectionResourceResultat.Routes[0].Legs[0].Steps)
                {
                    foreach (var inter in val.Intersections)
                    {
                        PlacementWaypoint(inter.Location);
                    }
                }

                PlacementWaypoint(abstractmap.WorldToGeoPosition(GameObject.FindGameObjectWithTag("end_wp").transform.position));

                GameObject.FindGameObjectWithTag("start_wp").Destroy();
                GameObject.FindGameObjectWithTag("end_wp").Destroy();

                map.GetComponent<SpawnOnMap>().enabled = true;
            }
        //! @param coordonnesPoints Coordonnées du point à ajouter.
        //! @brief Enregistre un waypoints
        //! @details Enregistre les coordonnées d'un waypoints
        void PlacementWaypoint(Vector2d coordonnesPoints)
        {
            points.Add(coordonnesPoints);