From e53adb74836257ff1d6252cacc579a3bf5b7961b Mon Sep 17 00:00:00 2001 From: brnkhy Date: Fri, 7 Aug 2020 03:27:03 +0300 Subject: [PATCH 01/18] add basic offline map support --- .../Platform/Cache/SQLiteCache/SQLiteCache.cs | 272 +++++++++-- .../Platform/Cache/SQLiteCache/Tiles.cs | 2 + .../Platform/Cache/SQLiteCache/Tilesets.cs | 21 + .../mapbox-sdk-cs/Platform/SQLite/SQLite.cs | 40 +- .../Assets/Mapbox/Unity/MapboxAccess.cs | 8 +- .../Assets/Mapbox/Unity/OfflineManager.cs | 424 ++++++++++++++++++ sdkproject/Assets/Offline/OfflineMode.cs | 299 ++++++++++++ 7 files changed, 1014 insertions(+), 52 deletions(-) create mode 100644 sdkproject/Assets/Mapbox/Unity/OfflineManager.cs create mode 100644 sdkproject/Assets/Offline/OfflineMode.cs diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs index a221ce117..aa6f0860f 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs @@ -1,6 +1,7 @@ -namespace Mapbox.Platform.Cache -{ +using UnityEngine.PlayerLoop; +namespace Mapbox.Platform.Cache +{ using Mapbox.Map; using Mapbox.Utils; using SQLite4Unity3d; @@ -12,18 +13,22 @@ public class SQLiteCache : ICache, IDisposable { - - /// /// maximum number tiles that get cached /// - public uint MaxCacheSize { get { return _maxTileCount; } } + public uint MaxCacheSize + { + get { return _maxTileCount; } + } /// /// Check cache size every n inserts /// - public uint PruneCacheDelta { get { return _pruneCacheDelta; } } + public uint PruneCacheDelta + { + get { return _pruneCacheDelta; } + } #if MAPBOX_DEBUG_CACHE @@ -34,10 +39,13 @@ public class SQLiteCache : ICache, IDisposable private string _dbPath; private SQLiteConnection _sqlite; private readonly uint _maxTileCount; + /// check cache size only every '_pruneCacheDelta' calls to 'Add()' to avoid being too chatty with the database private const int _pruneCacheDelta = 20; + /// counter to keep track of calls to `Add()` private int _pruneCacheCounter = 0; + private object _lock = new object(); @@ -51,7 +59,6 @@ public SQLiteCache(uint? maxTileCount = null, string dbName = "cache.db") #region idisposable - ~SQLiteCache() { Dispose(false); @@ -77,17 +84,16 @@ protected virtual void Dispose(bool disposeManagedResources) _sqlite = null; } } + _disposed = true; } } - #endregion private void init() { - #if MAPBOX_DEBUG_CACHE _className = this.GetType().Name; #endif @@ -112,7 +118,6 @@ name STRING NOT NULL List colInfoTiles = _sqlite.GetTableInfo(typeof(tiles).Name); if (0 == colInfoTiles.Count) { - string cmdCreateTableTiles = @"CREATE TABLE tiles( tile_set INTEGER REFERENCES tilesets (id) ON DELETE CASCADE ON UPDATE CASCADE, zoom_level INTEGER NOT NULL, @@ -122,6 +127,7 @@ tile_set INTEGER REFERENCES tilesets (id) ON DELETE CASCADE ON UPDATE CASCAD timestamp INTEGER NOT NULL, etag TEXT, lastmodified INTEGER, +offlineMapTags TEXT, PRIMARY KEY( tile_set ASC, zoom_level ASC, @@ -198,17 +204,19 @@ public static string GetFullDbPath(string dbName) #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_WSA dbPath = Path.GetFullPath(dbPath); #endif - if (!Directory.Exists(dbPath)) { Directory.CreateDirectory(dbPath); } + if (!Directory.Exists(dbPath)) + { + Directory.CreateDirectory(dbPath); + } + dbPath = Path.Combine(dbPath, dbName); return dbPath; } - public void Add(string tilesetName, CanonicalTileId tileId, CacheItem item, bool forceInsert = false) { - #if MAPBOX_DEBUG_CACHE string methodName = _className + "." + new System.Diagnostics.StackFrame().GetMethod().Name; UnityEngine.Debug.LogFormat("{0} {1} {2} forceInsert:{3}", methodName, tileset, tileId, forceInsert); @@ -247,8 +255,9 @@ public void Add(string tilesetName, CanonicalTileId tileId, CacheItem item, bool tile_column = tileId.X, tile_row = tileId.Y, tile_data = item.Data, - timestamp = (int)UnixTimestampUtils.To(DateTime.Now), - etag = item.ETag + timestamp = (int) UnixTimestampUtils.To(DateTime.Now), + etag = item.ETag, + offlineMapTags = "" }); if (1 != rowsAffected) { @@ -265,20 +274,52 @@ public void Add(string tilesetName, CanonicalTileId tileId, CacheItem item, bool { _pruneCacheCounter++; } + if (0 == _pruneCacheCounter % _pruneCacheDelta) { _pruneCacheCounter = 0; - prune(); + //prune(); + pruneNonOfflineTiles(); } } private void prune() { + long tileCnt = _sqlite.ExecuteScalar("SELECT COUNT(zoom_level) FROM tiles"); + + if (tileCnt < _maxTileCount) + { + return; + } + long toDelete = tileCnt - _maxTileCount; + +#if MAPBOX_DEBUG_CACHE + string methodName = _className + "." + new System.Diagnostics.StackFrame().GetMethod().Name; + Debug.LogFormat("{0} {1} about to prune()", methodName, _tileset); +#endif + + try + { + // no 'ORDER BY' or 'LIMIT' possible if sqlite hasn't been compiled with 'SQLITE_ENABLE_UPDATE_DELETE_LIMIT' + // https://sqlite.org/compile.html#enable_update_delete_limit + _sqlite.Execute("DELETE FROM tiles WHERE rowid IN ( SELECT rowid FROM tiles WHERE offlineMapTags == \"\" ORDER BY timestamp ASC LIMIT ? );", toDelete); + } + catch (Exception ex) + { + Debug.LogErrorFormat("error pruning: {0}", ex); + } + } + + private void pruneNonOfflineTiles() + { long tileCnt = _sqlite.ExecuteScalar("SELECT COUNT(zoom_level) FROM tiles"); - if (tileCnt < _maxTileCount) { return; } + if (tileCnt < _maxTileCount) + { + return; + } long toDelete = tileCnt - _maxTileCount; @@ -328,7 +369,7 @@ public CacheItem Get(string tilesetName, CanonicalTileId tileId) && t.zoom_level == tileId.Z && t.tile_column == tileId.X && t.tile_row == tileId.Y - ) + ) .FirstOrDefault(); } catch (Exception ex) @@ -336,13 +377,17 @@ public CacheItem Get(string tilesetName, CanonicalTileId tileId) Debug.LogErrorFormat("error getting tile {1} {2} from cache{0}{3}", Environment.NewLine, tilesetName, tileId, ex); return null; } + if (null == tile) { return null; } DateTime? lastModified = null; - if (tile.lastmodified.HasValue) { lastModified = UnixTimestampUtils.From((double)tile.lastmodified.Value); } + if (tile.lastmodified.HasValue) + { + lastModified = UnixTimestampUtils.From((double) tile.lastmodified.Value); + } return new CacheItem() { @@ -353,6 +398,20 @@ public CacheItem Get(string tilesetName, CanonicalTileId tileId) }; } + private tiles GetTile(CanonicalTileId tileId, int tilesetId) + { + tiles tile; + tile = _sqlite + .Table() + .Where(t => + t.tile_set == tilesetId + && t.zoom_level == tileId.Z + && t.tile_column == tileId.X + && t.tile_row == tileId.Y + ) + .FirstOrDefault(); + return tile; + } /// /// Check if tile exists @@ -374,22 +433,22 @@ public bool TileExists(string tilesetName, CanonicalTileId tileId) && t.zoom_level == tileId.Z && t.tile_column == tileId.X && t.tile_row == tileId.Y - ) + ) .FirstOrDefault(); } - private int insertTileset(string tilesetName) { try { _sqlite.BeginTransaction(true); - tilesets newTileset = new tilesets { name = tilesetName }; + tilesets newTileset = new tilesets {name = tilesetName}; int rowsAffected = _sqlite.Insert(newTileset); if (1 != rowsAffected) { throw new Exception(string.Format("tileset [{0}] was not inserted, rows affected:{1}", tilesetName, rowsAffected)); } + return newTileset.id; } catch (Exception ex) @@ -403,17 +462,15 @@ private int insertTileset(string tilesetName) } } - private int? getTilesetId(string tilesetName) { tilesets tileset = _sqlite .Table() .Where(ts => ts.name.Equals(tilesetName)) .FirstOrDefault(); - return null == tileset ? (int?)null : tileset.id; + return null == tileset ? (int?) null : tileset.id; } - /// /// FOR INTERNAL DEBUGGING ONLY - DON'T RELY ON IN PRODUCTION /// @@ -422,7 +479,10 @@ private int insertTileset(string tilesetName) public long TileCount(string tilesetName) { int? tilesetId = getTilesetId(tilesetName); - if (!tilesetId.HasValue) { return 0; } + if (!tilesetId.HasValue) + { + return 0; + } return _sqlite .Table() @@ -430,7 +490,6 @@ public long TileCount(string tilesetName) .LongCount(); } - /// /// Clear cache for one tile set /// @@ -438,7 +497,11 @@ public long TileCount(string tilesetName) public void Clear(string tilesetName) { int? tilesetId = getTilesetId(tilesetName); - if (!tilesetId.HasValue) { return; } + if (!tilesetId.HasValue) + { + return; + } + //just delete on table 'tilesets', we've setup cascading which should take care of tabls 'tiles' _sqlite.Delete(tilesetId.Value); } @@ -451,7 +514,10 @@ public void Clear(string tilesetName) public void Clear() { //already disposed - if (null == _sqlite) { return; } + if (null == _sqlite) + { + return; + } _sqlite.Close(); _sqlite.Dispose(); @@ -481,5 +547,151 @@ public void Clear() File.Delete(_dbPath); } + public void AddOffline(string tilesetName, string offlineMapName, CanonicalTileId tileId, CacheItem cacheItem, bool forceInsert) + { + try + { + int? tilesetId = null; + lock (_lock) + { + tilesetId = getTilesetId(tilesetName); + if (!tilesetId.HasValue) + { + tilesetId = insertTileset(tilesetName); + } + } + + var tile = GetTile(tileId, tilesetId.Value); + if (tile != null) + { + //UpdateTileOfflineTag(tile, offlineMapName); + UpdateOfflineTile(offlineMapName, tile, true); + //_sqlite.Update(tile); + return; + } + + + if (tilesetId < 0) + { + Debug.LogErrorFormat("could not get tilesetID for [{0}] tile: {1}", tilesetName, tileId); + return; + } + + int rowsAffected = _sqlite.InsertOrReplace(new tiles + { + tile_set = tilesetId.Value, + zoom_level = tileId.Z, + tile_column = tileId.X, + tile_row = tileId.Y, + tile_data = cacheItem.Data, + timestamp = (int) UnixTimestampUtils.To(DateTime.Now), + etag = cacheItem.ETag, + offlineMapTags = offlineMapName + }); + if (1 != rowsAffected) + { + throw new Exception(string.Format("tile [{0} / {1}] was not inserted, rows affected:{2}", tilesetName, tileId, rowsAffected)); + } + } + catch (Exception ex) + { + Debug.LogErrorFormat("Error inserting {0} {1} {2} ", tilesetName, tileId, ex); + } + } + + private void UpdateOfflineTile(string offlineMapName, tiles tile, bool add) + { + string tagString = ""; + if (string.IsNullOrWhiteSpace(tile.offlineMapTags)) + { + tagString = offlineMapName; + } + else + { + var tagArray = tile.offlineMapTags.Split(',').ToList(); + if (add && !tagArray.Contains(offlineMapName)) + { + tagArray.Add(offlineMapName); + } + else if (!add && tagArray.Contains(offlineMapName)) + { + tagArray.Remove(offlineMapName); + } + + tagString = string.Join(",", tagArray); + } + + try + { + var query = string.Format("UPDATE tiles SET offlineMapTags = '{0}' WHERE tile_set={1} AND zoom_level={2} AND tile_column={3} AND tile_row={4};", + tagString, + tile.tile_set, + tile.zoom_level, + tile.tile_column, + tile.tile_row); + _sqlite.Execute(query); + } + catch (Exception ex) + { + Debug.LogErrorFormat("error adding offline tile name to : {0}", ex); + } + } + + public void DeleteOfflineMap(string offlineMapName) + { + var tiles = _sqlite + .Table() + .Where(t => t.offlineMapTags.Contains(offlineMapName)); + + foreach (var tile in tiles) + { + UpdateOfflineTile(offlineMapName, tile, false); + } + } + + public int GetTileCountOfMap(string offlineMapName) + { + return _sqlite + .Table() + .Where(t => t.offlineMapTags.Contains(offlineMapName)) + .Count(); + } + + public int GetOfflineTileCount() + { + return _sqlite + .Table() + .Where(t => t.offlineMapTags != "") + .Count(); + } + + public Dictionary GetOfflineMapList() + { + var mapList = new Dictionary(); + var tiles = _sqlite + .Table() + .Where(t => t.offlineMapTags != ""); + + foreach (var tile in tiles) + { + if (!string.IsNullOrWhiteSpace(tile.offlineMapTags)) + { + var maps = tile.offlineMapTags.Split(','); + foreach (var mapName in maps) + { + if (!mapList.ContainsKey(mapName)) + { + mapList.Add(mapName, 1); + } + else + { + mapList[mapName]++; + } + } + } + } + + return mapList; + } } -} +} \ No newline at end of file diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs index 18629526b..7920933be 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs @@ -36,5 +36,7 @@ public class tiles /// Last-Modified header value of API response. Not all APIs populate it, will be -1 in that case. public int? lastmodified { get; set; } + + public string offlineMapTags { get; set; } } } diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tilesets.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tilesets.cs index ebd47aa28..1a1e9ddc1 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tilesets.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tilesets.cs @@ -20,4 +20,25 @@ public class tilesets public string name { get; set; } } + + public class offlinemaps + { + [PrimaryKey, AutoIncrement] + public int id { get; set; } + + public string name { get; set; } + } + + public class offlinemaptotile + { + public int tile { get; set; } + + public int offlinemap { get; set; } + } + + public class sqlite_sequence + { + public string name { get; set; } + public int seq { get; set; } + } } diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/SQLite/SQLite.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/SQLite/SQLite.cs index b28b443c4..b2055bc04 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/SQLite/SQLite.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/SQLite/SQLite.cs @@ -281,12 +281,12 @@ public IEnumerable TableMappings /// /// /// The type whose mapping to the database is returned. - /// + /// /// /// Optional flags allowing implicit PK and indexes based on naming conventions - /// + /// /// - /// The mapping represents the schema of the columns of the database and contains + /// The mapping represents the schema of the columns of the database and contains /// methods to set and get properties of objects. /// public TableMapping GetMapping(Type type, CreateFlags createFlags = CreateFlags.None) @@ -308,7 +308,7 @@ public TableMapping GetMapping(Type type, CreateFlags createFlags = CreateFlags. /// Retrieves the mapping that is automatically generated for the given type. /// /// - /// The mapping represents the schema of the columns of the database and contains + /// The mapping represents the schema of the columns of the database and contains /// methods to set and get properties of objects. /// public TableMapping GetMapping() @@ -363,7 +363,7 @@ public int CreateTable(CreateFlags createFlags = CreateFlags.None) /// later access this schema by calling GetMapping. /// /// Type to reflect to a database table. - /// Optional flags allowing implicit PK and indexes based on naming conventions. + /// Optional flags allowing implicit PK and indexes based on naming conventions. /// /// The number of entries added to the database schema. /// @@ -805,7 +805,7 @@ public IEnumerable DeferredQuery(TableMapping map, string query, params /// /// Attempts to retrieve the first object that matches the predicate from the table - /// associated with the specified type. + /// associated with the specified type. /// /// /// A predicate for which object to find. @@ -859,7 +859,7 @@ public object Find(object pk, TableMapping map) /// /// Attempts to retrieve the first object that matches the predicate from the table - /// associated with the specified type. + /// associated with the specified type. /// /// /// A predicate for which object to find. @@ -887,9 +887,9 @@ public bool IsInTransaction /// Throws if a transaction has already begun. public void BeginTransaction(bool exclusive = false) { - // The BEGIN command only works if the transaction stack is empty, - // or in other words if there are no pending transactions. - // If the transaction stack is not empty when the BEGIN command is invoked, + // The BEGIN command only works if the transaction stack is empty, + // or in other words if there are no pending transactions. + // If the transaction stack is not empty when the BEGIN command is invoked, // then the command fails with an error. // Rather than crash with an error, we will just ignore calls to BeginTransaction // that would result in an error. @@ -911,7 +911,7 @@ public void BeginTransaction(bool exclusive = false) var sqlExp = ex as SQLiteException; if (sqlExp != null) { - // It is recommended that applications respond to the errors listed below + // It is recommended that applications respond to the errors listed below // by explicitly issuing a ROLLBACK command. // TODO: This rollback failsafe should be localized to all throw sites. switch (sqlExp.Result) @@ -927,7 +927,7 @@ public void BeginTransaction(bool exclusive = false) } else { - // Call decrement and not VolatileWrite in case we've already + // Call decrement and not VolatileWrite in case we've already // created a transaction point in SaveTransactionPoint since the catch. Interlocked.Decrement(ref _transactionDepth); } @@ -945,7 +945,7 @@ public void BeginTransaction(bool exclusive = false) /// /// Creates a savepoint in the database at the current point in the transaction timeline. /// Begins a new transaction if one is not in progress. - /// + /// /// Call to undo transactions since the returned savepoint. /// Call to commit transactions after the savepoint returned here. /// Call to end the transaction, committing all changes. @@ -965,7 +965,7 @@ public string SaveTransactionPoint() var sqlExp = ex as SQLiteException; if (sqlExp != null) { - // It is recommended that applications respond to the errors listed below + // It is recommended that applications respond to the errors listed below // by explicitly issuing a ROLLBACK command. // TODO: This rollback failsafe should be localized to all throw sites. switch (sqlExp.Result) @@ -1013,8 +1013,8 @@ public void RollbackTo(string savepoint) /// true to avoid throwing exceptions, false otherwise void RollbackTo(string savepoint, bool noThrow) { - // Rolling back without a TO clause rolls backs all transactions - // and leaves the transaction stack empty. + // Rolling back without a TO clause rolls backs all transactions + // and leaves the transaction stack empty. try { if (String.IsNullOrEmpty(savepoint)) @@ -1039,10 +1039,10 @@ void RollbackTo(string savepoint, bool noThrow) } /// - /// Releases a savepoint returned from . Releasing a savepoint + /// Releases a savepoint returned from . Releasing a savepoint /// makes changes since that savepoint permanent if the savepoint began the transaction, /// or otherwise the changes are permanent pending a call to . - /// + /// /// The RELEASE command is like a COMMIT for a SAVEPOINT. /// /// The name of the savepoint to release. The string should be the result of a call to @@ -1325,13 +1325,13 @@ public int Insert(object obj, string extra, Type objType) { var info = objType.GetTypeInfo(); prop = info.GetDeclaredProperty(map.PK.PropertyName); - if (prop != null) + if (prop != null) { if (prop.GetValue(obj, null).Equals(Guid.Empty)) { prop.SetValue(obj, Guid.NewGuid(), null); } - break; + break; } objType = info.BaseType; diff --git a/sdkproject/Assets/Mapbox/Unity/MapboxAccess.cs b/sdkproject/Assets/Mapbox/Unity/MapboxAccess.cs index 9e9d19a27..af83f835f 100644 --- a/sdkproject/Assets/Mapbox/Unity/MapboxAccess.cs +++ b/sdkproject/Assets/Mapbox/Unity/MapboxAccess.cs @@ -21,6 +21,7 @@ namespace Mapbox.Unity /// public class MapboxAccess : IFileSource { + public OfflineManager OfflineManager; ITelemetryLibrary _telemetryLibrary; CachingWebFileSource _fileSource; @@ -167,10 +168,14 @@ private void LoadAccessToken() void ConfigureFileSource() { + var sqliteCache = new SQLiteCache(_configuration.FileCacheSize); + OfflineManager = new OfflineManager(_configuration.AccessToken, _configuration.GetMapsSkuToken); + OfflineManager.SetOfflineCache(sqliteCache); + _fileSource = new CachingWebFileSource(_configuration.AccessToken, _configuration.GetMapsSkuToken, _configuration.AutoRefreshCache) .AddCache(new MemoryCache(_configuration.MemoryCacheSize)) #if !UNITY_WEBGL - .AddCache(new SQLiteCache(_configuration.FileCacheSize)) + .AddCache(sqliteCache) #endif ; } @@ -234,7 +239,6 @@ string url return _fileSource.Request(url, callback, _configuration.DefaultTimeout, tileId, tilesetId); } - Geocoder _geocoder; /// /// Lazy geocoder. diff --git a/sdkproject/Assets/Mapbox/Unity/OfflineManager.cs b/sdkproject/Assets/Mapbox/Unity/OfflineManager.cs new file mode 100644 index 000000000..9997dcbd5 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Unity/OfflineManager.cs @@ -0,0 +1,424 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using Mapbox.Map; +using Mapbox.Platform; +using Mapbox.Platform.Cache; +using Mapbox.Unity; +using Mapbox.Unity.Utilities; +using Mapbox.Utils; +using UnityEngine; +using Constants = Mapbox.Utils.Constants; + +public class OfflineManager +{ + private string _accessToken; + private Func _getMapsSkuToken; + private SQLiteCache _offlineCache; + + public Action NewLog = (log) => { }; + public Action ProgressUpdated = (progress) => { }; + public Action DownloadFinished = (tileCount) => { }; + public float Progress = 0; + + private int _currentCoroutine; + + //public List EstimatedTileList = new List(); + private int _currentlyDownloadedFileCount; + private int _currentlyRequestedFileCount; + private int _totalTileCount; + private bool _isDownloading; + + private readonly int OfflineTileLimit = 6000; + private OfflineMapDownloadInfo _offlineMapDownloadInfo; + + public OfflineManager(string configurationAccessToken, Func getMapsSkuToken) + { + _accessToken = configurationAccessToken; + _getMapsSkuToken = getMapsSkuToken; + } + + public int GetTileCountOfMap(string offlineMapName) + { + return _offlineCache.GetTileCountOfMap(offlineMapName); + } + + public int GetOfflineTileCount() + { + return _offlineCache.GetOfflineTileCount(); + } + + public Dictionary GetOfflineMapList() + { + return _offlineCache.GetOfflineMapList(); + } + + public void SetOfflineCache(SQLiteCache sqliteCache) + { + _offlineCache = sqliteCache; + } + + public void DeleteOfflineMap(string offlineMapName) + { + NewLog("Starting to delete resources of offline map: " + offlineMapName); + _offlineCache.DeleteOfflineMap(offlineMapName); + NewLog("Finished deleting the resources of offline map: " + offlineMapName); + } + + public void RequestTile(OfflineTileType type, CanonicalTileId tileId, string tilesetId, string offlineMapName, Action callback) + { + var uri = GetUri(type, tileId, tilesetId); + Request(uri, tileId, tilesetId, offlineMapName, callback); + } + + public OfflineMapResponse CreateOfflineMap(string cacheName, OfflineRegion region) + { + + var tiles = EstimatedTileList(region); + if (tiles.Count <= 0) + { + return new OfflineMapResponse() + { + HasErrors = true, + ErrorMessage = "Region doesn't contain any tiles." + }; + } + + var currentOfflineTileCount = _offlineCache.GetOfflineTileCount(); + var capacityLeft = OfflineTileLimit - currentOfflineTileCount; + if (capacityLeft <= 0) + { + return new OfflineMapResponse() + { + HasErrors = true, + ErrorMessage = "Offline cache capacity is full." + }; + } + + if (capacityLeft < tiles.Count) + { + _offlineMapDownloadInfo = new OfflineMapDownloadInfo(cacheName, capacityLeft); + _currentCoroutine = Runnable.Run(DownloadCoroutine(cacheName, tiles.Take(capacityLeft).ToList())); + return new OfflineMapResponse() + { + HasErrors = true, + ErrorMessage = "Not enough capacity to download whole region. Downloading first " + capacityLeft + " tiles." + }; + } + else + { + _offlineMapDownloadInfo = new OfflineMapDownloadInfo(cacheName, tiles.Count); + _currentCoroutine = Runnable.Run(DownloadCoroutine(cacheName, tiles)); + return new OfflineMapResponse() + { + HasErrors = false, + ErrorMessage = "Downloading " + tiles.Count + " tiles." + }; + } + } + + public List EstimatedTileList(OfflineRegion region) + { + var estimatedTileList = new List(); + try + { + if (string.IsNullOrEmpty(region.MinLatLng) || string.IsNullOrEmpty(region.MaxLatLng)) + return null; + + estimatedTileList.Clear(); + for (int currentZoom = region.MinZoom; currentZoom <= region.MaxZoom; currentZoom++) + { + foreach (var tileId in GetWithWebMerc(Conversions.StringToLatLon(region.MinLatLng), Conversions.StringToLatLon(region.MaxLatLng), currentZoom)) + { + if (!string.IsNullOrWhiteSpace(region.ElevationTilesetId)) + { + estimatedTileList.Add(new OfflineTileInfo(tileId, OfflineTileType.Elevation, region.ElevationTilesetId)); + } + + if (!string.IsNullOrWhiteSpace(region.ImageTilesetId)) + { + estimatedTileList.Add(new OfflineTileInfo(tileId, OfflineTileType.Imagery, region.ImageTilesetId)); + } + + if (!string.IsNullOrWhiteSpace(region.VectorTilesetId)) + { + estimatedTileList.Add(new OfflineTileInfo(tileId, OfflineTileType.Vector, region.VectorTilesetId)); + } + } + } + + return estimatedTileList; + } + catch (Exception e) + { + // ignored + return null; + } + } + + public int EstimatedOfflineTileCount(OfflineRegion region) + { + var tileCount = 0; + var tileDataCount = 0; + try + { + if (string.IsNullOrEmpty(region.MinLatLng) || string.IsNullOrEmpty(region.MaxLatLng)) + return tileCount; + + tileCount = 0; + for (int currentZoom = region.MinZoom; currentZoom <= region.MaxZoom; currentZoom++) + { + foreach (var tileId in GetWithWebMerc(Conversions.StringToLatLon(region.MinLatLng), Conversions.StringToLatLon(region.MaxLatLng), currentZoom)) + { + tileCount++; + } + } + + if (!string.IsNullOrWhiteSpace(region.ElevationTilesetId)) + { + tileDataCount += tileCount; + } + + if (!string.IsNullOrWhiteSpace(region.ImageTilesetId)) + { + tileDataCount += tileCount; + } + + if (!string.IsNullOrWhiteSpace(region.VectorTilesetId)) + { + tileDataCount += tileCount; + } + + return tileDataCount; + } + catch (Exception e) + { + // ignored + return tileCount; + } + } + + public void Stop() + { + Runnable.Stop(_currentCoroutine); + } + + //PRIVATE + private void Request( + string uri + , CanonicalTileId tileId + , string tilesetId + , string offlineMapName + , Action callback + ) + { + if (string.IsNullOrEmpty(tilesetId)) + { + throw new Exception("Cannot cache without a tileset id"); + } + + var uriBuilder = new UriBuilder(uri); + if (!string.IsNullOrEmpty(_accessToken)) + { + string accessTokenQuery = "access_token=" + _accessToken; + string mapsSkuToken = "sku=" + _getMapsSkuToken(); + if (uriBuilder.Query.Length > 1) + { + uriBuilder.Query = uriBuilder.Query.Substring(1) + "&" + accessTokenQuery + "&" + mapsSkuToken; + } + else + { + uriBuilder.Query = accessTokenQuery + "&" + mapsSkuToken; + } + } + + string finalUrl = uriBuilder.ToString(); + + RequestTileAndCache(finalUrl, tilesetId, tileId, offlineMapName, callback); + } + + private void RequestTileAndCache(string url, string tilesetId, CanonicalTileId tileId, string offlineMapName, Action callback) + { + IAsyncRequestFactory.CreateRequest( + url, + (Response r) => + { + // if the request was successful add tile to all caches + if (!r.HasError && null != r.Data) + { + string eTag = string.Empty; + DateTime? lastModified = null; + + if (!r.Headers.ContainsKey("ETag")) + { + UnityEngine.Debug.LogWarningFormat("no 'ETag' header present in response for {0}", url); + } + else + { + eTag = r.Headers["ETag"]; + } + + // not all APIs populate 'Last-Modified' header + // don't log error if it's missing + if (r.Headers.ContainsKey("Last-Modified")) + { + lastModified = DateTime.ParseExact(r.Headers["Last-Modified"], "r", null); + } + + _offlineMapDownloadInfo.SuccesfulTileDownloads++; + + _offlineCache.AddOffline( + tilesetId + , offlineMapName + , tileId + , new CacheItem() + { + Data = r.Data, + ETag = eTag, + LastModified = lastModified + } + , true // force insert/update + ); + } + else + { + _offlineMapDownloadInfo.FailedTileDownloads++; + _offlineMapDownloadInfo.FailedDownloadLogs.Add(string.Format("Download Failed. TileId: {0}, Tileset:{1}, Error:{2}", + tileId, + tilesetId, + r.ExceptionsAsString)); + } + + if (null != callback) + { + r.IsUpdate = true; + callback(r); + } + }, 10); + } + + private string GetUri(OfflineTileType type, CanonicalTileId tileId, string tilesetId) + { + switch (type) + { + case OfflineTileType.Imagery when tilesetId.StartsWith("mapbox://", StringComparison.Ordinal): + return string.Format("{0}/{1}", MapUtils.NormalizeStaticStyleURL(tilesetId), tileId); + case OfflineTileType.Imagery: + return string.Format("{0}/{1}.png", MapUtils.TilesetIdToUrl(tilesetId), tileId); + case OfflineTileType.RetinaImagery when tilesetId.StartsWith("mapbox://", StringComparison.Ordinal): + return string.Format("{0}/{1}@2x", MapUtils.NormalizeStaticStyleURL(tilesetId), tileId); + case OfflineTileType.RetinaImagery: + return string.Format("{0}/{1}@2x.png", MapUtils.TilesetIdToUrl(tilesetId), tileId); + case OfflineTileType.Elevation: + return string.Format("{0}/{1}.pngraw", MapUtils.TilesetIdToUrl(tilesetId), tileId); + case OfflineTileType.Vector: + return string.Format("{0}/{1}.vector.pbf", MapUtils.TilesetIdToUrl(tilesetId), tileId); + default: + return ""; + } + } + + private IEnumerator DownloadCoroutine(string cacheName, List tiles) + { + _currentlyDownloadedFileCount = 0; + _currentlyRequestedFileCount = 0; + _totalTileCount = tiles.Count; + + _isDownloading = true; + NewLog(string.Format("Starting download of offline map '{0}' ({1} tiles)", cacheName, _totalTileCount)); + + var batchSize = 5; + var currentBatchSize = 0; + while (_currentlyRequestedFileCount < _totalTileCount) + { + foreach (var tile in tiles) + { + RequestTile(tile.Type, tile.CanonicalTileId, tile.TilesetId, cacheName, OfflineRequestCallback); + _currentlyRequestedFileCount++; + currentBatchSize++; + + if (currentBatchSize > batchSize) + { + currentBatchSize = 0; + yield return new WaitForSeconds(1f); + } + } + } + } + + private void OfflineRequestCallback(Response obj) + { + _currentlyDownloadedFileCount++; + Progress = (float) _currentlyDownloadedFileCount / _totalTileCount; + ProgressUpdated(Progress); + + if (_currentlyDownloadedFileCount >= _totalTileCount) + { + _isDownloading = false; + DownloadFinished(_offlineMapDownloadInfo); + } + } + + private IEnumerable GetWithWebMerc(Vector2d min, Vector2d max, int zoom) + { + var swWebMerc = new Vector2d(Math.Max(min.x, -Constants.WebMercMax), Math.Max(min.y, -Constants.WebMercMax)); + var neWebMerc = new Vector2d(Math.Min(max.x, Constants.WebMercMax), Math.Min(max.y, Constants.WebMercMax)); + + var swTile = Conversions.LatitudeLongitudeToTileId(swWebMerc.x, swWebMerc.y, zoom); + var neTile = Conversions.LatitudeLongitudeToTileId(neWebMerc.x, neWebMerc.y, zoom); + + for (int x = swTile.X; x <= neTile.X; x++) + { + for (int y = neTile.Y; y <= swTile.Y; y++) + { + yield return new UnwrappedTileId(zoom, x, y); + } + } + } +} + +public enum OfflineTileType +{ + Elevation, + Imagery, + RetinaImagery, + Vector +} + +public class OfflineMapResponse +{ + public bool HasErrors = false; + public string ErrorMessage; +} + +public class OfflineTileInfo +{ + public CanonicalTileId CanonicalTileId; + public OfflineTileType Type; + public string TilesetId; + + public OfflineTileInfo(UnwrappedTileId tileId, OfflineTileType type, string tilesetId) + { + CanonicalTileId = tileId.Canonical; + Type = type; + TilesetId = tilesetId; + } +} + +public class OfflineMapDownloadInfo +{ + public string MapName; + public int InitializedTileCount; + public int SuccesfulTileDownloads = 0; + public int FailedTileDownloads = 0; + public List FailedDownloadLogs; + + public OfflineMapDownloadInfo(string name, int tilesCount) + { + MapName = name; + InitializedTileCount = tilesCount; + FailedDownloadLogs = new List(); + } +} \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineMode.cs b/sdkproject/Assets/Offline/OfflineMode.cs new file mode 100644 index 000000000..5a1873d55 --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineMode.cs @@ -0,0 +1,299 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Mapbox.Map; +using Mapbox.Platform; +using Mapbox.Platform.Cache; +using Mapbox.Unity; +using Mapbox.Unity.Map; +using Mapbox.Unity.Utilities; +using Mapbox.Utils; +using NUnit; +using Sirenix.OdinInspector; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; +using Console = System.Console; +using Constants = Mapbox.Utils.Constants; + +public class OfflineModeWindow : EditorWindow +{ + [SerializeField] public OfflineRegion OfflineRegion; + + private static bool _waitingToLoad; + private Color _horizontalLineColor = new Color(.9f, .9f, .9f); + private List _estimatedTileList = new List(); + + private bool _downloadElevation; + + private bool _downloadImagery; + private ImagerySourceType _selectedImageEnum; + + private bool _downloadVector; + private VectorSourceType _selectedVectorEnum; + + private int _currentlyRequestedFileCount; + private int _currentlyDownloadedFileCount = 0; + private int _totalTileCount = 0; + private bool _isDownloading = false; + + private int _currentCoroutine = 0; + private string _logs; + private Vector2 _scroll; + private ListView listView; + private string _offlineCacheName; + private int _estimateTileCount; + + [MenuItem("Mapbox/Offline Maps")] + static void Init() + { + var window = (OfflineModeWindow) EditorWindow.GetWindow(typeof(OfflineModeWindow)); + window.Show(); + } + + void OnGUI() + { + AreaInfos(); + DrawUILine(_horizontalLineColor, 1, 10); + GUILayout.Space(10); + TilesetInfos(); + + if (GUI.changed) + { + _estimateTileCount = MapboxAccess.Instance.OfflineManager.EstimatedOfflineTileCount(OfflineRegion); + } + + EditorGUILayout.LabelField("Estimate: " + _estimateTileCount + " tiles"); + + DrawUILine(_horizontalLineColor, 1, 10); + _offlineCacheName = EditorGUILayout.TextField("Offline Map Name", _offlineCacheName); + + if (GUILayout.Button("Download") && !string.IsNullOrEmpty(_offlineCacheName)) + { + MapboxAccess.Instance.OfflineManager.CreateOfflineMap(_offlineCacheName, OfflineRegion); + } + + if (GUILayout.Button("Remove")) + { + MapboxAccess.Instance.OfflineManager.DeleteOfflineMap(_offlineCacheName); + } + + if (GUILayout.Button("Get Map List")) + { + var maps = MapboxAccess.Instance.OfflineManager.GetOfflineMapList(); + foreach (var map in maps) + { + NewLog(string.Format("Map named {0} has {1} tiles" + Environment.NewLine, map.Key, map.Value)); + } + } + + + _scroll = EditorGUILayout.BeginScrollView(_scroll); + _logs = EditorGUILayout.TextArea(_logs, GUILayout.Height(500)); + EditorGUILayout.EndScrollView(); + } + + public void Test() + { + + + var offlineRegion = new OfflineRegion() + { + MinLatLng = "37.7402769,-122.5984467", + MaxLatLng = "37.9327687,-122.2179695", + MinZoom = 6, + MaxZoom = 11, + ElevationTilesetId = "mapbox.terrain-rgb", + ImageTilesetId = "mapbox://styles/mapbox/streets-v10" + }; + MapboxAccess.Instance.OfflineManager.CreateOfflineMap("San Francisco", offlineRegion); + + + } + + private void UpdateProgressBar(float f) + { + EditorUtility.DisplayProgressBar("Downloading", "Downloading " + (f * 100).ToString("F1") + "%", f); + } + + private void DownloadFinished(OfflineMapDownloadInfo offlineMapDownloadInfo) + { + NewLog(string.Format(@"Finished download of offline map '{0}'. +Succesful tiles:{1} +Failed tiles: {2} +Logs: {3}", + offlineMapDownloadInfo.MapName, + offlineMapDownloadInfo.SuccesfulTileDownloads, + offlineMapDownloadInfo.FailedTileDownloads, + string.Join(Environment.NewLine, offlineMapDownloadInfo.FailedDownloadLogs))); + EditorUtility.ClearProgressBar(); + _isDownloading = false; + } + + private void AreaInfos() + { + GUILayout.Label("Area Settings", EditorStyles.boldLabel); + GUILayout.Space(10); + EditorGUILayout.LabelField("Minimum Longitude Latitude"); + OfflineRegion.MinLatLng = EditorGUILayout.TextField(OfflineRegion.MinLatLng); + EditorGUILayout.LabelField("Maximum Longitude Latitude"); + OfflineRegion.MaxLatLng = EditorGUILayout.TextField(OfflineRegion.MaxLatLng); + EditorGUILayout.LabelField("Minimum Zoom"); + OfflineRegion.MinZoom = EditorGUILayout.IntSlider(OfflineRegion.MinZoom, 0, 22); + EditorGUILayout.LabelField("Maximum Zoom"); + OfflineRegion.MaxZoom = EditorGUILayout.IntSlider(OfflineRegion.MaxZoom, 0, 22); + GUILayout.Space(10); + } + + private void TilesetInfos() + { + GUILayout.Label("Tileset Settings", EditorStyles.boldLabel); + GUILayout.Space(10); + //ELEVATION DATA + EditorGUILayout.BeginHorizontal(); + _downloadElevation = EditorGUILayout.Toggle(_downloadElevation, GUILayout.Width(16)); + OfflineRegion.ElevationTilesetId = _downloadElevation ? "mapbox.terrain-rgb" : ""; + EditorGUILayout.LabelField("Download Elevation Data"); + EditorGUILayout.EndHorizontal(); + + GUILayout.Space(4); + //IMAGE DATA + EditorGUILayout.BeginHorizontal(); + _downloadImagery = EditorGUILayout.Toggle(_downloadImagery, GUILayout.Width(16)); + EditorGUILayout.LabelField("Download Image Data"); + EditorGUILayout.EndHorizontal(); + if (_downloadImagery) + { + EditorGUILayout.LabelField("Data Source"); + _selectedImageEnum = (ImagerySourceType) EditorGUILayout.EnumPopup(_selectedImageEnum); + + switch (_selectedImageEnum) + { + case ImagerySourceType.MapboxStreets: + case ImagerySourceType.MapboxOutdoors: + case ImagerySourceType.MapboxDark: + case ImagerySourceType.MapboxLight: + case ImagerySourceType.MapboxSatellite: + case ImagerySourceType.MapboxSatelliteStreet: + var sourcePropertyValue = MapboxDefaultImagery.GetParameters(_selectedImageEnum); + OfflineRegion.ImageTilesetId = sourcePropertyValue.Id; + GUI.enabled = false; + EditorGUILayout.TextField(OfflineRegion.ImageTilesetId); + GUI.enabled = true; + break; + case ImagerySourceType.Custom: + EditorGUILayout.TextField(OfflineRegion.ImageTilesetId); + break; + case ImagerySourceType.None: + break; + default: + break; + } + + GUILayout.Space(10); + } + else + { + OfflineRegion.ImageTilesetId = ""; + } + + GUILayout.Space(4); + //VECTOR DATA + EditorGUILayout.BeginHorizontal(); + _downloadVector = EditorGUILayout.Toggle(_downloadVector, GUILayout.Width(16)); + EditorGUILayout.LabelField("Download Vector Data"); + EditorGUILayout.EndHorizontal(); + if (_downloadVector) + { + EditorGUILayout.LabelField("Data Source"); + _selectedVectorEnum = (VectorSourceType) EditorGUILayout.EnumPopup(_selectedVectorEnum); + + switch (_selectedVectorEnum) + { + case VectorSourceType.MapboxStreets: + case VectorSourceType.MapboxStreetsV8: + case VectorSourceType.MapboxStreetsWithBuildingIds: + case VectorSourceType.MapboxStreetsV8WithBuildingIds: + var sourcePropertyValue = MapboxDefaultVector.GetParameters(_selectedVectorEnum); + OfflineRegion.VectorTilesetId = sourcePropertyValue.Id; + GUI.enabled = false; + EditorGUILayout.TextField(OfflineRegion.VectorTilesetId); + GUI.enabled = true; + break; + case VectorSourceType.Custom: + EditorGUILayout.TextField(OfflineRegion.VectorTilesetId); + break; + case VectorSourceType.None: + break; + default: + break; + } + + GUILayout.Space(20); + } + else + { + OfflineRegion.VectorTilesetId = ""; + } + } + + public static void DrawUILine(Color color, int thickness = 1, int padding = 10) + { + Rect r = EditorGUILayout.GetControlRect(GUILayout.Height(padding + thickness)); + r.height = thickness; + r.y += padding / 2; + r.x -= 2; + r.width += 6; + EditorGUI.DrawRect(r, color); + } + + + protected void OnEnable() + { + var data = EditorPrefs.GetString("MapboxOfflineMaps", JsonUtility.ToJson(this, false)); + JsonUtility.FromJsonOverwrite(data, this); + _estimateTileCount = MapboxAccess.Instance.OfflineManager.EstimatedOfflineTileCount(OfflineRegion); + MapboxAccess.Instance.OfflineManager.ProgressUpdated += UpdateProgressBar; + MapboxAccess.Instance.OfflineManager.DownloadFinished += DownloadFinished; + MapboxAccess.Instance.OfflineManager.NewLog += NewLog; + } + + protected void OnDisable() + { + MapboxAccess.Instance.OfflineManager.ProgressUpdated -= UpdateProgressBar; + MapboxAccess.Instance.OfflineManager.DownloadFinished -= DownloadFinished; + MapboxAccess.Instance.OfflineManager.NewLog -= NewLog; + MapboxAccess.Instance.OfflineManager.Stop(); + var data = JsonUtility.ToJson(this, false); + EditorPrefs.SetString("MapboxOfflineMaps", data); + + _isDownloading = false; + EditorUtility.ClearProgressBar(); + + if (_currentCoroutine > 0) + { + Runnable.Stop(_currentCoroutine); + } + } + + private void NewLog(string log) + { + _logs += log + Environment.NewLine; + _logs += "-------------------------" + Environment.NewLine; + } + +} + +[Serializable] +public class OfflineRegion +{ + public string MinLatLng = ""; + public string MaxLatLng = ""; + + [Range(0, 16)] public int MinZoom; + [Range(0, 16)] public int MaxZoom; + + public string ElevationTilesetId; + public string ImageTilesetId; + public string VectorTilesetId; +} \ No newline at end of file From 97168263f351aaf6998a775539e7469971858e8c Mon Sep 17 00:00:00 2001 From: brnkhy Date: Sat, 8 Aug 2020 00:35:25 +0300 Subject: [PATCH 02/18] fix a bug where tile expiration date wasn't respected --- .../mapbox-sdk-cs/Platform/Cache/CacheItem.cs | 2 ++ .../Platform/Cache/CachingWebFileSource.cs | 28 ++++++++++++++++--- .../Platform/Cache/SQLiteCache/SQLiteCache.cs | 2 ++ .../Platform/Cache/SQLiteCache/Tiles.cs | 3 ++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CacheItem.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CacheItem.cs index b3be547f5..7d26d7dd9 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CacheItem.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CacheItem.cs @@ -15,5 +15,7 @@ public class CacheItem public string ETag; /// Can be 'null' as not all APIs populated this value. Last-Modified value of API response in GMT: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified public DateTime? LastModified; + + public DateTime ExpirationDate; } } diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs index b881516ff..39fafa3cc 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs @@ -1,4 +1,6 @@ -namespace Mapbox.Platform.Cache +using UnityEngine; + +namespace Mapbox.Platform.Cache { using System; using Mapbox.Platform; @@ -166,8 +168,13 @@ string uri callback(Response.FromCache(cachedItem.Data)); // check for updated tiles online if this is enabled in the settings - if (_autoRefreshCache) + if (cachedItem.LastModified > DateTime.Now) + { + Debug.Log("not refreshing"); + } + else { + Debug.Log("refreshing"); // check if tile on the web is newer than the one we already have locally IAsyncRequestFactory.CreateRequest( finalUrl, @@ -194,9 +201,13 @@ string uri // additional ETag empty check: for backwards compability with old caches if (!string.IsNullOrEmpty(cachedItem.ETag) && cachedItem.ETag.Equals(headerOnly.Headers["ETag"])) { + var cacheControlValue = int.Parse(headerOnly.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); + var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); + cachedItem.ExpirationDate = cacheToTime; + foreach (var cache in _caches) { - cache.Add(tilesetId, tileId, cachedItem, false); + cache.Add(tilesetId, tileId, cachedItem, true); } } else @@ -244,6 +255,7 @@ private IAsyncRequest requestTileAndCache(string url, string tilesetId, Canonica if (!r.HasError && null != r.Data) { string eTag = string.Empty; + DateTime expirationDate = DateTime.Now; DateTime? lastModified = null; if (!r.Headers.ContainsKey("ETag")) @@ -262,6 +274,13 @@ private IAsyncRequest requestTileAndCache(string url, string tilesetId, Canonica lastModified = DateTime.ParseExact(r.Headers["Last-Modified"], "r", null); } + if (r.Headers.ContainsKey("Cache-Control")) + { + var cacheControlValue = int.Parse(r.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); + var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); + expirationDate = cacheToTime; + } + // propagate to all caches forcing update foreach (var cache in _caches) { @@ -272,7 +291,8 @@ private IAsyncRequest requestTileAndCache(string url, string tilesetId, Canonica { Data = r.Data, ETag = eTag, - LastModified = lastModified + LastModified = lastModified, + ExpirationDate = expirationDate } , true // force insert/update ); diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs index a221ce117..6d1dccfcf 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/SQLiteCache.cs @@ -120,6 +120,7 @@ tile_set INTEGER REFERENCES tilesets (id) ON DELETE CASCADE ON UPDATE CASCAD tile_row BIGINT NOT NULL, tile_data BLOB NOT NULL, timestamp INTEGER NOT NULL, +expirationdate INTEGER NOT NULL, etag TEXT, lastmodified INTEGER, PRIMARY KEY( @@ -248,6 +249,7 @@ public void Add(string tilesetName, CanonicalTileId tileId, CacheItem item, bool tile_row = tileId.Y, tile_data = item.Data, timestamp = (int)UnixTimestampUtils.To(DateTime.Now), + expirationdate = (int)UnixTimestampUtils.To(item.ExpirationDate), etag = item.ETag }); if (1 != rowsAffected) diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs index 18629526b..411e35fe6 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/SQLiteCache/Tiles.cs @@ -36,5 +36,8 @@ public class tiles /// Last-Modified header value of API response. Not all APIs populate it, will be -1 in that case. public int? lastmodified { get; set; } + + /// Last-Modified header value of API response. Not all APIs populate it, will be -1 in that case. + public int expirationdate { get; set; } } } From 1c602caeeec889882fdee8156eb2f2b0aeeb97e8 Mon Sep 17 00:00:00 2001 From: brnkhy Date: Tue, 11 Aug 2020 20:12:48 +0300 Subject: [PATCH 03/18] change update calls to use "If-None-Match" header, reducing call count 50% compared to header-only method used before add custom header parameter to a request methods override --- .../Platform/Cache/CachingWebFileSource.cs | 79 +++++++++++-------- .../Core/mapbox-sdk-cs/Platform/FileSource.cs | 40 ++++++---- .../Platform/IAsyncRequestFactory.cs | 18 ++++- .../Core/mapbox-sdk-cs/Platform/Response.cs | 2 +- 4 files changed, 87 insertions(+), 52 deletions(-) diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs index 39fafa3cc..d654f0ae3 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using Unity.UNetWeaver; +using UnityEngine; namespace Mapbox.Platform.Cache { @@ -24,7 +25,6 @@ public class CachingWebFileSource : IFileSource, IDisposable private Func _getMapsSkuToken; private bool _autoRefreshCache; - public CachingWebFileSource(string accessToken, Func getMapsSkuToken, bool autoRefreshCache) { #if MAPBOX_DEBUG_CACHE @@ -168,7 +168,7 @@ string uri callback(Response.FromCache(cachedItem.Data)); // check for updated tiles online if this is enabled in the settings - if (cachedItem.LastModified > DateTime.Now) + if (cachedItem.ExpirationDate > DateTime.Now) { Debug.Log("not refreshing"); } @@ -178,57 +178,68 @@ string uri // check if tile on the web is newer than the one we already have locally IAsyncRequestFactory.CreateRequest( finalUrl, - (Response headerOnly) => + timeout, + "If-None-Match", cachedItem.ETag, + (Response response) => { // on error getting information from API just return. tile we have locally has already been returned above - if (headerOnly.HasError) + if (response.HasError || response.StatusCode == null) { return; } - // TODO: remove Debug.Log before PR - //UnityEngine.Debug.LogFormat( - // "{1}{0}cached:{2}{0}header:{3}" - // , Environment.NewLine - // , finalUrl - // , cachedItem.ETag - // , headerOnly.Headers["ETag"] - //); - // data from cache is the same as on the web: // * tile has already been returned above // * make sure all all other caches have it too, but don't force insert via cache.add(false) // additional ETag empty check: for backwards compability with old caches - if (!string.IsNullOrEmpty(cachedItem.ETag) && cachedItem.ETag.Equals(headerOnly.Headers["ETag"])) + if (response.StatusCode == 304) // 304 NOT MODIFIED { - var cacheControlValue = int.Parse(headerOnly.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); + Debug.Log("304"); + var cacheControlValue = int.Parse(response.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); cachedItem.ExpirationDate = cacheToTime; + } + else if(response.StatusCode == 200) // 200 OK, it means etag&data has changed so need to update cache + { + Debug.Log("200"); + string eTag = string.Empty; + DateTime expirationDate = DateTime.Now; + DateTime? lastModified = null; + + if (response.Headers.ContainsKey("ETag")) + { + eTag = response.Headers["ETag"]; + } - foreach (var cache in _caches) + // not all APIs populate 'Last-Modified' header + // don't log error if it's missing + if (response.Headers.ContainsKey("Last-Modified")) { - cache.Add(tilesetId, tileId, cachedItem, true); + lastModified = DateTime.ParseExact(response.Headers["Last-Modified"], "r", null); } + + if (response.Headers.ContainsKey("Cache-Control")) + { + var cacheControlValue = int.Parse(response.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); + var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); + expirationDate = cacheToTime; + } + + cachedItem.Data = response.Data; + cachedItem.ETag = eTag; + cachedItem.LastModified = lastModified; + cachedItem.ExpirationDate = expirationDate; } else { - // TODO: remove Debug.Log before PR - UnityEngine.Debug.LogWarningFormat( - "updating cached tile {1} tilesetId:{2}{0}cached etag:{3}{0}remote etag:{4}{0}{5}" - , Environment.NewLine - , tileId - , tilesetId - , cachedItem.ETag - , headerOnly.Headers["ETag"] - , finalUrl - ); - - // request updated tile and pass callback to return new data to subscribers - requestTileAndCache(finalUrl, tilesetId, tileId, timeout, callback); + Debug.Log(response.StatusCode); + } + + foreach (var cache in _caches) + { + cache.Add(tilesetId, tileId, cachedItem, true); } } - , timeout - , HttpRequestType.Head ); } @@ -277,7 +288,7 @@ private IAsyncRequest requestTileAndCache(string url, string tilesetId, Canonica if (r.Headers.ContainsKey("Cache-Control")) { var cacheControlValue = int.Parse(r.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); - var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); + var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(60); expirationDate = cacheToTime; } diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/FileSource.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/FileSource.cs index 3225832c1..5070aac02 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/FileSource.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/FileSource.cs @@ -27,6 +27,7 @@ namespace Mapbox.Platform #endif #if UNITY_5_3_OR_NEWER using UnityEngine; + #endif /// @@ -40,7 +41,6 @@ namespace Mapbox.Platform /// public sealed class FileSource : IFileSource { - private Func _getMapsSkuToken; private readonly Dictionary _requests = new Dictionary(); private readonly string _accessToken; @@ -49,8 +49,10 @@ public sealed class FileSource : IFileSource /// Length of rate-limiting interval in seconds. https://www.mapbox.com/api-documentation/#rate-limit-headers #pragma warning disable 0414 private int? XRateLimitInterval; + /// Maximum number of requests you may make in the current interval before reaching the limit. https://www.mapbox.com/api-documentation/#rate-limit-headers private long? XRateLimitLimit; + /// Timestamp of when the current interval will end and the ratelimit counter is reset. https://www.mapbox.com/api-documentation/#rate-limit-headers private DateTime? XRateLimitReset; #pragma warning restore 0414 @@ -59,14 +61,7 @@ public sealed class FileSource : IFileSource public FileSource(Func getMapsSkuToken, string acessToken = null) { _getMapsSkuToken = getMapsSkuToken; - if (string.IsNullOrEmpty(acessToken)) - { - _accessToken = Environment.GetEnvironmentVariable("MAPBOX_ACCESS_TOKEN"); - } - else - { - _accessToken = acessToken; - } + _accessToken = acessToken; } /// Performs a request asynchronously. @@ -92,7 +87,8 @@ string url string skuToken = "sku=" + _getMapsSkuToken(); if (uriBuilder.Query != null && uriBuilder.Query.Length > 1) { - uriBuilder.Query = uriBuilder.Query.Substring(1) + "&" + accessTokenQuery + "&" + skuToken;; + uriBuilder.Query = uriBuilder.Query.Substring(1) + "&" + accessTokenQuery + "&" + skuToken; + ; } else { @@ -127,16 +123,27 @@ string url , string tilesetId ) { - // TODO: plugin caching somewhere around here var request = IAsyncRequestFactory.CreateRequest( url , (Response response) => { - if (response.XRateLimitInterval.HasValue) { XRateLimitInterval = response.XRateLimitInterval; } - if (response.XRateLimitLimit.HasValue) { XRateLimitLimit = response.XRateLimitLimit; } - if (response.XRateLimitReset.HasValue) { XRateLimitReset = response.XRateLimitReset; } + if (response.XRateLimitInterval.HasValue) + { + XRateLimitInterval = response.XRateLimitInterval; + } + + if (response.XRateLimitLimit.HasValue) + { + XRateLimitLimit = response.XRateLimitLimit; + } + + if (response.XRateLimitReset.HasValue) + { + XRateLimitReset = response.XRateLimitReset; + } + callback(response); lock (_lock) { @@ -161,6 +168,7 @@ string url _requests.Add(request, 0); } } + //yield return request; return request; } @@ -193,13 +201,13 @@ public IEnumerator WaitForAllRequests() } } } + yield return new WaitForSeconds(0.2f); } } #endif - #if !UNITY_5_3_OR_NEWER /// /// Block until all the requests are processed. @@ -252,4 +260,4 @@ public void WaitForAllRequests() } #endif } -} +} \ No newline at end of file diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/IAsyncRequestFactory.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/IAsyncRequestFactory.cs index 195d1e428..01e6e72e2 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/IAsyncRequestFactory.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/IAsyncRequestFactory.cs @@ -34,6 +34,22 @@ string url #endif } - + public static IAsyncRequest CreateRequest( + string url + , int timeout + , string headerName + , string headerValue + , Action callback + ) { +#if !UNITY + if (Environment.ProcessorCount > 2) { + return new HTTPRequestThreaded(url, callback, timeout); + } else { + return new HTTPRequestNonThreaded(url, callback, timeout); + } +#else + return new Mapbox.Unity.Utilities.HTTPRequest(url, callback, timeout, headerName, headerValue); +#endif + } } } \ No newline at end of file diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Response.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Response.cs index 5735aa7ca..2c5ded836 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Response.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Response.cs @@ -315,7 +315,7 @@ public static Response FromWebResponse(IAsyncRequest request, UnityWebRequest ap int statusCode = (int)apiResponse.responseCode; response.StatusCode = statusCode; - if (statusCode != 200) + if (statusCode != 200 && statusCode != 304) { response.AddException(new Exception(string.Format("Status Code {0}", apiResponse.responseCode))); } From 51b91bae04c114eca462abbf930846c16e04959d Mon Sep 17 00:00:00 2001 From: brnkhy Date: Tue, 11 Aug 2020 21:42:26 +0300 Subject: [PATCH 04/18] remove debug logs, all except 200-updating cache one for further testing --- .../Platform/Cache/CachingWebFileSource.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs index d654f0ae3..fd5fddea1 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs @@ -168,13 +168,8 @@ string uri callback(Response.FromCache(cachedItem.Data)); // check for updated tiles online if this is enabled in the settings - if (cachedItem.ExpirationDate > DateTime.Now) + if (cachedItem.ExpirationDate < DateTime.Now) { - Debug.Log("not refreshing"); - } - else - { - Debug.Log("refreshing"); // check if tile on the web is newer than the one we already have locally IAsyncRequestFactory.CreateRequest( finalUrl, @@ -194,14 +189,13 @@ string uri // additional ETag empty check: for backwards compability with old caches if (response.StatusCode == 304) // 304 NOT MODIFIED { - Debug.Log("304"); var cacheControlValue = int.Parse(response.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); cachedItem.ExpirationDate = cacheToTime; } else if(response.StatusCode == 200) // 200 OK, it means etag&data has changed so need to update cache { - Debug.Log("200"); + Debug.Log("200 - Updating cache"); string eTag = string.Empty; DateTime expirationDate = DateTime.Now; DateTime? lastModified = null; From 9d57d825cbd4c6b96e0dfbc265233c77f164cdcf Mon Sep 17 00:00:00 2001 From: brnkhy Date: Thu, 13 Aug 2020 20:40:17 +0300 Subject: [PATCH 05/18] tidy up Cache/CachingWebFileSource.cs variables rewrite cache-control parsing remove debug lines --- .../Platform/Cache/CachingWebFileSource.cs | 150 ++++++++++-------- 1 file changed, 80 insertions(+), 70 deletions(-) diff --git a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs index fd5fddea1..688b63802 100644 --- a/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs +++ b/sdkproject/Assets/Mapbox/Core/mapbox-sdk-cs/Platform/Cache/CachingWebFileSource.cs @@ -14,8 +14,6 @@ namespace Mapbox.Platform.Cache public class CachingWebFileSource : IFileSource, IDisposable { - - #if MAPBOX_DEBUG_CACHE private string _className; #endif @@ -25,6 +23,10 @@ public class CachingWebFileSource : IFileSource, IDisposable private Func _getMapsSkuToken; private bool _autoRefreshCache; + private const string EtagHeaderName = "ETag"; + private const string LastModifiedHeaderName = "Last-Modified"; + private const string CacheControlHeaderName = "Cache-Control"; + public CachingWebFileSource(string accessToken, Func getMapsSkuToken, bool autoRefreshCache) { #if MAPBOX_DEBUG_CACHE @@ -36,8 +38,7 @@ public CachingWebFileSource(string accessToken, Func getMapsSkuToken, bo } -#region idisposable - + #region idisposable ~CachingWebFileSource() { @@ -66,12 +67,12 @@ protected virtual void Dispose(bool disposeManagedResources) } } } + _disposed = true; } } - -#endregion + #endregion /// @@ -104,7 +105,8 @@ public void Clear() } - public void ReInit() { + public void ReInit() + { foreach (var cache in _caches) { cache.ReInit(); @@ -120,7 +122,6 @@ string uri , string tilesetId = null ) { - if (string.IsNullOrEmpty(tilesetId)) { throw new Exception("Cannot cache without a tileset id"); @@ -152,6 +153,7 @@ string uri uriBuilder.Query = accessTokenQuery + "&" + mapsSkuToken; } } + string finalUrl = uriBuilder.ToString(); #if MAPBOX_DEBUG_CACHE @@ -189,50 +191,30 @@ string uri // additional ETag empty check: for backwards compability with old caches if (response.StatusCode == 304) // 304 NOT MODIFIED { - var cacheControlValue = int.Parse(response.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); - var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); - cachedItem.ExpirationDate = cacheToTime; + cachedItem.ExpirationDate = GetExpirationDate(response); } - else if(response.StatusCode == 200) // 200 OK, it means etag&data has changed so need to update cache + else if (response.StatusCode == 200) // 200 OK, it means etag&data has changed so need to update cache { - Debug.Log("200 - Updating cache"); - string eTag = string.Empty; - DateTime expirationDate = DateTime.Now; - DateTime? lastModified = null; - - if (response.Headers.ContainsKey("ETag")) - { - eTag = response.Headers["ETag"]; - } + string eTag = ETag(response); // not all APIs populate 'Last-Modified' header // don't log error if it's missing - if (response.Headers.ContainsKey("Last-Modified")) - { - lastModified = DateTime.ParseExact(response.Headers["Last-Modified"], "r", null); - } + DateTime? lastModified = GetLastModified(response); - if (response.Headers.ContainsKey("Cache-Control")) - { - var cacheControlValue = int.Parse(response.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); - var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(cacheControlValue); - expirationDate = cacheToTime; - } + DateTime expirationDate = GetExpirationDate(response); cachedItem.Data = response.Data; cachedItem.ETag = eTag; cachedItem.LastModified = lastModified; cachedItem.ExpirationDate = expirationDate; } - else - { - Debug.Log(response.StatusCode); - } foreach (var cache in _caches) { cache.Add(tilesetId, tileId, cachedItem, true); } + + callback(Response.FromCache(cachedItem.Data)); } ); } @@ -249,42 +231,22 @@ string uri } } - private IAsyncRequest requestTileAndCache(string url, string tilesetId, CanonicalTileId tileId, int timeout, Action callback) { return IAsyncRequestFactory.CreateRequest( url, - (Response r) => + (Response response) => { // if the request was successful add tile to all caches - if (!r.HasError && null != r.Data) + if (!response.HasError && null != response.Data) { - string eTag = string.Empty; - DateTime expirationDate = DateTime.Now; - DateTime? lastModified = null; - - if (!r.Headers.ContainsKey("ETag")) - { - UnityEngine.Debug.LogWarningFormat("no 'ETag' header present in response for {0}", url); - } - else - { - eTag = r.Headers["ETag"]; - } + string eTag = ETag(response); // not all APIs populate 'Last-Modified' header // don't log error if it's missing - if (r.Headers.ContainsKey("Last-Modified")) - { - lastModified = DateTime.ParseExact(r.Headers["Last-Modified"], "r", null); - } + DateTime? lastModified = GetLastModified(response); - if (r.Headers.ContainsKey("Cache-Control")) - { - var cacheControlValue = int.Parse(r.Headers["Cache-Control"].Split(',')[0].Split('=')[1]); - var cacheToTime = DateTime.Now + TimeSpan.FromSeconds(60); - expirationDate = cacheToTime; - } + DateTime expirationDate = GetExpirationDate(response); // propagate to all caches forcing update foreach (var cache in _caches) @@ -294,7 +256,7 @@ private IAsyncRequest requestTileAndCache(string url, string tilesetId, Canonica , tileId , new CacheItem() { - Data = r.Data, + Data = response.Data, ETag = eTag, LastModified = lastModified, ExpirationDate = expirationDate @@ -303,19 +265,67 @@ private IAsyncRequest requestTileAndCache(string url, string tilesetId, Canonica ); } } + if (null != callback) { - r.IsUpdate = true; - callback(r); + response.IsUpdate = true; + callback(response); } }, timeout); } + private string ETag(Response response) + { + string eTag = String.Empty; + if (!response.Headers.ContainsKey(EtagHeaderName)) + { + Debug.LogWarning("no 'ETag' header present in response"); + } + else + { + eTag = response.Headers[EtagHeaderName]; + } - class MemoryCacheAsyncRequest : IAsyncRequest + return eTag; + } + + private DateTime? GetLastModified(Response response) { + DateTime? lastModified = null; + if (response.Headers.ContainsKey(LastModifiedHeaderName)) + { + lastModified = DateTime.ParseExact(response.Headers[LastModifiedHeaderName], "r", null); + } + + return lastModified; + } + + private DateTime GetExpirationDate(Response response) + { + DateTime expirationDate = DateTime.Now; + if (response.Headers.ContainsKey(CacheControlHeaderName)) + { + var cacheEntries = response.Headers[CacheControlHeaderName].Split(','); + if (cacheEntries.Length > 0) + { + foreach (var entry in cacheEntries) + { + var value = entry.Split('='); + if (value[0] == "max-age") + { + expirationDate = expirationDate + TimeSpan.FromSeconds(int.Parse(value[1])); + return expirationDate; + } + } + } + } + return expirationDate; + } + + class MemoryCacheAsyncRequest : IAsyncRequest + { public string RequestUrl { get; private set; } @@ -327,14 +337,14 @@ public MemoryCacheAsyncRequest(string requestUrl) public bool IsCompleted { - get - { - return true; - } + get { return true; } } - public HttpRequestType RequestType { get { return HttpRequestType.Get; } } + public HttpRequestType RequestType + { + get { return HttpRequestType.Get; } + } public void Cancel() @@ -343,4 +353,4 @@ public void Cancel() } } } -} +} \ No newline at end of file From f8e90e5a991da47a905a5b6220405586d6019c8d Mon Sep 17 00:00:00 2001 From: brnkhy Date: Fri, 14 Aug 2020 01:48:02 +0300 Subject: [PATCH 06/18] add HTTPRequest file/change missing from previous commits (adds an request overload for custom parameter) --- .../Mapbox/Unity/Utilities/HTTPRequest.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/sdkproject/Assets/Mapbox/Unity/Utilities/HTTPRequest.cs b/sdkproject/Assets/Mapbox/Unity/Utilities/HTTPRequest.cs index 12ad5936c..26282fd82 100644 --- a/sdkproject/Assets/Mapbox/Unity/Utilities/HTTPRequest.cs +++ b/sdkproject/Assets/Mapbox/Unity/Utilities/HTTPRequest.cs @@ -59,6 +59,25 @@ public HTTPRequest(string url, Action callback, int timeout, HttpReque _request.timeout = timeout; _callback = callback; +#if UNITY_EDITOR + if (!EditorApplication.isPlaying) + { + Runnable.EnableRunnableInEditor(); + } +#endif + Runnable.Run(DoRequest()); + } + + public HTTPRequest(string url, Action callback, int timeout, string headerName, string headerValue) + { + IsCompleted = false; + _requestType = HttpRequestType.Get; + _request = UnityWebRequest.Get(url); + _request.SetRequestHeader(headerName, headerValue); + + _request.timeout = timeout; + _callback = callback; + #if UNITY_EDITOR if (!EditorApplication.isPlaying) { From 0a3afcabb3539dce9d910e8fdc7b20c1c1621628 Mon Sep 17 00:00:00 2001 From: brnkhy Date: Tue, 1 Sep 2020 00:44:50 +0300 Subject: [PATCH 07/18] move offline map support classes to their own files add keyboard enable/disable checkbox to QuadTreeCameraMovement change OfflineRegion to store Vector2d for points instead of string add offline map demo scene --- .../Assets/Mapbox/Examples/9_OfflineMap.meta | 10 + .../Examples/9_OfflineMap/OfflineMap.unity | 5070 +++++++++++++++++ .../9_OfflineMap/OfflineMap.unity.meta | 9 + .../Examples/9_OfflineMap/Screenshots.meta | 9 + .../9_OfflineMap/Screenshots/OfflineMap.png | Bin 0 -> 115457 bytes .../Screenshots/OfflineMap.png.meta | 139 + .../Mapbox/Examples/9_OfflineMap/Scripts.meta | 9 + .../Scripts/OfflineMapDemoController.cs | 159 + .../Scripts/OfflineMapDemoController.cs.meta | 11 + .../Scripts/DirectionsFactoryDropbox.cs.meta | 11 + .../Scripts/QuadTreeCameraMovement.cs | 7 +- .../Assets/Offline/OfflineMapDownloadInfo.cs | 17 + .../Offline/OfflineMapDownloadInfo.cs.meta | 3 + .../Assets/Offline/OfflineMapResponse.cs | 5 + .../Assets/Offline/OfflineMapResponse.cs.meta | 3 + sdkproject/Assets/Offline/OfflineMode.cs | 32 +- sdkproject/Assets/Offline/OfflineRegion.cs | 37 + .../Assets/Offline/OfflineRegion.cs.meta | 3 + sdkproject/Assets/Offline/OfflineTileInfo.cs | 15 + .../Assets/Offline/OfflineTileInfo.cs.meta | 3 + sdkproject/Assets/Offline/OfflineTileType.cs | 7 + .../Assets/Offline/OfflineTileType.cs.meta | 3 + 22 files changed, 5538 insertions(+), 24 deletions(-) create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap.meta create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity.meta create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots.meta create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png.meta create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts.meta create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs create mode 100644 sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs.meta create mode 100644 sdkproject/Assets/Mapbox/Examples/Scripts/DirectionsFactoryDropbox.cs.meta create mode 100644 sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs create mode 100644 sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs.meta create mode 100644 sdkproject/Assets/Offline/OfflineMapResponse.cs create mode 100644 sdkproject/Assets/Offline/OfflineMapResponse.cs.meta create mode 100644 sdkproject/Assets/Offline/OfflineRegion.cs create mode 100644 sdkproject/Assets/Offline/OfflineRegion.cs.meta create mode 100644 sdkproject/Assets/Offline/OfflineTileInfo.cs create mode 100644 sdkproject/Assets/Offline/OfflineTileInfo.cs.meta create mode 100644 sdkproject/Assets/Offline/OfflineTileType.cs create mode 100644 sdkproject/Assets/Offline/OfflineTileType.cs.meta diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap.meta b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap.meta new file mode 100644 index 000000000..f7d4744bf --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9da3f19136649ba4cad0c98d95fdf5a5 +folderAsset: yes +timeCreated: 1510347191 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity new file mode 100644 index 000000000..12b663b06 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity @@ -0,0 +1,5070 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &71039465 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 71039466} + - component: {fileID: 71039468} + - component: {fileID: 71039467} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &71039466 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71039465} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2145212998} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &71039467 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71039465} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &71039468 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71039465} + m_CullTransparentMesh: 0 +--- !u!1 &75020822 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 75020823} + - component: {fileID: 75020825} + - component: {fileID: 75020824} + m_Layer: 5 + m_Name: MapRect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &75020823 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75020822} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1864103089} + - {fileID: 1480791278} + m_Father: {fileID: 1343370028} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -206.45, y: 21.929993} + m_SizeDelta: {x: -636.7, y: -192.94006} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &75020824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75020822} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 184ca10c8fb4d4c4b988276fd798c9dc, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &75020825 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75020822} + m_CullTransparentMesh: 0 +--- !u!1 &111371665 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 111371666} + - component: {fileID: 111371668} + - component: {fileID: 111371667} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &111371666 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111371665} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 470630863} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 38.7, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &111371667 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111371665} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &111371668 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111371665} + m_CullTransparentMesh: 0 +--- !u!1 &141452305 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 141452306} + - component: {fileID: 141452308} + - component: {fileID: 141452307} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &141452306 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 141452305} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 671458729} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &141452307 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 141452305} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Download +--- !u!222 &141452308 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 141452305} + m_CullTransparentMesh: 0 +--- !u!1 &190760379 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 190760380} + - component: {fileID: 190760382} + - component: {fileID: 190760381} + m_Layer: 5 + m_Name: TileCountText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &190760380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 190760379} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1227154253} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 196.28, y: -267.7} + m_SizeDelta: {x: 358.76, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &190760381 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 190760379} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Total Tile Count is 32 +--- !u!222 &190760382 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 190760379} + m_CullTransparentMesh: 0 +--- !u!1001 &197266180 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1611603657303738, guid: 98be219873e6d4dffb5949746f515a33, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114603753021256032, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_Text + value: "Worldwide Dynamic Zoom & Panning Support\n\nThis example is + a starting point for creating a traditional web-based zoomable map. Go anywhere + in the world and check out Mapbox\u2019s high-quality satellite imagery. + It also uses the SpawnOnMap script to instantiate custom markers on the map + at specified locations." + objectReference: {fileID: 0} + - target: {fileID: 114699889412236512, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_BlockingMask.m_Bits + value: 261943 + objectReference: {fileID: 0} + - target: {fileID: 114731470950229392, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_Size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224315790701160254, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224835413515161394, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224835413515161394, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224835413515161394, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 116.5 + objectReference: {fileID: 0} + - target: {fileID: 224835413515161394, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -77.303246 + objectReference: {fileID: 0} + - target: {fileID: 224835413515161394, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_SizeDelta.x + value: 213 + objectReference: {fileID: 0} + - target: {fileID: 224835413515161394, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_SizeDelta.y + value: 134.60649 + objectReference: {fileID: 0} + - target: {fileID: 224857786874416376, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_SizeDelta.y + value: 154.60649 + objectReference: {fileID: 0} + - target: {fileID: 224857786874416376, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0.000015258789 + objectReference: {fileID: 0} + - target: {fileID: 224907856650798614, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224907856650798614, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224907856650798614, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_SizeDelta.x + value: -17 + objectReference: {fileID: 0} + - target: {fileID: 224907993215804030, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224907993215804030, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224907993215804030, guid: 98be219873e6d4dffb5949746f515a33, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 98be219873e6d4dffb5949746f515a33, type: 3} +--- !u!1 &255389120 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 255389121} + - component: {fileID: 255389124} + - component: {fileID: 255389123} + - component: {fileID: 255389122} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &255389121 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255389120} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 730776033} + m_Father: {fileID: 471752046} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -35.350006} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &255389122 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255389120} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 255389123} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &255389123 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255389120} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &255389124 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255389120} + m_CullTransparentMesh: 0 +--- !u!1 &327926548 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 327926549} + - component: {fileID: 327926552} + - component: {fileID: 327926551} + - component: {fileID: 327926550} + m_Layer: 5 + m_Name: InputField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &327926549 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 327926548} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1543928815} + - {fileID: 1551586478} + m_Father: {fileID: 1227154253} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 196.28, y: -408.5} + m_SizeDelta: {x: 358.76, y: 147.70001} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &327926550 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 327926548} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 327926551} + m_TextComponent: {fileID: 1551586479} + m_Placeholder: {fileID: 1543928816} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 2 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 1 +--- !u!114 &327926551 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 327926548} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &327926552 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 327926548} + m_CullTransparentMesh: 0 +--- !u!1 &336238748 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 336238749} + - component: {fileID: 336238751} + - component: {fileID: 336238750} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &336238749 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 336238748} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1855580291} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &336238750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 336238748} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &336238751 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 336238748} + m_CullTransparentMesh: 0 +--- !u!1 &344419399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 344419400} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &344419400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 344419399} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 437905374} + m_Father: {fileID: 1355918473} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1001 &390836297 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224000013044306136, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, + type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 3adcee2515f8c49f4a7afb3bacf2c56e, type: 3} +--- !u!1 &398418928 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 398418929} + - component: {fileID: 398418931} + - component: {fileID: 398418930} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &398418929 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398418928} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 616540061} + m_Father: {fileID: 1229435886} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: -1.1000061} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &398418930 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398418928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &398418931 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398418928} + m_CullTransparentMesh: 0 +--- !u!1 &432292906 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 432292907} + - component: {fileID: 432292909} + - component: {fileID: 432292908} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &432292907 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432292906} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1341460001} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &432292908 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432292906} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Map Name +--- !u!222 &432292909 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432292906} + m_CullTransparentMesh: 0 +--- !u!1 &437905373 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 437905374} + - component: {fileID: 437905376} + - component: {fileID: 437905375} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &437905374 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 437905373} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 344419400} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &437905375 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 437905373} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &437905376 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 437905373} + m_CullTransparentMesh: 0 +--- !u!1 &470630862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 470630863} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &470630863 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 470630862} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 111371666} + m_Father: {fileID: 1785722563} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &471752045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471752046} + - component: {fileID: 471752048} + - component: {fileID: 471752047} + m_Layer: 5 + m_Name: ProgressPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &471752046 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 471752045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1785722563} + - {fileID: 255389121} + m_Father: {fileID: 1343370028} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -200, y: 0} + m_SizeDelta: {x: -400, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &471752047 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 471752045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.7372549} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &471752048 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 471752045} + m_CullTransparentMesh: 0 +--- !u!1 &555018382 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 555018384} + - component: {fileID: 555018383} + - component: {fileID: 555018386} + m_Layer: 0 + m_Name: Map + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &555018383 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555018382} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cd961b1c9541a4cee99686069ecce852, type: 3} + m_Name: + m_EditorClassIdentifier: + _options: + locationOptions: + latitudeLongitude: 37.7648, -122.463 + zoom: 10 + extentOptions: + extentType: 0 + defaultExtents: + cameraBoundsOptions: + camera: {fileID: 0} + visibleBuffer: 0 + disposeBuffer: 0 + rangeAroundCenterOptions: + west: 1 + north: 1 + east: 1 + south: 1 + rangeAroundTransformOptions: + targetTransform: {fileID: 0} + visibleBuffer: 0 + disposeBuffer: 0 + placementOptions: + placementType: 1 + snapMapToZero: 0 + scalingOptions: + scalingType: 1 + unityTileSize: 100 + loadingTexture: {fileID: 2800000, guid: e2896a92727704803a9c422b043eae89, type: 3} + tileMaterial: {fileID: 2100000, guid: b9f23e9bce724fa4daac57ecded470b8, type: 2} + _initializeOnStart: 1 + _imagery: + _layerProperty: + sourceType: 4 + sourceOptions: + isActive: 1 + layerSource: + Name: Streets + Id: mapbox.satellite + Modified: + UserName: + rasterOptions: + useRetina: 1 + useCompression: 0 + useMipMap: 1 + _terrain: + _layerProperty: + sourceType: 0 + sourceOptions: + isActive: 1 + layerSource: + Name: + Id: mapbox.terrain-rgb + Modified: + UserName: + elevationLayerType: 1 + requiredOptions: + exaggerationFactor: 1 + colliderOptions: + addCollider: 0 + modificationOptions: + sampleCount: 10 + useRelativeHeight: 0 + earthRadius: 1000 + unityLayerOptions: + addToLayer: 0 + layerId: 0 + sideWallOptions: + isActive: 0 + wallHeight: 10 + wallMaterial: {fileID: 0} + _vectorData: + _layerProperty: + tileJsonData: + tileJSONLoaded: 0 + LayerDisplayNames: + - admin + - aeroway + - airport_label + - barrier_line + - building + - country_label + - housenum_label + - landuse + - landuse_overlay + - marine_label + - motorway_junction + - mountain_peak_label + - place_label + - poi_label + - rail_station_label + - road + - road_label + - state_label + - water + - water_label + - waterway + - waterway_label + _sourceType: 1 + sourceOptions: + isActive: 1 + layerSource: + Name: Mapbox Streets + Id: mapbox.mapbox-streets-v7 + Modified: + UserName: + useOptimizedStyle: 0 + optimizedStyle: + Name: + Id: + Modified: + UserName: + performanceOptions: + isEnabled: 1 + entityPerCoroutine: 20 + vectorSubLayers: [] + locationPrefabList: [] + _tileProvider: {fileID: 0} + _previewOptions: + isPreviewEnabled: 0 +--- !u!4 &555018384 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555018382} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &555018386 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555018382} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2c699b8e1864b4b248acb7a04ede9480, type: 3} + m_Name: + m_EditorClassIdentifier: + _panSpeed: 1 + _zoomSpeed: 0.25 + _referenceCamera: {fileID: 1787361574} + _mapManager: {fileID: 555018383} + _useDegreeMethod: 0 + _keyboardPanEnabled: 0 +--- !u!1 &588534990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 588534991} + - component: {fileID: 588534993} + - component: {fileID: 588534992} + m_Layer: 5 + m_Name: MaxLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &588534991 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588534990} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 634468624} + m_Father: {fileID: 1227154253} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 86.92, y: -56.89} + m_SizeDelta: {x: 140.04, y: 19.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &588534992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588534990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Maximum LatLng +--- !u!222 &588534993 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588534990} + m_CullTransparentMesh: 0 +--- !u!1 &608539059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 608539060} + - component: {fileID: 608539062} + - component: {fileID: 608539061} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &608539060 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 608539059} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1212134311} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &608539061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 608539059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &608539062 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 608539059} + m_CullTransparentMesh: 0 +--- !u!1 &616540060 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 616540061} + - component: {fileID: 616540063} + - component: {fileID: 616540062} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &616540061 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 616540060} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 398418929} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &616540062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 616540060} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &616540063 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 616540060} + m_CullTransparentMesh: 0 +--- !u!1 &634468623 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 634468624} + - component: {fileID: 634468626} + - component: {fileID: 634468625} + m_Layer: 5 + m_Name: MaxValue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &634468624 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 634468623} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 588534991} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 76.92003, y: 0.000015258789} + m_SizeDelta: {x: 211.2, y: 19.5} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &634468625 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 634468623} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: LatLngValues +--- !u!222 &634468626 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 634468623} + m_CullTransparentMesh: 0 +--- !u!1 &671458728 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 671458729} + - component: {fileID: 671458732} + - component: {fileID: 671458731} + - component: {fileID: 671458730} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &671458729 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 671458728} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 141452306} + m_Father: {fileID: 1227154253} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 282.74, y: -309} + m_SizeDelta: {x: 185.84, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &671458730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 671458728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 671458731} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &671458731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 671458728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &671458732 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 671458728} + m_CullTransparentMesh: 0 +--- !u!1 &715703584 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 715703585} + - component: {fileID: 715703587} + - component: {fileID: 715703586} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &715703585 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715703584} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1355918473} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &715703586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715703584} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &715703587 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715703584} + m_CullTransparentMesh: 0 +--- !u!1 &730776032 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 730776033} + - component: {fileID: 730776035} + - component: {fileID: 730776034} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &730776033 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 730776032} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 255389121} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &730776034 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 730776032} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Cancel +--- !u!222 &730776035 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 730776032} + m_CullTransparentMesh: 0 +--- !u!1 &899659186 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 899659187} + - component: {fileID: 899659189} + - component: {fileID: 899659188} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &899659187 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 899659186} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1785722563} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &899659188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 899659186} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &899659189 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 899659186} + m_CullTransparentMesh: 0 +--- !u!1 &1003178113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1003178114} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1003178114 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003178113} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1177518469} + m_Father: {fileID: 1785722563} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0.00000333786, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1020319629 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1020319630} + - component: {fileID: 1020319632} + - component: {fileID: 1020319631} + m_Layer: 5 + m_Name: MinValue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1020319630 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020319629} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1338329427} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 76.92003, y: -0.000015258789} + m_SizeDelta: {x: 211.2, y: 19.5} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1020319631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020319629} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: LatLngValues +--- !u!222 &1020319632 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020319629} + m_CullTransparentMesh: 0 +--- !u!1 &1045340545 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1045340546} + - component: {fileID: 1045340548} + - component: {fileID: 1045340547} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1045340546 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045340545} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1342691310} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 11.315, y: -0.5} + m_SizeDelta: {x: -32.629997, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1045340547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045340545} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Download Vector Data +--- !u!222 &1045340548 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045340545} + m_CullTransparentMesh: 0 +--- !u!1 &1054007410 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1054007411} + - component: {fileID: 1054007413} + - component: {fileID: 1054007412} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1054007411 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1054007410} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1341460001} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1054007412 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1054007410} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1054007413 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1054007410} + m_CullTransparentMesh: 0 +--- !u!1 &1089536129 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1089536130} + m_Layer: 5 + m_Name: InfoBox + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1089536130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089536129} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1416858049} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -250.64} + m_SizeDelta: {x: 400, y: 323.72} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1154553461 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1154553462} + - component: {fileID: 1154553464} + - component: {fileID: 1154553463} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1154553462 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154553461} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1365179948} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 11.315, y: -0.5} + m_SizeDelta: {x: -32.629997, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1154553463 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154553461} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Download Elevation +--- !u!222 &1154553464 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154553461} + m_CullTransparentMesh: 0 +--- !u!1 &1161839071 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1161839072} + - component: {fileID: 1161839074} + - component: {fileID: 1161839073} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1161839072 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161839071} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1269982019} + m_Father: {fileID: 1365179948} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: -1.1000061} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1161839073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161839071} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1161839074 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161839071} + m_CullTransparentMesh: 0 +--- !u!1 &1177518468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1177518469} + - component: {fileID: 1177518471} + - component: {fileID: 1177518470} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1177518469 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1177518468} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1003178114} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1177518470 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1177518468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.6096754, b: 0, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1177518471 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1177518468} + m_CullTransparentMesh: 0 +--- !u!1001 &1178802930 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1246307186655398, guid: 00f5bf1ff996842fc82384f8f686fda6, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114023684558016336, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_Value + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 114398042337336202, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_BlockingMask.m_Bits + value: 261943 + objectReference: {fileID: 0} + - target: {fileID: 224178813210018432, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224178813210018432, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224178813210018432, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 127.5 + objectReference: {fileID: 0} + - target: {fileID: 224178813210018432, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -18.5 + objectReference: {fileID: 0} + - target: {fileID: 224178813210018432, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_SizeDelta.x + value: 231 + objectReference: {fileID: 0} + - target: {fileID: 224178813210018432, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_SizeDelta.y + value: 23 + objectReference: {fileID: 0} + - target: {fileID: 224538534500426518, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224538534500426518, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224538534500426518, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 127.5 + objectReference: {fileID: 0} + - target: {fileID: 224538534500426518, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -45.5 + objectReference: {fileID: 0} + - target: {fileID: 224538534500426518, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_SizeDelta.x + value: 231 + objectReference: {fileID: 0} + - target: {fileID: 224538534500426518, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_SizeDelta.y + value: 23 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224709793726594912, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 224722295744740158, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 224722295744740158, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 224722295744740158, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 224771389989224222, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 224771389989224222, guid: 00f5bf1ff996842fc82384f8f686fda6, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 00f5bf1ff996842fc82384f8f686fda6, type: 3} +--- !u!1 &1212134310 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1212134311} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1212134311 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1212134310} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 608539060} + m_Father: {fileID: 2110420537} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1227154252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1227154253} + - component: {fileID: 1227154254} + m_Layer: 5 + m_Name: OfflineMapControl + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1227154253 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1227154252} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1338329427} + - {fileID: 588534991} + - {fileID: 1698156339} + - {fileID: 1547991402} + - {fileID: 1365179948} + - {fileID: 1229435886} + - {fileID: 1342691310} + - {fileID: 190760380} + - {fileID: 1341460001} + - {fileID: 671458729} + - {fileID: 327926549} + m_Father: {fileID: 1416858049} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 161.86002} + m_SizeDelta: {x: 400, y: 501.28} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1227154254 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1227154252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f17faf3acbef1264aa97acaa78977db6, type: 3} + m_Name: + m_EditorClassIdentifier: + Map: {fileID: 555018383} + MinLatLngGo: {fileID: 1864103088} + MaxLatLngGo: {fileID: 1480791277} + MinLatLngText: {fileID: 1020319631} + MaxLatLngText: {fileID: 634468625} + TileCountText: {fileID: 190760381} + ReportField: {fileID: 327926550} + MapName: {fileID: 1341460002} + MinZoomSlider: {fileID: 1355918474} + MaxZoomSlider: {fileID: 2110420538} + ElevationToggle: {fileID: 1365179949} + ImageryToggle: {fileID: 1229435887} + VectorToggle: {fileID: 1342691311} + DownloadButton: {fileID: 671458730} + ProgressPanel: {fileID: 471752045} + ProgressBar: {fileID: 1785722564} +--- !u!1 &1229435885 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1229435886} + - component: {fileID: 1229435887} + m_Layer: 5 + m_Name: Toggle (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1229435886 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1229435885} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 398418929} + - {fileID: 1414794723} + m_Father: {fileID: 1227154253} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 16.900024, y: -182.90002} + m_SizeDelta: {x: 358.76, y: 30.5} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1229435887 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1229435885} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 398418930} + toggleTransition: 1 + graphic: {fileID: 616540062} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1269982018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1269982019} + - component: {fileID: 1269982021} + - component: {fileID: 1269982020} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1269982019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269982018} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1161839072} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1269982020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269982018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1269982021 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269982018} + m_CullTransparentMesh: 0 +--- !u!1 &1276875583 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1276875585} + - component: {fileID: 1276875584} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1276875584 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1276875583} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.5 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1276875585 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1276875583} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1278722488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1278722489} + - component: {fileID: 1278722491} + - component: {fileID: 1278722490} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1278722489 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278722488} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2066619736} + m_Father: {fileID: 1342691310} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: -1.1000061} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1278722490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278722488} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1278722491 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278722488} + m_CullTransparentMesh: 0 +--- !u!1 &1338329426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1338329427} + - component: {fileID: 1338329429} + - component: {fileID: 1338329428} + m_Layer: 5 + m_Name: MinLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1338329427 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1338329426} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1020319630} + m_Father: {fileID: 1227154253} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 86.92, y: -31.800003} + m_SizeDelta: {x: 140.04, y: 19.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1338329428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1338329426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Minimum LatLng +--- !u!222 &1338329429 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1338329426} + m_CullTransparentMesh: 0 +--- !u!1 &1341460000 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1341460001} + - component: {fileID: 1341460004} + - component: {fileID: 1341460003} + - component: {fileID: 1341460002} + m_Layer: 5 + m_Name: InputField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1341460001 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341460000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 432292907} + - {fileID: 1054007411} + m_Father: {fileID: 1227154253} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 103.36, y: -309} + m_SizeDelta: {x: 172.92, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1341460002 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341460000} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1341460003} + m_TextComponent: {fileID: 1054007412} + m_Placeholder: {fileID: 432292908} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 +--- !u!114 &1341460003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341460000} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1341460004 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341460000} + m_CullTransparentMesh: 0 +--- !u!1 &1342691309 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1342691310} + - component: {fileID: 1342691311} + m_Layer: 5 + m_Name: Toggle (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1342691310 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1342691309} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1278722489} + - {fileID: 1045340546} + m_Father: {fileID: 1227154253} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 16.900024, y: -213.4} + m_SizeDelta: {x: 358.76, y: 30.5} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1342691311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1342691309} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1278722490} + toggleTransition: 1 + graphic: {fileID: 2066619737} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1343370024 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1343370028} + - component: {fileID: 1343370027} + - component: {fileID: 1343370026} + - component: {fileID: 1343370025} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1343370025 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343370024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 261943 +--- !u!114 &1343370026 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343370024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1343370027 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343370024} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1343370028 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343370024} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 75020823} + - {fileID: 1416858049} + - {fileID: 471752046} + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1355918472 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1355918473} + - component: {fileID: 1355918474} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1355918473 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1355918472} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 715703585} + - {fileID: 1855580291} + - {fileID: 344419400} + m_Father: {fileID: 1698156339} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 76.91995, y: -0.25} + m_SizeDelta: {x: 212.1, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1355918474 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1355918472} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 437905375} + m_FillRect: {fileID: 336238749} + m_HandleRect: {fileID: 437905374} + m_Direction: 0 + m_MinValue: 1 + m_MaxValue: 16 + m_WholeNumbers: 1 + m_Value: 1 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1365179947 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1365179948} + - component: {fileID: 1365179949} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1365179948 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1365179947} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1161839072} + - {fileID: 1154553462} + m_Father: {fileID: 1227154253} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 16.900024, y: -152.4} + m_SizeDelta: {x: 358.76, y: 30.5} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1365179949 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1365179947} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1161839073} + toggleTransition: 1 + graphic: {fileID: 1269982020} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1414794722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1414794723} + - component: {fileID: 1414794725} + - component: {fileID: 1414794724} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1414794723 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1414794722} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1229435886} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 11.315, y: -0.5} + m_SizeDelta: {x: -32.629997, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1414794724 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1414794722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Download Imagery +--- !u!222 &1414794725 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1414794722} + m_CullTransparentMesh: 0 +--- !u!1 &1416858048 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1416858049} + - component: {fileID: 1416858051} + - component: {fileID: 1416858050} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1416858049 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416858048} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1227154253} + - {fileID: 1089536130} + m_Father: {fileID: 1343370028} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 400, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1416858050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416858048} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.21960786, g: 0.21960786, b: 0.21960786, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1416858051 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416858048} + m_CullTransparentMesh: 0 +--- !u!1 &1480791277 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1480791278} + m_Layer: 5 + m_Name: TopRightCorner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1480791278 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1480791277} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 75020823} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1543928814 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1543928815} + - component: {fileID: 1543928817} + - component: {fileID: 1543928816} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1543928815 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1543928814} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 327926549} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1543928816 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1543928814} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Report + +' +--- !u!222 &1543928817 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1543928814} + m_CullTransparentMesh: 0 +--- !u!1 &1547991401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1547991402} + - component: {fileID: 1547991404} + - component: {fileID: 1547991403} + m_Layer: 5 + m_Name: MaxZoomLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1547991402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1547991401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2110420537} + m_Father: {fileID: 1227154253} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 86.92, y: -125.2} + m_SizeDelta: {x: 140.04, y: 19.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1547991403 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1547991401} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Minimum LatLng +--- !u!222 &1547991404 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1547991401} + m_CullTransparentMesh: 0 +--- !u!1 &1551586477 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1551586478} + - component: {fileID: 1551586480} + - component: {fileID: 1551586479} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1551586478 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551586477} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 327926549} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1551586479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551586477} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1551586480 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551586477} + m_CullTransparentMesh: 0 +--- !u!1 &1698156338 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1698156339} + - component: {fileID: 1698156341} + - component: {fileID: 1698156340} + m_Layer: 5 + m_Name: MinZoomLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1698156339 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1698156338} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1355918473} + m_Father: {fileID: 1227154253} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 86.92, y: -97.54996} + m_SizeDelta: {x: 140.04, y: 19.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1698156340 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1698156338} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Minimum LatLng +--- !u!222 &1698156341 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1698156338} + m_CullTransparentMesh: 0 +--- !u!1 &1785722562 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1785722563} + - component: {fileID: 1785722564} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1785722563 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1785722562} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 899659187} + - {fileID: 1003178114} + - {fileID: 470630863} + m_Father: {fileID: 471752046} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 499.61, y: 40.7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1785722564 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1785722562} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 111371667} + m_FillRect: {fileID: 1177518469} + m_HandleRect: {fileID: 111371666} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1787361570 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1787361575} + - component: {fileID: 1787361574} + - component: {fileID: 1787361572} + - component: {fileID: 1787361571} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1787361571 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787361570} + m_Enabled: 1 +--- !u!124 &1787361572 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787361570} + m_Enabled: 1 +--- !u!20 &1787361574 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787361570} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.13235295, g: 0.13235295, b: 0.13235295, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 256 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1787361575 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787361570} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 200, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &1855580290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1855580291} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1855580291 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855580290} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 336238749} + m_Father: {fileID: 1355918473} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1864103088 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1864103089} + m_Layer: 5 + m_Name: BottomLeftCorner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1864103089 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1864103088} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 75020823} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1905453348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1905453349} + - component: {fileID: 1905453351} + - component: {fileID: 1905453350} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1905453349 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1905453348} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2110420537} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1905453350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1905453348} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1905453351 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1905453348} + m_CullTransparentMesh: 0 +--- !u!1 &2066619735 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2066619736} + - component: {fileID: 2066619738} + - component: {fileID: 2066619737} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2066619736 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066619735} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1278722489} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2066619737 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066619735} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2066619738 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066619735} + m_CullTransparentMesh: 0 +--- !u!1 &2110420536 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2110420537} + - component: {fileID: 2110420538} + m_Layer: 5 + m_Name: Slider (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2110420537 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2110420536} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1905453349} + - {fileID: 2145212998} + - {fileID: 1212134311} + m_Father: {fileID: 1547991402} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 76.91997, y: 0.25} + m_SizeDelta: {x: 212.1, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &2110420538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2110420536} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 608539061} + m_FillRect: {fileID: 71039466} + m_HandleRect: {fileID: 608539060} + m_Direction: 0 + m_MinValue: 1 + m_MaxValue: 16 + m_WholeNumbers: 1 + m_Value: 1 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &2145212997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2145212998} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2145212998 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2145212997} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 71039466} + m_Father: {fileID: 2110420537} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity.meta b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity.meta new file mode 100644 index 000000000..07a8af6ca --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 36dca775a39eae7468cc6d22fcf183a2 +timeCreated: 1508277307 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots.meta b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots.meta new file mode 100644 index 000000000..052fa4ce6 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7e7e49e0789dec747a7688f99fc3363a +folderAsset: yes +timeCreated: 1512562508 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7283298ddc28a03628ce00374a2eddea564798 GIT binary patch literal 115457 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 O0000WZEDA literal 0 HcmV?d00001 diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png.meta b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png.meta new file mode 100644 index 000000000..33e251f38 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Screenshots/OfflineMap.png.meta @@ -0,0 +1,139 @@ +fileFormatVersion: 2 +guid: 26cfb396b786f2d45b81be1caa21496c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts.meta b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts.meta new file mode 100644 index 000000000..50b481ec7 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 00f75931268d20040aa7eb2e5a95421b +folderAsset: yes +timeCreated: 1512232891 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs new file mode 100644 index 000000000..7b9ae0376 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs @@ -0,0 +1,159 @@ +using System.Collections; +using System.Collections.Generic; +using Mapbox.Unity; +using Mapbox.Unity.Map; +using Mapbox.Utils; +using UnityEditor.Rendering.LookDev; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.UI; +using Environment = System.Environment; + +public class OfflineMapDemoController : MonoBehaviour +{ + public AbstractMap Map; + + public GameObject MinLatLngGo; + public GameObject MaxLatLngGo; + + public Text MinLatLngText; + public Text MaxLatLngText; + public Text TileCountText; + public InputField ReportField; + + public InputField MapName; + + public Slider MinZoomSlider; + public Slider MaxZoomSlider; + + public Toggle ElevationToggle; + public Toggle ImageryToggle; + public Toggle VectorToggle; + + public Button DownloadButton; + public Button CancelButton; + + public GameObject ProgressPanel; + public Slider ProgressBar; + + private bool _isDownloading = false; + private Camera _camera; + private Plane _plane; + private Vector2d _minLatLng; + private Vector2d _maxLatLng; + private int _minZoom; + private int _maxZoom; + + void Start() + { + _camera = Camera.main; + _plane = new Plane(Vector3.up, Vector3.zero); + + DownloadButton.onClick.AddListener(DownloadMap); + CancelButton.onClick.AddListener(CancelDownload); + MapboxAccess.Instance.OfflineManager.ProgressUpdated += DownloadProgressChanged; + MapboxAccess.Instance.OfflineManager.DownloadFinished += DownloadFinished; + } + + void Update() + { + if (Map != null) + { + Ray ray = _camera.ScreenPointToRay(MinLatLngGo.transform.position); + var distance = 0f; + if (_plane.Raycast(ray, out distance)) + { + _minLatLng = Map.WorldToGeoPosition(ray.GetPoint(distance)); + MinLatLngText.text = _minLatLng.ToString(); + } + + ray = _camera.ScreenPointToRay(MaxLatLngGo.transform.position); + if (_plane.Raycast(ray, out distance)) + { + _maxLatLng = Map.WorldToGeoPosition(ray.GetPoint(distance)); + MaxLatLngText.text = _maxLatLng.ToString(); + } + } + + _minZoom = (int) MinZoomSlider.value; + _maxZoom = Mathf.Max(_minZoom, (int) MaxZoomSlider.value); + _minZoom = Mathf.Min(_minZoom, _maxZoom); + MinZoomSlider.value = _minZoom; + MaxZoomSlider.value = _maxZoom; + + var tileCountInRegion = MapboxAccess.Instance.OfflineManager.EstimatedTileCount(_minLatLng, _maxLatLng, (int) MinZoomSlider.value, (int) MaxZoomSlider.value); + + var tilesetCount = 0; + if (ElevationToggle.isOn) tilesetCount++; + if (ImageryToggle.isOn) tilesetCount++; + if (VectorToggle.isOn) tilesetCount++; + + TileCountText.text = string.Format("Total of {0} tiles", tileCountInRegion * tilesetCount); + + ProgressPanel.SetActive(_isDownloading); + DownloadButton.interactable = !_isDownloading; + } + + private void DownloadProgressChanged(float value) + { + ProgressBar.value = value; + } + + private void DownloadFinished(OfflineMapDownloadInfo info) + { + _isDownloading = false; + ReportField.text = "Download Finished!" + Environment.NewLine; + ReportField.text += string.Format(@"Finished download of offline map '{0}'. +Succesful tiles:{1} +Failed tiles: {2} +Logs: {3}", + info.MapName, + info.SuccesfulTileDownloads, + info.FailedTileDownloads, + string.Join(Environment.NewLine, info.FailedDownloadLogs)); + } + + private void DownloadMap() + { + if (string.IsNullOrEmpty(MapName.text)) + { + ReportField.text = "Invalid map name."; + return; + } + + var elevationTilesetId = ElevationToggle.isOn ? "mapbox.terrain-rgb" : null; + var imageryTilesetId = ImageryToggle.isOn ? "mapbox://styles/mapbox/streets-v10" : null; + var vectorTilesetId = VectorToggle.isOn ? "mapbox.mapbox-streets-v8" : null; + + var region = new OfflineRegion( + MapName.text, + _minLatLng, + _maxLatLng, + _minZoom, + _maxZoom, + elevationTilesetId, + imageryTilesetId, + vectorTilesetId); + + var response = MapboxAccess.Instance.OfflineManager.CreateOfflineMap(region.Name, region); + if (response.HasErrors) + { + ReportField.text = response.ErrorMessage; + _isDownloading = false; + } + else + { + _isDownloading = true; + } + + ReportField.text = string.Format("Started downloading {0} tiles under name {1}.", MapboxAccess.Instance.OfflineManager.CurrentMapDownloadInfo.InitializedTileCount, MapboxAccess.Instance.OfflineManager.CurrentMapDownloadInfo.MapName); + } + + public void CancelDownload() + { + var name = MapboxAccess.Instance.OfflineManager.CurrentMapDownloadInfo.MapName; + MapboxAccess.Instance.OfflineManager.Stop(); + _isDownloading = false; + ReportField.text = string.Format("{0} download cancelled", name); + } +} diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs.meta b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs.meta new file mode 100644 index 000000000..486f0c6cd --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f17faf3acbef1264aa97acaa78977db6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/Scripts/DirectionsFactoryDropbox.cs.meta b/sdkproject/Assets/Mapbox/Examples/Scripts/DirectionsFactoryDropbox.cs.meta new file mode 100644 index 000000000..af2a88046 --- /dev/null +++ b/sdkproject/Assets/Mapbox/Examples/Scripts/DirectionsFactoryDropbox.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: db395716c0e41264c8dbfd4b6e32b9de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdkproject/Assets/Mapbox/Examples/Scripts/QuadTreeCameraMovement.cs b/sdkproject/Assets/Mapbox/Examples/Scripts/QuadTreeCameraMovement.cs index 4933cf459..867f8562b 100644 --- a/sdkproject/Assets/Mapbox/Examples/Scripts/QuadTreeCameraMovement.cs +++ b/sdkproject/Assets/Mapbox/Examples/Scripts/QuadTreeCameraMovement.cs @@ -25,6 +25,8 @@ public class QuadTreeCameraMovement : MonoBehaviour [SerializeField] bool _useDegreeMethod; + [SerializeField] private bool _keyboardPanEnabled; + private Vector3 _origin; private Vector3 _mousePosition; private Vector3 _mousePositionPrevious; @@ -89,7 +91,10 @@ void HandleMouseAndKeyBoard() float xMove = Input.GetAxis("Horizontal"); float zMove = Input.GetAxis("Vertical"); - PanMapUsingKeyBoard(xMove, zMove); + if (_keyboardPanEnabled) + { + PanMapUsingKeyBoard(xMove, zMove); + } //pan mouse diff --git a/sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs b/sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs new file mode 100644 index 000000000..15bb9d756 --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +public class OfflineMapDownloadInfo +{ + public string MapName; + public int InitializedTileCount; + public int SuccesfulTileDownloads = 0; + public int FailedTileDownloads = 0; + public List FailedDownloadLogs; + + public OfflineMapDownloadInfo(string name, int tilesCount) + { + MapName = name; + InitializedTileCount = tilesCount; + FailedDownloadLogs = new List(); + } +} \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs.meta b/sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs.meta new file mode 100644 index 000000000..161a8b931 --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineMapDownloadInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0bb8125643724776b46b30e69382311a +timeCreated: 1598018537 \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineMapResponse.cs b/sdkproject/Assets/Offline/OfflineMapResponse.cs new file mode 100644 index 000000000..ffe5a70da --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineMapResponse.cs @@ -0,0 +1,5 @@ +public class OfflineMapResponse +{ + public bool HasErrors = false; + public string ErrorMessage; +} \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineMapResponse.cs.meta b/sdkproject/Assets/Offline/OfflineMapResponse.cs.meta new file mode 100644 index 000000000..7f073e33e --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineMapResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d475c0b584ee46a8a6f1891c68c4f6d5 +timeCreated: 1598018519 \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineMode.cs b/sdkproject/Assets/Offline/OfflineMode.cs index d0760b0db..982c6addc 100644 --- a/sdkproject/Assets/Offline/OfflineMode.cs +++ b/sdkproject/Assets/Offline/OfflineMode.cs @@ -60,7 +60,7 @@ void OnGUI() if (GUI.changed) { - _estimateTileCount = MapboxAccess.Instance.OfflineManager.EstimatedOfflineTileCount(OfflineRegion); + _estimateTileCount = MapboxAccess.Instance.OfflineManager.EstimatedTileList(OfflineRegion).Count; } EditorGUILayout.LabelField("Estimate: " + _estimateTileCount + " tiles"); @@ -112,19 +112,19 @@ void OnGUI() public void Test() { - - var offlineRegion = new OfflineRegion() { - MinLatLng = "37.7402769,-122.5984467", - MaxLatLng = "37.9327687,-122.2179695", + Name = "TestMap", + MinLatLng = Conversions.StringToLatLon("37.7402769,-122.5984467"), + MaxLatLng = Conversions.StringToLatLon("37.9327687,-122.2179695"), MinZoom = 6, MaxZoom = 11, ElevationTilesetId = "mapbox.terrain-rgb", ImageTilesetId = "mapbox://styles/mapbox/streets-v10" }; MapboxAccess.Instance.OfflineManager.CreateOfflineMap("San Francisco", offlineRegion); - + MapboxAccess.Instance.OfflineManager.ProgressUpdated += (s) => { Debug.Log(s); }; + MapboxAccess.Instance.OfflineManager.Stop(); } @@ -152,9 +152,9 @@ private void AreaInfos() GUILayout.Label("Area Settings", EditorStyles.boldLabel); GUILayout.Space(10); EditorGUILayout.LabelField("Minimum Longitude Latitude"); - OfflineRegion.MinLatLng = EditorGUILayout.TextField(OfflineRegion.MinLatLng); + OfflineRegion.MinLatLng = Conversions.StringToLatLon(EditorGUILayout.TextField(OfflineRegion.MinLatLng.ToString())); EditorGUILayout.LabelField("Maximum Longitude Latitude"); - OfflineRegion.MaxLatLng = EditorGUILayout.TextField(OfflineRegion.MaxLatLng); + OfflineRegion.MaxLatLng = Conversions.StringToLatLon(EditorGUILayout.TextField(OfflineRegion.MaxLatLng.ToString())); EditorGUILayout.LabelField("Minimum Zoom"); OfflineRegion.MinZoom = EditorGUILayout.IntSlider(OfflineRegion.MinZoom, 0, 22); EditorGUILayout.LabelField("Maximum Zoom"); @@ -269,7 +269,7 @@ protected void OnEnable() { var data = EditorPrefs.GetString("MapboxOfflineMaps", JsonUtility.ToJson(this, false)); JsonUtility.FromJsonOverwrite(data, this); - _estimateTileCount = MapboxAccess.Instance.OfflineManager.EstimatedOfflineTileCount(OfflineRegion); + _estimateTileCount = MapboxAccess.Instance.OfflineManager.EstimatedTileList(OfflineRegion).Count; MapboxAccess.Instance.OfflineManager.ProgressUpdated += UpdateProgressBar; MapboxAccess.Instance.OfflineManager.DownloadFinished += DownloadFinished; MapboxAccess.Instance.OfflineManager.NewLog += NewLog; @@ -299,18 +299,4 @@ private void NewLog(string log) _logs += "-------------------------" + Environment.NewLine; } -} - -[Serializable] -public class OfflineRegion -{ - public string MinLatLng = ""; - public string MaxLatLng = ""; - - [Range(0, 16)] public int MinZoom; - [Range(0, 16)] public int MaxZoom; - - public string ElevationTilesetId; - public string ImageTilesetId; - public string VectorTilesetId; } \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineRegion.cs b/sdkproject/Assets/Offline/OfflineRegion.cs new file mode 100644 index 000000000..37cd365ce --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineRegion.cs @@ -0,0 +1,37 @@ +using System; +using Mapbox.Utils; +using UnityEngine; + +[Serializable] +public class OfflineRegion +{ + public string Name; + + public Vector2d MinLatLng; + public Vector2d MaxLatLng; + + [Range(0, 16)] public int MinZoom; + [Range(0, 16)] public int MaxZoom; + + public string ElevationTilesetId; + public string ImageTilesetId; + public string VectorTilesetId; + + public OfflineRegion() + { + + } + + public OfflineRegion(string mapName, Vector2d minLatLng, Vector2d maxLatLng, int minZoom, int maxZoom, string elevationTileset = "", string imageryTileset = "", string vectorTileset = "") + { + MinLatLng = minLatLng; + MaxLatLng = maxLatLng; + MinZoom = minZoom; + MaxZoom = maxZoom; + ElevationTilesetId = elevationTileset; + ImageTilesetId = imageryTileset; + VectorTilesetId = vectorTileset; + Name = mapName; + } + +} \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineRegion.cs.meta b/sdkproject/Assets/Offline/OfflineRegion.cs.meta new file mode 100644 index 000000000..69bd27c46 --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineRegion.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0eda4d665eba4e7682d21a2709b3c8a2 +timeCreated: 1598018893 \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineTileInfo.cs b/sdkproject/Assets/Offline/OfflineTileInfo.cs new file mode 100644 index 000000000..684a7685a --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineTileInfo.cs @@ -0,0 +1,15 @@ +using Mapbox.Map; + +public class OfflineTileInfo +{ + public CanonicalTileId CanonicalTileId; + public OfflineTileType Type; + public string TilesetId; + + public OfflineTileInfo(UnwrappedTileId tileId, OfflineTileType type, string tilesetId) + { + CanonicalTileId = tileId.Canonical; + Type = type; + TilesetId = tilesetId; + } +} \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineTileInfo.cs.meta b/sdkproject/Assets/Offline/OfflineTileInfo.cs.meta new file mode 100644 index 000000000..dfb03e48b --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineTileInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9dd65fcd8f4c483399c93688245d2a63 +timeCreated: 1598018526 \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineTileType.cs b/sdkproject/Assets/Offline/OfflineTileType.cs new file mode 100644 index 000000000..9d3e7f067 --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineTileType.cs @@ -0,0 +1,7 @@ +public enum OfflineTileType +{ + Elevation, + Imagery, + RetinaImagery, + Vector +} \ No newline at end of file diff --git a/sdkproject/Assets/Offline/OfflineTileType.cs.meta b/sdkproject/Assets/Offline/OfflineTileType.cs.meta new file mode 100644 index 000000000..e58b8a277 --- /dev/null +++ b/sdkproject/Assets/Offline/OfflineTileType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 462eaea513da488ea9f63ddd5855d31b +timeCreated: 1598018510 \ No newline at end of file From b69354c93bd44034e2fa88f0dd4e23fa5d244f68 Mon Sep 17 00:00:00 2001 From: brnkhy Date: Tue, 1 Sep 2020 15:35:34 +0300 Subject: [PATCH 08/18] add offline map list to demo scene --- .../Examples/9_OfflineMap/OfflineMap.unity | 609 +++++++++++++++++- .../Scripts/OfflineMapDemoController.cs | 36 +- .../Assets/Mapbox/Unity/OfflineManager.cs | 433 ------------- sdkproject/Assets/Offline/OfflineMode.cs | 302 --------- 4 files changed, 629 insertions(+), 751 deletions(-) delete mode 100644 sdkproject/Assets/Mapbox/Unity/OfflineManager.cs delete mode 100644 sdkproject/Assets/Offline/OfflineMode.cs diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity index 12b663b06..819bd526b 100644 --- a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/OfflineMap.unity @@ -302,7 +302,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 38.7, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -843,9 +843,9 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 196.28, y: -408.5} - m_SizeDelta: {x: 358.76, y: 147.70001} - m_Pivot: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 20, y: -482.35} + m_SizeDelta: {x: 360, y: 147.7} + m_Pivot: {x: 0, y: 0} --- !u!114 &327926550 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1227,6 +1227,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 398418928} m_CullTransparentMesh: 0 +--- !u!1 &419095224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 419095225} + - component: {fileID: 419095227} + - component: {fileID: 419095226} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &419095225 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 419095224} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1162584193} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &419095226 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 419095224} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &419095227 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 419095224} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_ChildAlignment: 0 + m_Spacing: 8 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 --- !u!1 &432292906 GameObject: m_ObjectHideFlags: 0 @@ -1430,7 +1506,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &471752046 RectTransform: m_ObjectHideFlags: 0 @@ -1488,6 +1564,115 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 471752045} m_CullTransparentMesh: 0 +--- !u!1 &535979530 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 535979531} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &535979531 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 535979530} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 544513384} + m_Father: {fileID: 630188711} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &544513383 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 544513384} + - component: {fileID: 544513386} + - component: {fileID: 544513385} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &544513384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 544513383} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 535979531} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &544513385 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 544513383} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &544513386 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 544513383} + m_CullTransparentMesh: 0 --- !u!1 &555018382 GameObject: m_ObjectHideFlags: 0 @@ -1892,6 +2077,129 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 616540060} m_CullTransparentMesh: 0 +--- !u!1 &630188710 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 630188711} + - component: {fileID: 630188714} + - component: {fileID: 630188713} + - component: {fileID: 630188712} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &630188711 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630188710} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 535979531} + m_Father: {fileID: 1053518601} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &630188712 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630188710} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 544513385} + m_HandleRect: {fileID: 544513384} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &630188713 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630188710} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &630188714 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630188710} + m_CullTransparentMesh: 0 --- !u!1 &634468623 GameObject: m_ObjectHideFlags: 0 @@ -2005,7 +2313,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 282.74, y: -309} + m_AnchoredPosition: {x: 287.08008, y: -309} m_SizeDelta: {x: 185.84, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &671458730 @@ -2500,6 +2808,112 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1045340545} m_CullTransparentMesh: 0 +--- !u!1 &1053518600 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1053518601} + - component: {fileID: 1053518604} + - component: {fileID: 1053518603} + - component: {fileID: 1053518602} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1053518601 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053518600} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1162584193} + - {fileID: 630188711} + m_Father: {fileID: 1089536130} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 20, y: -308.95} + m_SizeDelta: {x: 360, y: 272.9} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1053518602 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053518600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 419095225} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1162584193} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 630188712} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1053518603 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053518600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1053518604 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1053518600} + m_CullTransparentMesh: 0 --- !u!1 &1054007410 GameObject: m_ObjectHideFlags: 0 @@ -2603,7 +3017,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] + m_Children: + - {fileID: 1686983909} + - {fileID: 1053518601} m_Father: {fileID: 1416858049} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -2763,6 +3179,94 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1161839071} m_CullTransparentMesh: 0 +--- !u!1 &1162584192 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1162584193} + - component: {fileID: 1162584196} + - component: {fileID: 1162584195} + - component: {fileID: 1162584194} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1162584193 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162584192} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 419095225} + m_Father: {fileID: 1053518601} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1162584194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162584192} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &1162584195 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162584192} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1162584196 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162584192} + m_CullTransparentMesh: 0 --- !u!1 &1177518468 GameObject: m_ObjectHideFlags: 0 @@ -2796,7 +3300,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} @@ -3132,6 +3636,9 @@ MonoBehaviour: Map: {fileID: 555018383} MinLatLngGo: {fileID: 1864103088} MaxLatLngGo: {fileID: 1480791277} + OfflineMapListContainer: {fileID: 419095225} + OfflineMapListPrefab: {fileID: 3412926180062485390, guid: a8215d1a2d0370d4ba1340b7c01e7e8f, + type: 3} MinLatLngText: {fileID: 1020319631} MaxLatLngText: {fileID: 634468625} TileCountText: {fileID: 190760381} @@ -3143,6 +3650,7 @@ MonoBehaviour: ImageryToggle: {fileID: 1229435887} VectorToggle: {fileID: 1342691311} DownloadButton: {fileID: 671458730} + CancelButton: {fileID: 255389122} ProgressPanel: {fileID: 471752045} ProgressBar: {fileID: 1785722564} --- !u!1 &1229435885 @@ -3584,9 +4092,9 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 103.36, y: -309} + m_AnchoredPosition: {x: 20, y: -324} m_SizeDelta: {x: 172.92, y: 30} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0, y: 0} --- !u!114 &1341460002 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3957,7 +4465,7 @@ MonoBehaviour: m_MinValue: 1 m_MaxValue: 16 m_WholeNumbers: 1 - m_Value: 1 + m_Value: 7 m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -4467,6 +4975,83 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1551586477} m_CullTransparentMesh: 0 +--- !u!1 &1686983908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1686983909} + - component: {fileID: 1686983911} + - component: {fileID: 1686983910} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1686983909 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686983908} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1089536130} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -4.3, y: -15} + m_SizeDelta: {x: -42.9, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1686983910 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686983908} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 25 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Offline Maps +--- !u!222 &1686983911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686983908} + m_CullTransparentMesh: 0 --- !u!1 &1698156338 GameObject: m_ObjectHideFlags: 0 @@ -5028,7 +5613,7 @@ MonoBehaviour: m_MinValue: 1 m_MaxValue: 16 m_WholeNumbers: 1 - m_Value: 1 + m_Value: 10 m_OnValueChanged: m_PersistentCalls: m_Calls: [] diff --git a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs index 7b9ae0376..4ce0889ed 100644 --- a/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs +++ b/sdkproject/Assets/Mapbox/Examples/9_OfflineMap/Scripts/OfflineMapDemoController.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using System.Security.Cryptography; using Mapbox.Unity; using Mapbox.Unity.Map; using Mapbox.Utils; @@ -16,6 +17,9 @@ public class OfflineMapDemoController : MonoBehaviour public GameObject MinLatLngGo; public GameObject MaxLatLngGo; + public Transform OfflineMapListContainer; + public GameObject OfflineMapListPrefab; + public Text MinLatLngText; public Text MaxLatLngText; public Text TileCountText; @@ -53,6 +57,8 @@ void Start() CancelButton.onClick.AddListener(CancelDownload); MapboxAccess.Instance.OfflineManager.ProgressUpdated += DownloadProgressChanged; MapboxAccess.Instance.OfflineManager.DownloadFinished += DownloadFinished; + + UpdateMapList(); } void Update() @@ -94,6 +100,26 @@ void Update() DownloadButton.interactable = !_isDownloading; } + private void UpdateMapList() + { + foreach (Transform button in OfflineMapListContainer.transform) + { + Destroy(button.gameObject); + } + + var maps = MapboxAccess.Instance.OfflineManager.GetOfflineMapList(); + foreach (var map in maps) + { + var go = Instantiate(OfflineMapListPrefab, OfflineMapListContainer); + go.GetComponentInChildren().text = string.Format("{0} ({1} tiles)", map.Key, map.Value); + go.GetComponentInChildren