using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace YooAsset
{
internal abstract class AssetBundleLoaderBase
{
public enum EStatus
{
None = 0,
Succeed,
Failed
}
///
/// 资源包文件信息
///
public BundleInfo MainBundleInfo { private set; get; }
///
/// 引用计数
///
public int RefCount { private set; get; }
///
/// 加载状态
///
public EStatus Status { protected set; get; }
///
/// 最近的错误信息
///
public string LastError { protected set; get; }
///
/// 是否已经销毁
///
public bool IsDestroyed { private set; get; } = false;
private readonly List _providers = new List(100);
internal AssetBundle CacheBundle { set; get; }
public AssetBundleLoaderBase(BundleInfo bundleInfo)
{
MainBundleInfo = bundleInfo;
RefCount = 0;
Status = EStatus.None;
}
///
/// 添加附属的资源提供者
///
public void AddProvider(ProviderBase provider)
{
if (_providers.Contains(provider) == false)
_providers.Add(provider);
}
///
/// 引用(引用计数递加)
///
public void Reference()
{
RefCount++;
}
///
/// 释放(引用计数递减)
///
public void Release()
{
RefCount--;
}
///
/// 轮询更新
///
public abstract void Update();
///
/// 销毁
///
public void Destroy(bool forceDestroy)
{
IsDestroyed = true;
// Check fatal
if (forceDestroy == false)
{
if (RefCount > 0)
throw new Exception($"Bundle file loader ref is not zero : {MainBundleInfo.Bundle.BundleName}");
if (IsDone() == false)
throw new Exception($"Bundle file loader is not done : {MainBundleInfo.Bundle.BundleName}");
}
if (CacheBundle != null)
{
CacheBundle.Unload(true);
CacheBundle = null;
}
}
///
/// 是否完毕(无论成功或失败)
///
public bool IsDone()
{
return Status == EStatus.Succeed || Status == EStatus.Failed;
}
///
/// 是否可以销毁
///
public bool CanDestroy()
{
if (IsDone() == false)
return false;
return RefCount <= 0;
}
///
/// 在满足条件的前提下,销毁所有资源提供者
///
public void TryDestroyAllProviders()
{
if (IsDone() == false)
return;
// 条件1:必须等待所有Provider可以销毁
foreach (var provider in _providers)
{
if (provider.CanDestroy() == false)
return;
}
// 条件2:除了自己没有其它引用
if (RefCount > _providers.Count)
return;
// 销毁所有Providers
foreach (var provider in _providers)
{
provider.Destroy();
}
// 从列表里移除Providers
AssetSystem.RemoveBundleProviders(_providers);
_providers.Clear();
}
///
/// 主线程等待异步操作完毕
///
public abstract void WaitForAsyncComplete();
}
}