301 lines
11 KiB
C#
301 lines
11 KiB
C#
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}");
|
||
}
|
||
}
|