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); } } } } }