OvertakingLegend/Assets/YooAsset/Runtime/YooAssetManager.cs

301 lines
11 KiB
C#
Raw Normal View History

2025-03-24 03:08:22 +00:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using YooAsset;
/// <summary>
/// YooAsset<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public partial class YooAssetManager : MBSingletonManager<YooAssetManager>
{
/// <summary>
/// 1MB
/// </summary>
private const float OneMB = 1048576f;
/// <summary>
/// <20><EFBFBD><E6B1BE>
/// </summary>
private string packageVersion = "1.0.0";
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
/// </summary>
private Dictionary<string, ResourcePackage> packagesDic = new Dictionary<string, ResourcePackage>();
/// <summary>
/// <20><><EFBFBD>ػص<D8BB>
/// </summary>
private Dictionary<string, YooAssetDownloadEvent> downLoadCallBackDic = new Dictionary<string, YooAssetDownloadEvent>();
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>
/// </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<65><74>ʼ<EFBFBD><CABC>
/// </summary>
/// <param name="intSucCall"></param>
public IEnumerator YooAssetInit(string packageName)
{
YooAssetConfig yooConfig = Resources.Load<YooAssetConfig>(packageName + "YooAssetConfig");
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դϵͳ
YooAssets.Initialize();
// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>Դ<EFBFBD><D4B4>
ResourcePackage package = YooAssets.CreatePackage(yooConfig.packageName);
packagesDic.Add(packageName, package);
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD>Դ<EFBFBD><D4B4>ΪĬ<CEAA>ϵ<EFBFBD><CFB5><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>YooAssets<74><73><EFBFBD>ؼ<EFBFBD><D8BC>ؽӿڼ<D3BF><DABC>ظ<EFBFBD><D8B8><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
//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>
/// <20><EFBFBD><E0BCAD>ģ<EFBFBD><C4A3>ģʽ
/// </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>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
/// </summary>
private IEnumerator InitOfflinePackage(ResourcePackage package, YooAssetConfig yooConfig)
{
var initParameters = new OfflinePlayModeParameters();
yield return package.InitializeAsync(initParameters);
StartCoroutine(UpdatePackageVersion(yooConfig));
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
/// </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("<22><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>");
}
else
{
Debug.LogError($"<22><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʧ<EFBFBD>ܣ<EFBFBD>{initOperation.Error}");
}
StartCoroutine(UpdatePackageVersion(yooConfig));
}
/// <summary>
/// Web<65><62><EFBFBD><EFBFBD>ģʽ
/// </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("<22><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>");
}
else
{
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
Debug.LogError($"<22><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʧ<EFBFBD>ܣ<EFBFBD>{initOperation.Error}");
}
StartCoroutine(UpdatePackageVersion(yooConfig));
}
/// <summary>
/// <20>Ƿ񴴽<C7B7><F1B4B4BD>ð<EFBFBD>
/// </summary>
public bool IsCreatePackage(string packageName)
{
if (packagesDic.ContainsKey(packageName))
{
return true;
}
return false;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
private IEnumerator UpdatePackageVersion(YooAssetConfig yooConfig)
{
var package = YooAssets.GetPackage(yooConfig.packageName);
var operation = package.UpdatePackageVersionAsync();
yield return operation;
if (operation.Status == EOperationStatus.Succeed)
{
//<2F><><EFBFBD>³ɹ<C2B3>
packageVersion = operation.PackageVersion;
StartCoroutine(UpdatePackageManifest(yooConfig));
Debug.Log($"Updated package Version : {packageVersion}");
}
else
{
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
Debug.LogError(operation.Error);
}
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
private IEnumerator UpdatePackageManifest(YooAssetConfig yooConfig)
{
// <20><><EFBFBD>³ɹ<C2B3><C9B9><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD>´γ<C2B4>ʼ<EFBFBD><CABC><EFBFBD>İ汾<C4B0><E6B1BE>
// Ҳ<><D2B2><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>operation.SavePackageVersion()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool savePackageVersion = true;
var package = YooAssets.GetPackage(yooConfig.packageName);
var operation = package.UpdatePackageManifestAsync(packageVersion, savePackageVersion);
yield return operation;
if (operation.Status == EOperationStatus.Succeed)
{
//<2F><><EFBFBD>³ɹ<C2B3>
StartCoroutine(Download(yooConfig));
}
else
{
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
Debug.LogError(operation.Error);
}
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>
/// </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);
//û<><C3BB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Դ
if (downloader.TotalDownloadCount == 0)
{
downLoadCallBackDic[yooConfig.packageName].succeedCallBack?.Invoke();
yield break;
}
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
int totalDownloadCount = downloader.TotalDownloadCount;
long totalDownloadBytes = downloader.TotalDownloadBytes;
//ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
downloader.OnDownloadErrorCallback = OnDownloadErrorFunction;
downloader.OnDownloadProgressCallback = OnDownloadProgressUpdateFunction;
downloader.OnStartDownloadFileCallback = OnStartDownloadFileFunction;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
downloader.BeginDownload();
yield return downloader;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>
if (downloader.Status == EOperationStatus.Succeed)
{
//<2F><><EFBFBD>سɹ<D8B3>
downLoadCallBackDic[yooConfig.packageName].succeedCallBack?.Invoke();
downLoadCallBackDic.Remove(yooConfig.packageName);
Debug.Log("<22><><EFBFBD>سɹ<D8B3>!");
}
else
{
downLoadCallBackDic[yooConfig.packageName].failCallBack?.Invoke();
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
Debug.Log("<22><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>!");
}
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="fileName"></param>
/// <param name="sizeBytes"></param>
private void OnStartDownloadFileFunction(string fileName, long sizeBytes)
{
Debug.Log($"<22><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>: {fileName}, <20>ļ<EFBFBD><C4BC><EFBFBD>С: {sizeBytes / 1048576f:F1} MB");
}
/// <summary>
/// <20><><EFBFBD>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="totalDownloadCount"><3E>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="currentDownloadCount"><3E><>ǰ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="totalDownloadBytes"><3E>ܵ<EFBFBD><DCB5>ֽ<EFBFBD><D6BD><EFBFBD></param>
/// <param name="currentDownloadBytes"><3E><>ǰ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ֽ<EFBFBD><D6BD><EFBFBD></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($"<22><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>: {progress * 100:F2}%, <20><>ǰ<EFBFBD><C7B0>С: {currentSizeMB} MB, <20>ܴ<EFBFBD>С: {totalSizeMB} MB");
}
/// <summary>
/// <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="fileName"><3E>ļ<EFBFBD><C4BC><EFBFBD></param>
/// <param name="error"><3E><><EFBFBD><EFBFBD></param>
private void OnDownloadErrorFunction(string fileName, string error)
{
Debug.LogError($"<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>: {fileName} ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {error}");
}
}