OvertakingLegend/Assets/YooAsset/Runtime/YooAssetManager.cs

301 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using YooAsset;
/// <summary>
/// YooAsset管理器
/// </summary>
public partial class YooAssetManager : MBSingletonManager<YooAssetManager>
{
/// <summary>
/// 1MB
/// </summary>
private const float OneMB = 1048576f;
/// <summary>
/// 版本号
/// </summary>
private string packageVersion = "1.0.0";
/// <summary>
/// 所有资源包
/// </summary>
private Dictionary<string, ResourcePackage> packagesDic = new Dictionary<string, ResourcePackage>();
/// <summary>
/// 下载回调
/// </summary>
private Dictionary<string, YooAssetDownloadEvent> downLoadCallBackDic = new Dictionary<string, YooAssetDownloadEvent>();
/// <summary>
/// 初始化
/// </summary>
public void Init(string packageName, UnityAction<float,string,string> 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));
}
/// <summary>
/// YooAsset初始化
/// </summary>
/// <param name="intSucCall"></param>
public IEnumerator YooAssetInit(string packageName)
{
YooAssetConfig yooConfig = Resources.Load<YooAssetConfig>(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;
}
/// <summary>
/// 编辑器模拟模式
/// </summary>
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));
}
/// <summary>
/// 单机运行模式
/// </summary>
private IEnumerator InitOfflinePackage(ResourcePackage package, YooAssetConfig yooConfig)
{
var initParameters = new OfflinePlayModeParameters();
yield return package.InitializeAsync(initParameters);
StartCoroutine(UpdatePackageVersion(yooConfig));
}
/// <summary>
/// 联机运行模式
/// </summary>
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));
}
/// <summary>
/// Web运行模式
/// </summary>
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));
}
/// <summary>
/// 是否创建该包
/// </summary>
public bool IsCreatePackage(string packageName)
{
if (packagesDic.ContainsKey(packageName))
{
return true;
}
return false;
}
/// <summary>
/// 检查版本
/// </summary>
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);
}
}
/// <summary>
/// 获取补丁清单
/// </summary>
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);
}
}
/// <summary>
/// 开始下载补丁
/// </summary>
/// <returns></returns>
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("下载失败!");
}
}
/// <summary>
/// 开始下载文件监听
/// </summary>
/// <param name="fileName"></param>
/// <param name="sizeBytes"></param>
private void OnStartDownloadFileFunction(string fileName, long sizeBytes)
{
Debug.Log($"开始下载文件: {fileName}, 文件大小: {sizeBytes / 1048576f:F1} MB");
}
/// <summary>
/// 更新补丁数监听
/// </summary>
/// <param name="totalDownloadCount">总的下载文件数量</param>
/// <param name="currentDownloadCount">当前已经下载的文件数量</param>
/// <param name="totalDownloadBytes">总的字节数</param>
/// <param name="currentDownloadBytes">当前已经下载的字节数</param>
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");
}
/// <summary>
/// 下载出错监听
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="error">错误</param>
private void OnDownloadErrorFunction(string fileName, string error)
{
Debug.LogError($"下载文件: {fileName} 时发生错误: {error}");
}
}