/// <summary> /// VRoid HubのキャラクターモデルからキャラクターモデルのGameObjectを取得する /// </summary> /// <remarks> /// 初めて取り込むキャラクターモデルは、VRoidHubApi経由でモデルデータをダウンロードし、LocalStorageにキャッシュされる。 /// 一度取り込まれたキャラクターモデルは、次からキャッシュから読み込まれるようになる /// </remarks> /// <param name="characterModel">取り出すキャラクターモデル</param> /// <param name="option">オプション</param> /// <param name="onLoadComplete">キャラクターモデルの読み込みに成功した時のコールバック</param> /// <param name="onDownloadProgress">ダウンロードの進捗状況を通知するコールバック</param> /// <param name="onError">エラー発生時のコールバック</param> public void LoadCharacterAsync(CharacterModel characterModel, HubModelDeserializerOption option, Action <GameObject> onLoadComplete, Action <float> onDownloadProgress, Action <Exception> onError) { ModelLoaderFactory.Create(characterModel, this, option, (loader) => { loader.OnVrmModelLoaded = onLoadComplete; loader.OnProgress = onDownloadProgress; loader.OnError = onError; loader.Load(); }, (ApiErrorFormat errorFormat) => { onError(new ApiRequestFailException(errorFormat)); }); }
public void LoadCharacterAsync(string characterModelId, uint maxCacheCount, Action <GameObject> onLoadComplete, Action <float> onDownloadProgress, Action <Exception> onError) { HubApi.GetCharacterModel(characterModelId, (CharacterModelDetail) => { var option = new HubModelDeserializerOption(); option.MaxCacheCount = maxCacheCount; LoadCharacterAsync( CharacterModelDetail.character_model, option, onLoadComplete, onDownloadProgress, onError ); }, (ApiErrorFormat errorFormat) => { onError(new Exception(errorFormat.message)); }); }
/// <summary> /// モデルをロードするモジュールを作成する /// </summary> /// <param name="characterModel">ロードするキャラクターモデル</param> /// <param name="coroutineHandler">コルーチンが実行できるハンドラオブジェクト</param> /// <param name="option">オプション</param> /// <param name="onSuccess">成功時のコールバック関数</param> /// <param name="onError">失敗時のコールバック関数</param> public static void Create(CharacterModel characterModel, ICoroutineHandlable coroutineHandler, HubModelDeserializerOption option, Action <IModelLoader> onSuccess, Action <ApiErrorFormat> onError) { CachedLicense?oldCachedLicense = LicenseManager.LoadExistLicense(characterModel.id); if (oldCachedLicense != null && oldCachedLicense.Value.IsAvailable(characterModel)) { var loadModule = new EncryptModelLoad(EncryptionModelFile.ReadBytes); onSuccess(new ModelCachedLoader(oldCachedLicense.Value.downloadLicense, coroutineHandler, UnityThreadQueue.Instance, loadModule)); return; } HubApi.PostDownloadLicense( characterModelId: characterModel.id, onSuccess: (DownloadLicense license) => { // キャッシュに以前のファイルが残っている場合はライセンスの更新だけをしてファイルのダウンロードはしない if (oldCachedLicense != null && oldCachedLicense.Value.IsSameModel(license)) { var cachedLicense = oldCachedLicense.Value; cachedLicense.UpdateDownloadLicense(license); cachedLicense.Save(); var loadModule = new EncryptModelLoad(EncryptionModelFile.ReadBytes); onSuccess(new ModelCachedLoader(license, coroutineHandler, UnityThreadQueue.Instance, loadModule)); return; } // 新しいモデルデータが保存される前に処理するので-1する必要がある var cacheCount = option.MaxCacheCount - 1; if (cacheCount > 0) { LicenseManager.CleanCache(cacheCount); } var saveModule = new EncryptModelSave(EncryptionModelFile.WriteBytes, EncryptionModelFile.DeleteFile); onSuccess(new ModelDownloadLoader(license, saveModule, HubApi.GetDownloadLicenseDownload, option.DownloadTimeout)); }, onError: onError ); }