using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using YooAsset;
///
/// YooAsset管理器
///
public partial class YooAssetManager : MBSingletonManager
{
///
/// 1MB
///
private const float OneMB = 1048576f;
///
/// 版本号
///
private string packageVersion = "1.0.0";
///
/// 所有资源包
///
private Dictionary packagesDic = new Dictionary();
///
/// 下载回调
///
private Dictionary downLoadCallBackDic = new Dictionary();
///
/// 初始化
///
public void Init(string packageName, UnityAction downLoadCallBack= null,UnityAction succeedCallBack= null, UnityAction failCallBack = null)
{
YooAssetDownloadEvent yooAssetDownloadEvent = new YooAssetDownloadEvent();
yooAssetDownloadEvent.downLoadCallBack = downLoadCallBack;
yooAssetDownloadEvent.succeedCallBack = succeedCallBack;
yooAssetDownloadEvent.failCallBack = failCallBack;
this.downLoadCallBackDic.Add(packageName, yooAssetDownloadEvent);
StartCoroutine(YooAssetInit(packageName));
}
///
/// YooAsset初始化
///
///
public IEnumerator YooAssetInit(string packageName)
{
YooAssetConfig yooConfig = Resources.Load(packageName + "YooAssetConfig");
// 初始化资源系统
YooAssets.Initialize();
// 创建默认的资源包
ResourcePackage package = YooAssets.CreatePackage(yooConfig.packageName);
packagesDic.Add(packageName, package);
// 设置该资源包为默认的资源包,可以使用YooAssets相关加载接口加载该资源包内容。
//YooAssets.SetDefaultPackage(package);
YooAssets.SetCacheSystemDisableCacheOnWebGL();
switch (yooConfig.playMode)
{
case EPlayMode.EditorSimulateMode:
StartCoroutine(InitEditorPackage(package, yooConfig));
break;
case EPlayMode.OfflinePlayMode:
StartCoroutine(InitOfflinePackage(package, yooConfig));
break;
case EPlayMode.HostPlayMode:
StartCoroutine(InitHostPackage(package, yooConfig));
break;
case EPlayMode.WebPlayMode:
StartCoroutine(InitWebPackage(package, yooConfig));
break;
}
yield return null;
}
///
/// 编辑器模拟模式
///
private IEnumerator InitEditorPackage(ResourcePackage package, YooAssetConfig yooConfig)
{
var initParameters = new EditorSimulateModeParameters();
var simulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(EDefaultBuildPipeline.BuiltinBuildPipeline, yooConfig.packageName);
initParameters.SimulateManifestFilePath = simulateManifestFilePath;
yield return package.InitializeAsync(initParameters);
StartCoroutine(UpdatePackageVersion(yooConfig));
}
///
/// 单机运行模式
///
private IEnumerator InitOfflinePackage(ResourcePackage package, YooAssetConfig yooConfig)
{
var initParameters = new OfflinePlayModeParameters();
yield return package.InitializeAsync(initParameters);
StartCoroutine(UpdatePackageVersion(yooConfig));
}
///
/// 联机运行模式
///
private IEnumerator InitHostPackage(ResourcePackage package, YooAssetConfig yooConfig)
{
var initParameters = new HostPlayModeParameters();
initParameters.BuildinQueryServices = new GameQueryServices();
initParameters.DecryptionServices = new FileOffsetDecryption();
#if UNITY_STANDALONE_WIN
initParameters.RemoteServices = new RemoteServices(yooConfig.androidAndWinNetPath, yooConfig.androidAndWinNetPath);
#elif UNITY_ANDROID
initParameters.RemoteServices = new RemoteServices(yooConfig.androidAndWinNetPath, yooConfig.androidAndWinNetPath);
#elif UNITY_IOS
initParameters.RemoteServices = new RemoteServices(yooConfig.iOSNetPath, yooConfig.iOSNetPath);
#endif
var initOperation = package.InitializeAsync(initParameters);
yield return initOperation;
if (initOperation.Status == EOperationStatus.Succeed)
{
Debug.Log("资源包初始化成功");
}
else
{
Debug.LogError($"资源包初始化失败:{initOperation.Error}");
}
StartCoroutine(UpdatePackageVersion(yooConfig));
}
///
/// Web运行模式
///
private IEnumerator InitWebPackage(ResourcePackage package, YooAssetConfig yooConfig)
{
var initParameters = new WebPlayModeParameters();
initParameters.BuildinQueryServices = new GameQueryServices();
initParameters.RemoteServices = new RemoteServices(yooConfig.webNetPath, yooConfig.webNetPath);
var initOperation = package.InitializeAsync(initParameters);
yield return initOperation;
if (initOperation.Status == EOperationStatus.Succeed)
{
Debug.Log("资源包初始化成功!");
}
else
{
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
Debug.LogError($"资源包初始化失败:{initOperation.Error}");
}
StartCoroutine(UpdatePackageVersion(yooConfig));
}
///
/// 是否创建该包
///
public bool IsCreatePackage(string packageName)
{
if (packagesDic.ContainsKey(packageName))
{
return true;
}
return false;
}
///
/// 检查版本
///
private IEnumerator UpdatePackageVersion(YooAssetConfig yooConfig)
{
var package = YooAssets.GetPackage(yooConfig.packageName);
var operation = package.UpdatePackageVersionAsync();
yield return operation;
if (operation.Status == EOperationStatus.Succeed)
{
//更新成功
packageVersion = operation.PackageVersion;
StartCoroutine(UpdatePackageManifest(yooConfig));
Debug.Log($"Updated package Version : {packageVersion}");
}
else
{
//更新失败
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
Debug.LogError(operation.Error);
}
}
///
/// 获取补丁清单
///
private IEnumerator UpdatePackageManifest(YooAssetConfig yooConfig)
{
// 更新成功后自动保存版本号,作为下次初始化的版本。
// 也可以通过operation.SavePackageVersion()方法保存。
bool savePackageVersion = true;
var package = YooAssets.GetPackage(yooConfig.packageName);
var operation = package.UpdatePackageManifestAsync(packageVersion, savePackageVersion);
yield return operation;
if (operation.Status == EOperationStatus.Succeed)
{
//更新成功
StartCoroutine(Download(yooConfig));
}
else
{
//更新失败
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
Debug.LogError(operation.Error);
}
}
///
/// 开始下载补丁
///
///
private IEnumerator Download(YooAssetConfig yooConfig)
{
int downloadingMaxNum = 10;
int failedTryAgain = 3;
var package = YooAssets.GetPackage(yooConfig.packageName);
var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
//没有需要下载的资源
if (downloader.TotalDownloadCount == 0)
{
downLoadCallBackDic[yooConfig.packageName].succeedCallBack?.Invoke();
yield break;
}
//需要下载的文件总数和总大小
int totalDownloadCount = downloader.TotalDownloadCount;
long totalDownloadBytes = downloader.TotalDownloadBytes;
//注册回调方法
downloader.OnDownloadErrorCallback = OnDownloadErrorFunction;
downloader.OnDownloadProgressCallback = OnDownloadProgressUpdateFunction;
downloader.OnStartDownloadFileCallback = OnStartDownloadFileFunction;
//开启下载
downloader.BeginDownload();
yield return downloader;
//检测下载结果
if (downloader.Status == EOperationStatus.Succeed)
{
//下载成功
downLoadCallBackDic[yooConfig.packageName].succeedCallBack?.Invoke();
downLoadCallBackDic.Remove(yooConfig.packageName);
Debug.Log("下载成功!");
}
else
{
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
//下载失败
Debug.Log("下载失败!");
}
}
///
/// 开始下载文件监听
///
///
///
private void OnStartDownloadFileFunction(string fileName, long sizeBytes)
{
Debug.Log($"开始下载文件: {fileName}, 文件大小: {sizeBytes / 1048576f:F1} MB");
}
///
/// 更新补丁数监听
///
/// 总的下载文件数量
/// 当前已经下载的文件数量
/// 总的字节数
/// 当前已经下载的字节数
private void OnDownloadProgressUpdateFunction(int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes,string packageName)
{
float progress = (float)currentDownloadCount / totalDownloadCount;
string currentSizeMB = (currentDownloadBytes / 1048576f).ToString("F1");
string totalSizeMB = (totalDownloadBytes / 1048576f).ToString("F1");
downLoadCallBackDic[packageName].downLoadCallBack?.Invoke(progress, currentSizeMB, totalSizeMB);
Debug.Log($"下载进度: {progress * 100:F2}%, 当前大小: {currentSizeMB} MB, 总大小: {totalSizeMB} MB");
}
///
/// 下载出错监听
///
/// 文件名
/// 错误
private void OnDownloadErrorFunction(string fileName, string error)
{
Debug.LogError($"下载文件: {fileName} 时发生错误: {error}");
}
}