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;
}
}
}