/// <summary> /// Addressable を初期化します /// </summary> public AddressablesControllerHandle InitializeAsync() { var source = new TaskCompletionSource <AddressablesControllerResultCode>(); var isFailure = false; m_isInitialized = false; AddressablesUtils.ResetInitializationFlag(); void OnFailure(AddressablesControllerResultCode resultCode) { AddressablesUtils.ResetInitializationFlag(); source.TrySetResult(resultCode); } void OnComplete(AsyncOperationHandle <IResourceLocator> handle) { m_exceptionHandler -= ExceptionHandler; if (isFailure) { OnFailure(AddressablesControllerResultCode.FAILURE_CANNOT_CONNECTION); return; } if (handle.Status != AsyncOperationStatus.Succeeded) { OnFailure(AddressablesControllerResultCode.FAILURE_UNKNOWN); return; } m_isInitialized = true; source.TrySetResult(AddressablesControllerResultCode.SUCCESS); } // InternalId を変換する処理を登録します Addressables.InternalIdTransformFunc = location => InternalIdTransformFunc(location); var result = Addressables.InitializeAsync(); result.Completed += handle => OnComplete(handle); // Addressables.InitializeAsync の呼び出し前にコールバックを設定すると // Addressables.InitializeAsync の中で // ResourceManager.ExceptionHandler が上書きされてしまうため // InitializeAsync の呼び出し後にコールバックを設定しています ResourceManager.ExceptionHandler = CatchException; // リモートカタログのダウンロードに失敗した場合などに呼び出されます void ExceptionHandler(Exception exception) { isFailure = true; m_exceptionHandler -= ExceptionHandler; } m_exceptionHandler += ExceptionHandler; var controllerHandle = new AddressablesControllerHandle(result, source.Task); return(controllerHandle); }
/// <summary> /// <para>指定されたアドレスもしくはラベルに紐づくアセットバンドルを事前にダウンロードします</para> /// <para>autoReleaseHandle を true にすると、ダウンロードしたアセットバンドルをキャッシュに保存してメモリからは解放します</para> /// <para>autoReleaseHandle を false にすると、ダウンロードしたアセットバンドルはメモリに残り続けます</para> /// <para>ダウンロードしたアセットバンドルに含まれるアセットをすぐに使う場合は false を、</para> /// <para>すぐに使わない場合は true を指定すると効率的です</para> /// </summary> public AddressablesControllerHandle DownloadDependenciesAsync ( object addressOrLabel, bool autoReleaseHandle ) { var source = new TaskCompletionSource <AddressablesControllerResultCode>(); if (!m_isInitialized) { source.TrySetResult(AddressablesControllerResultCode.FAILURE_NOT_INITIALIZED); return(new AddressablesControllerHandle(source.Task)); } var isFailure = false; var isNotExistKey = false; void OnComplete(AsyncOperationHandle handle) { m_exceptionHandler -= ExceptionHandler; if (isFailure) { var resultCode = isNotExistKey ? AddressablesControllerResultCode.FAILURE_KEY_NOT_EXIST : AddressablesControllerResultCode.FAILURE_CANNOT_CONNECTION ; source.TrySetResult(resultCode); return; } if (handle.Status != AsyncOperationStatus.Succeeded) { source.TrySetResult(AddressablesControllerResultCode.FAILURE_UNKNOWN); return; } source.TrySetResult(AddressablesControllerResultCode.SUCCESS); } void ExceptionHandler(Exception exception) { isFailure = true; isNotExistKey = exception.Message.Contains(nameof(InvalidKeyException)); m_exceptionHandler -= ExceptionHandler; } m_exceptionHandler += ExceptionHandler; var result = Addressables.DownloadDependenciesAsync(addressOrLabel, autoReleaseHandle); result.Completed += handle => OnComplete(handle); var controllerHandle = new AddressablesControllerHandle(result, source.Task); return(controllerHandle); }
/// <summary> /// <para>最新のリモートカタログを取得します</para> /// <para>catalogs に null を指定すると、すべてのリモートカタログを更新します</para> /// <para>特定のリモートカタログのみ更新したい場合は catalogs を指定します</para> /// </summary> public AddressablesControllerHandle UpdateCatalogs(IEnumerable <string> catalogs) { var source = new TaskCompletionSource <AddressablesControllerResultCode>(); if (!m_isInitialized) { source.TrySetResult(AddressablesControllerResultCode.FAILURE_NOT_INITIALIZED); return(new AddressablesControllerHandle(source.Task)); } var isFailure = false; void OnComplete(AsyncOperationHandle handle) { m_exceptionHandler -= ExceptionHandler; if (isFailure) { source.TrySetResult(AddressablesControllerResultCode.FAILURE_CANNOT_CONNECTION); return; } if (handle.Status != AsyncOperationStatus.Succeeded) { source.TrySetResult(AddressablesControllerResultCode.FAILURE_UNKNOWN); return; } source.TrySetResult(AddressablesControllerResultCode.SUCCESS); } void ExceptionHandler(Exception exception) { isFailure = true; m_exceptionHandler -= ExceptionHandler; } m_exceptionHandler += ExceptionHandler; var result = Addressables.UpdateCatalogs(catalogs); result.Completed += handle => OnComplete(handle); var controllerHandle = new AddressablesControllerHandle(result, source.Task); return(controllerHandle); }