80 lines
1.9 KiB
C#
80 lines
1.9 KiB
C#
using System;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
namespace Cryville.EEW.Unity.Map {
|
|
sealed class MapTileBitmapHolderBehaviour : MonoBehaviour {
|
|
Action<Sprite> _callback;
|
|
public void Bind(MapTile tile) {
|
|
if (_isDone)
|
|
tile.Set(_sprite);
|
|
else
|
|
_callback += tile.Set;
|
|
}
|
|
|
|
UnityWebRequest _req;
|
|
DownloadHandlerTexture _texHandler;
|
|
Texture2D _tex;
|
|
Sprite _sprite;
|
|
|
|
FileInfo _localFile;
|
|
bool _isReady;
|
|
bool _isDone;
|
|
public void Load(FileInfo file) {
|
|
_localFile = file;
|
|
_isReady = true;
|
|
}
|
|
void Update() {
|
|
if (_isDestroyed) {
|
|
Destroy(gameObject);
|
|
return;
|
|
}
|
|
if (_isReady) {
|
|
try {
|
|
_texHandler = new DownloadHandlerTexture();
|
|
_req = new UnityWebRequest($"file:///{_localFile}") {
|
|
downloadHandler = _texHandler,
|
|
disposeDownloadHandlerOnDispose = true,
|
|
};
|
|
_req.SendWebRequest();
|
|
}
|
|
catch (Exception ex) {
|
|
App.MainLogger.Log(4, "Map", null, "An error occurred when loading map tile {0}: {1}", _localFile, ex);
|
|
}
|
|
_isReady = false;
|
|
}
|
|
if (_req == null || !_req.isDone) return;
|
|
if (_texHandler.isDone && _texHandler.texture != null) {
|
|
_tex = _texHandler.texture;
|
|
_tex.wrapMode = TextureWrapMode.Clamp;
|
|
_sprite = Sprite.Create(_tex, new Rect(0, 0, _tex.width, _tex.height), Vector2.zero, _tex.height, 0, SpriteMeshType.FullRect, Vector4.zero, false);
|
|
}
|
|
else {
|
|
App.MainLogger.Log(4, "Map", null, "An error occurred when loading map tile {0}: {1}", _localFile, _texHandler.error);
|
|
_localFile.Delete();
|
|
}
|
|
_req.Dispose();
|
|
_texHandler.Dispose();
|
|
_req = null;
|
|
_callback?.Invoke(_sprite);
|
|
_isDone = true;
|
|
}
|
|
|
|
|
|
bool _isDestroyed;
|
|
public void Destroy() {
|
|
_isDestroyed = true;
|
|
}
|
|
void OnDestroy() {
|
|
if (_req != null) {
|
|
_req.Abort();
|
|
_req.Dispose();
|
|
_texHandler.Dispose();
|
|
}
|
|
if (_sprite) Destroy(_sprite);
|
|
if (_tex) Destroy(_tex);
|
|
}
|
|
}
|
|
}
|