using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; using VketCloudGUITools.Runtime; namespace VketCloudGUITools.Serialization { /// /// CanvasInpoterの設定 /// public class VCCanvasImporterSettings { /// /// 外部ファイルをUnityアセットとして取り込むときの挙動 /// /// アセット型 /// アセットID /// 進捗情報 /// 設定 /// public delegate UniTask ImportAssetDelegate(string assetID, ImportProgress progress, VCCanvasImporterSettings settings); /// /// Unityアセットをメモリに読み込むときの挙動 /// /// アセット型 /// アセットID /// 進捗情報 /// 設定 /// public delegate UniTask LoadAssetDelegate(string assetID, ImportProgress progress, VCCanvasImporterSettings settings); /// /// Canvasの名前を確定するときの挙動 /// /// public delegate string DeterminateCanvasNameDelegate(); /// /// CanvasTypeを確定するときの挙動 /// /// public delegate CanvasType DeterminateCanvasTypeDelegate(); /// /// Spriteのインポート時の挙動 /// public ImportAssetDelegate onImportSprite = Empty; /// /// Spriteのロード時の挙動 /// public LoadAssetDelegate onLoadSprite = Empty; public ImportAssetDelegate onImportHeliodorScript = Empty; public LoadAssetDelegate onLoadHeliodorScript = Empty; /// /// このTaskのメインスレッドを確保する上限時間(ミリ秒)。これを超えると、いちどメインスレッドを返すことでフリーズを回避する。 /// おもに非同期読み込みのロード画面のフリーズ許容時間の制御。 /// public long taskSafeIntervalMS = 0; /// /// Canvasの名前を決定する。 /// public DeterminateCanvasNameDelegate determinateCanvasName; /// /// CanvasTypeを決定する。 /// public DeterminateCanvasTypeDelegate determinateCanvasType; /// /// CanvasRenderMode /// public RenderMode canvasRenderMode = RenderMode.ScreenSpaceCamera; /// /// Logger /// public ILogger logger = new Logger(Debug.unityLogger); /// /// Editor用:インポートの外部アセット読込先ルートを指定。 /// private string _importDataPath = string.Empty; /// /// Editor用:インポート時のUnityアセット保存先ルートを指定。 /// private string _importAssetOutputPath = string.Empty; /// /// の最後にメインスレッドを返した時間(Ticks) /// private long _lastTaskResumedTicks = 0; /// /// 実行時のデフォルト設定 /// /// CanvasType手動指定 /// CanvasName手動指定 /// public static VCCanvasImporterSettings RuntimeDefaults(CanvasType canvasType, string canvasName, ILogger logger) { var settings = new VCCanvasImporterSettings(); settings.onLoadSprite = RuntimeOnLoadSpriteFromResources; settings.determinateCanvasName = () => canvasName; settings.determinateCanvasType = () => canvasType; if (logger != null) settings.logger = logger; // 0.01 sec settings.taskSafeIntervalMS = 10; return settings; } /// /// 実行時のSprite読みこみ。Resourcesから。 /// /// /// /// /// public static async UniTask RuntimeOnLoadSpriteFromResources(string assetID, ImportProgress progress, VCCanvasImporterSettings settings) { var result = await Resources.LoadAsync(assetID) as Sprite; progress.Done(); return result; } /// /// 極度の長時間のメインスレッド確保を防ぐためのチェックポイント。 /// で設定された時間を超えてスレッドを確保していたら、1msだけスレッドを返す。 /// /// public async UniTask SmartYield() { var now = DateTime.Now; long deltaTicks = now.Ticks - _lastTaskResumedTicks; if (deltaTicks > TimeSpan.TicksPerMillisecond * taskSafeIntervalMS) { await UniTask.Delay(1); _lastTaskResumedTicks = now.Ticks; } } public static async UniTask Empty(string assetID, ImportProgress progress, VCCanvasImporterSettings settings) { await UniTask.Delay(0); progress.Done(); return default(T); } } }