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<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}");
|
|||
|
|
}
|
|||
|
|
}
|