Skip to content
Snippets Groups Projects
SpawnOnMap.cs 5.26 KiB
Newer Older
MrWarzo's avatar
MrWarzo committed
namespace Scripts.Waypoints
MrWarzo's avatar
MrWarzo committed
    using UnityEngine;
    using Mapbox.Utils;
    using Mapbox.Unity.Map;
    using Mapbox.Unity.Utilities;
    using System.Collections.Generic;
    using Scripts.Routes;

MrWarzo's avatar
MrWarzo committed
    //! @authors MapBox
    //!     Wakestufou
    //! @brief Fait apparaître des waypoints sur la Map.
    //! @details Cette classe s'occupe de transformer une liste de coordonnées GPS en waypoints liés à la map. 
    //!     De cette maniètre la caméra peut bouger, les waypoints resterons à leur  position de base.
    //! du placement des waypoints et tu tracé de la route.
    public class SpawnOnMap : MonoBehaviour
MrWarzo's avatar
MrWarzo committed
    {
        // Champs publiques
        public List<GameObject> spawnedObjects; //!< Liste des waypoints placés.
        public Transform parent; //!< Parent de la liste des waypoints placés.
MrWarzo's avatar
MrWarzo committed
        // Champs privés
        private float _zoom; //!< Valeur du zoom de la caméra sur la map.
        private static SpawnOnMap _instance; //!< Instance actuelle.
        [SerializeField] AbstractMap _map; //!<  Map Google Street View.
        [SerializeField] [Geocode] Vector2d[] _locations; //!< Liste des positions GPS des waypoints à placer.
        [SerializeField] float _spawnScale = 1f; //!< Taille d'un waypoint de base.
        [SerializeField] float _spawnScaleStartEnd = 6f; //!< Taille des waypoints de départ et d'arrivée.
        [SerializeField] GameObject _markerPrefab; //!< Préfabriqué d'un waypoint de base.
        [SerializeField] GameObject _startPrefab; //!< Préfabriqué du waypoint de départ.
        [SerializeField] GameObject _endPrefab; //!< Préfabriqué du waypoint d'arrivée.
MrWarzo's avatar
MrWarzo committed
        //! @brief Se lance au lancement du script.
        //! @details Crée les waypoints sur la map à partir des coordonnées GPS.
        void Start()
        {
MrWarzo's avatar
MrWarzo committed
            _instance = this;
            List<Vector2d> Waypoints = new List<Vector2d>(WaypointsFactory.getInstance().getWp());
            _locations = new Vector2d[Waypoints.Count];
MrWarzo's avatar
MrWarzo committed
            spawnedObjects = new List<GameObject>();
            for (int i = 0; i < _locations.Length; i++)
            {
                _locations[i] = Waypoints[i];
MrWarzo's avatar
MrWarzo committed
                var _instances = Instantiate(_markerPrefab, parent); ;
MrWarzo's avatar
MrWarzo committed
                    _instances = Instantiate(_startPrefab, parent);
                    _instances.transform.localScale = new Vector3(_spawnScaleStartEnd, _spawnScaleStartEnd, _spawnScaleStartEnd);
                }
                else if (i == _locations.Length - 1)
                {
MrWarzo's avatar
MrWarzo committed
                    _instances = Instantiate(_endPrefab, parent);
                    _instances.transform.localScale = new Vector3(_spawnScaleStartEnd, _spawnScaleStartEnd, _spawnScaleStartEnd);
MrWarzo's avatar
MrWarzo committed
                    _instances.transform.localScale = new Vector3(_spawnScale, _spawnScale, _spawnScale);
MrWarzo's avatar
MrWarzo committed

                _instances.transform.localPosition = _map.GeoToWorldPosition(_locations[i], true);
                spawnedObjects.Add(_instances);
            }
            _zoom = _map.Zoom;
        }

MrWarzo's avatar
MrWarzo committed
        //! @brief Se répète toutes les 14ms (temps par défaut dans Unity).
        //! @details Met à jour les waypoints de la map afin qu'ils gardent leur place réelle et non leur position Unity.
        private void Update()
        {
MrWarzo's avatar
MrWarzo committed
            int count = spawnedObjects.Count;
            for (int i = 0; i < count; i++)
            {
MrWarzo's avatar
MrWarzo committed
                var spawnedObject = spawnedObjects[i];
                var location = _locations[i];
                spawnedObject.transform.localPosition = _map.GeoToWorldPosition(location, true);
                spawnedObject.transform.localScale = new Vector3(_spawnScale, _spawnScale, _spawnScale);
            }

            if (VerifVisible())
            {
                GameObject.Find("GameManager").GetComponent<RouteTracer>().enabled = true;
MrWarzo's avatar
MrWarzo committed
            }
            else if (_zoom <= 2)
            {
                GameObject.Find("GameManager").GetComponent<RouteTracer>().enabled = true;
MrWarzo's avatar
MrWarzo committed
            }
                _map.UpdateMap(_map.CenterLatitudeLongitude, _zoom);
            }
        }

MrWarzo's avatar
MrWarzo committed
        //! @brief Test la visibilité des waypoints.
        //! @details Si un waypoints n'est dans le champs de vision de la caméra.
        //! @return @e bool Si un waypoint n'est pas visible renvoie @b false, sinon renvoie @b true
        private bool VerifVisible()
        {
            bool verif = true;
MrWarzo's avatar
MrWarzo committed
            for (int i = 0; i < spawnedObjects.Count; i++)
MrWarzo's avatar
MrWarzo committed
                if (!spawnedObjects[i].GetComponent<Renderer>().isVisible) verif = false;
MrWarzo's avatar
MrWarzo committed
        //! @brief Récupère les objets crées.
        //! @return @e List<GameObject> Liste des waypoints qui ont été placés.
        public List<GameObject> getSpawnedObject()
        {
MrWarzo's avatar
MrWarzo committed
            return spawnedObjects;
MrWarzo's avatar
MrWarzo committed
        //! @brief Récupère l'instance de Waypoints.SpawnOnMap
        //! @details Récupère l'instance du script actuel afin de respecter un patterne @b singleton.
        //! @return @e SpawnOnMap Instance actuelle.
        public static SpawnOnMap getInstance()
        {
MrWarzo's avatar
MrWarzo committed
            return _instance;
MrWarzo's avatar
MrWarzo committed
}