using System;
using System.Collections.Generic;
using System.IO;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using VketCloudGUITools.Runtime;
namespace VketCloudGUITools.Serialization
{
///
/// TODO:VketVrAppに統合が完了したら削除する
/// これは実機読み込みのサンプルです。
/// 実際の環境では、CanvasJSONの読み込み、AssetBundleの重複管理などを利用側が実装する必要があります。
///
public class VCCanvasImporterLoadFromStreamingAssets : MonoBehaviour
{
///
/// CanvasImport時に、アセットIDを解決して、アセットバンドルからSpriteを読み込みます。
///
public class LoadSpriteWorker
{
private Dictionary cacheTextures = new Dictionary();
private Dictionary cacheSprites = new Dictionary();
///
/// AssetIDから、アセットのURLを取得する
///
public Func onConvertAssetIdToUrl = DefaultConverter;
///
/// 読み込み済みアセットバンドルの管理
/// サンプル用なので、他のアセットバンドル管理系があれば、つなぐ必要がある
///
private static Dictionary LoadedAssetBundles = new Dictionary();
///
/// 読み込み
///
///
///
///
///
public async UniTask DoLoadSprite(string assetID, ImportProgress progress, VCCanvasImporterSettings settings)
{
string assetName = onConvertAssetIdToUrl(assetID);
string url = assetName;
Sprite cacheSprite;
if (cacheSprites.TryGetValue(assetID, out cacheSprite))
{
progress.Done();
return cacheSprite;
}
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
{
await settings.SmartYield();
await www.SendWebRequest();
await settings.SmartYield();
if (www.isNetworkError || www.isHttpError)
{
progress.Done();
return null;
}
var texture = ((DownloadHandlerTexture)www.downloadHandler).texture;
texture.name = assetID;
var sprite = Sprite.Create(texture, new Rect(0f, 0f, texture.width, texture.height), new Vector2(texture.width / 2f, texture.height / 2f));
sprite.name = assetID;
cacheTextures.Add(assetID, texture);
cacheSprites.Add(assetID, sprite);
progress.Done();
return sprite;
}
}
private static string DefaultConverter(string path)
{
return path;
}
}
///
/// インポートするファイル名
/// サンプルなので、実機でのファイル読み込みは想定しない
///
public string importPath;
///
/// StreamingAssetsをルートとした、アセットの共通相対パス
/// StreamingAssets直下なら"/"
/// StreamingAssets/ExtenalToolsなら"/ExtenalTools/"と指定する。
///
public string streamingAssetsSubPath = "/ExternalTools/";
///
/// 読み込み開始
///
public bool startImport = false;
private ILogger _logger = new Logger(Debug.unityLogger);
async void Update()
{
if (startImport)
{
try
{
startImport = false;
// 読み込み設定
string jsonData = string.Empty;
// 出力キャンバス名を指定(エディタ用Importと同等)
string canvasName = Path.GetFileNameWithoutExtension(importPath);
// 縦横を指定
// 読み込み対象のCanvasJson自体は持たず、CanvasJson一覧側にて管理されている
// これはサンプルなので、適当な指定をしている
CanvasType canvasType = CanvasType.LandScape;
// 読み込みデフォルト設定
var settings = VCCanvasImporterSettings.RuntimeDefaults(canvasType, canvasName, _logger);
settings.taskSafeIntervalMS = 1;
settings.canvasRenderMode = RenderMode.WorldSpace;
// スプライト読み込みをカスタム
var spriteLoader = new LoadSpriteWorker()
{
// これはサンプルなので、SteamingAssetsの構成次第でパス解釈は変える必要がある
onConvertAssetIdToUrl = assetID => Application.streamingAssetsPath + streamingAssetsSubPath + assetID
};
settings.onLoadSprite = spriteLoader.DoLoadSprite;
// CanvasJsonファイルを読み込む
try
{
var request = UnityWebRequest.Get(importPath);
await request.SendWebRequest();
jsonData = request.downloadHandler.text;
}
catch (Exception e)
{
throw new Exception($"CanvasJsonを開けません\nPath:{importPath}\n", e);
}
// CanvasJsonを解釈し、インポートする
var canvas = await VCCanvasImporter.ImportAsync(jsonData, this.transform, settings);
canvas.OnResolveReferences();
}
catch (System.Exception e)
{
_logger.LogException(e, this);
}
}
}
}
}