You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
mapbox-sdk/Unity/Map/TileProviders/TileErrorHandler.cs

94 lines
2.3 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using Mapbox.Map;
using UnityEngine;
using UnityEngine.Events;
namespace Mapbox.Unity.Map.TileProviders
{
/// <summary>
/// Monobehavior Script to handle TileErrors.
/// There's an OnTileError event on AbstractMapVisualizer, AbstractTileFactory and UnityTile classes that one can subscribe to to listen to tile errors
/// </summary>
public class TileErrorHandler : MonoBehaviour
{
[SerializeField]
private AbstractMap _mapInstance;
public TileErrorEvent OnTileError;
protected virtual void OnEnable()
{
if (_mapInstance == null)
{
_mapInstance = GetComponent<AbstractMap>();
}
_mapInstance.OnInitialized += MapInstance_OnInitialized;
}
private void MapInstance_OnInitialized()
{
_mapInstance.OnInitialized -= MapInstance_OnInitialized;
_mapInstance.MapVisualizer.OnTileError += _OnTileErrorHandler;
}
private void _OnTileErrorHandler(object sender, TileErrorEventArgs e)
{
// check if request has been aborted: show warning not error
if (e.Exceptions.Count > 0)
{
// 1. aborted is always the first exception
// additional exceptions are always caused by the request being aborted
// show all of them as warnings
// 2. 'Unable to write data' is another exception associated
// with aborted requests: request finshed successfully but
// was aborted during filling of local buffer, also show as warning
if (
e.Exceptions[0].Message.Contains("Request aborted")
|| e.Exceptions[0].Message.Equals("Unable to write data")
)
{
Debug.LogWarning(printMessage(e.Exceptions, e));
}
else
{
Debug.LogError(printMessage(e.Exceptions, e));
}
}
if (OnTileError != null)
{
OnTileError.Invoke(e);
}
}
private string printMessage(List<Exception> exceptions, TileErrorEventArgs e)
{
return string.Format(
"{0} Exception(s) caused on the tile. Tile ID:{1} Tile Type:{4}{2}{3}"
, exceptions.Count
, e.TileId
, Environment.NewLine
, string.Join(Environment.NewLine, exceptions.Select(ex => ex.Message).ToArray())
, e.TileType
);
}
protected virtual void OnDisable()
{
_mapInstance.MapVisualizer.OnTileError -= _OnTileErrorHandler;
}
}
[System.Serializable]
public class TileErrorEvent : UnityEvent<TileErrorEventArgs> { }
}