using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.UI;
using VketCloudGUITools.Runtime;
using VketCloudGUITools.Utilities;
namespace VketCloudGUITools.Serialization
{
public class VCCanvasImporter
{
///
/// Import用タスクを生成します。
///
///
///
/// 進捗表示用オブザーバー
///
public static async UniTask ImportAsync(string jsonData, Transform root, VCCanvasImporterSettings settings, Action getProgressObserver = null)
{
var progress = new ImportProgress("Importing Canvas", string.Empty, 1f);
if (getProgressObserver != null)
getProgressObserver(progress);
return await DoImportAsync(progress, jsonData, root, settings);
}
///
/// Import処理を行います。
///
/// 進捗
/// CanvasJSONテキスト
/// 生成されたCanvasのRoot
/// インポート設定
///
static async UniTask DoImportAsync(ImportProgress progress, string jsonData, Transform root, VCCanvasImporterSettings settings)
{
VCCanvasDef canvasDef = null;
try
{
// Jsonを読んでデシリアライズ用のインスタンスを生成する
canvasDef = JsonConvert.DeserializeObject(jsonData);
}
catch (Exception e)
{
settings.logger.LogException(e);
// Innerにしたいが、ログが異様に長くて読みにくいので要約を投げる
throw new Exception("JSON Parse Failed.");
}
// Json読み取りに成功したので、Canvasを組み立てる
var canvas = await ImportCanvasAsync(CreateChildProgress("Canvas", string.Empty, progress, 1f), canvasDef, root, settings);
progress.Done();
return canvas;
}
///
/// Canvasをインポートする
///
/// 進捗
/// キャンバス構造定義
/// キャンバス出力先ルート
/// インポート設定
///
static async UniTask ImportCanvasAsync(ImportProgress progress, VCCanvasDef canvasDef, Transform root, VCCanvasImporterSettings settings)
{
var canvas = VCFactory.CreateCanvas(settings.determinateCanvasName());
var unityCanvas = canvas.GetComponent