using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; namespace AssetBundleHub { /// /// Assetのロードと解放をグループ化するための入れ物 /// まとめてロード、まとめて解放する。 /// public class AssetContainer : IDisposable { readonly ABAssetRepository assetRepository; bool isDisposed = false; HashSet requestedAssets = new HashSet(); public bool ignoreRefCount = false; public AssetContainer(ABAssetRepository assetRepository) { this.assetRepository = assetRepository; } /// /// 対象のAssetをロード /// /// ビルド時に設定したaddressableNames /// キャンセルしても参照カウントはするのでUnload呼ぶ必要あり public async UniTask LoadAllAsync(List assetNames, CancellationToken cancellationToken = default(CancellationToken)) { if (isDisposed) { throw new ObjectDisposedException("AssetContainer already disposed"); } var tasks = new List>(); foreach (var assetName in assetNames) { if (requestedAssets.Add(assetName)) { tasks.Add(assetRepository.LoadAsync(assetName, cancellationToken)); } } await UniTask.WhenAll(tasks); } /// /// 全てのリクエストしたAssetを解放する。 /// ロード中だと解放がスキップされるので注意 /// public void Dispose() { if (isDisposed) { return; } foreach (var assetName in requestedAssets) { assetRepository.Unload(assetName, ignoreRefCount); } isDisposed = true; } } }