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