namespace Scripts.Waypoints { using UnityEngine; using Mapbox.Utils; using Mapbox.Unity.Map; using Mapbox.Unity.Utilities; using System.Collections.Generic; using Scripts.Routes; //! @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 { // Champs publiques public List<GameObject> spawnedObjects; //!< Liste des waypoints placés. public Transform parent; //!< Parent de la liste des waypoints placés. // 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. //! @brief Se lance au lancement du script. //! @details Crée les waypoints sur la map à partir des coordonnées GPS. void Start() { _instance = this; List<Vector2d> Waypoints = new List<Vector2d>(WaypointsFactory.getInstance().getWp()); _locations = new Vector2d[Waypoints.Count]; spawnedObjects = new List<GameObject>(); for (int i = 0; i < _locations.Length; i++) { _locations[i] = Waypoints[i]; var _instances = Instantiate(_markerPrefab, parent); ; if (i == 0) { _instances = Instantiate(_startPrefab, parent); _instances.transform.localScale = new Vector3(_spawnScaleStartEnd, _spawnScaleStartEnd, _spawnScaleStartEnd); } else if (i == _locations.Length - 1) { _instances = Instantiate(_endPrefab, parent); _instances.transform.localScale = new Vector3(_spawnScaleStartEnd, _spawnScaleStartEnd, _spawnScaleStartEnd); } else { _instances.transform.localScale = new Vector3(_spawnScale, _spawnScale, _spawnScale); } _instances.transform.localPosition = _map.GeoToWorldPosition(_locations[i], true); spawnedObjects.Add(_instances); } _zoom = _map.Zoom; } //! @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() { int count = spawnedObjects.Count; for (int i = 0; i < count; i++) { 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; } else if (_zoom <= 2) { GameObject.Find("GameManager").GetComponent<RouteTracer>().enabled = true; } else { _zoom -= 0.25f; _map.UpdateMap(_map.CenterLatitudeLongitude, _zoom); } } //! @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; for (int i = 0; i < spawnedObjects.Count; i++) { if (!spawnedObjects[i].GetComponent<Renderer>().isVisible) verif = false; } return verif; } //! @brief Récupère les objets crées. //! @return @e List<GameObject> Liste des waypoints qui ont été placés. public List<GameObject> getSpawnedObject() { return spawnedObjects; } //! @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() { return _instance; } } }