using System; using System.Diagnostics; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace YooAsset { public static partial class YooAssets { private static bool _isInitialize = false; private static GameObject _driver = null; private static readonly List _packages = new List(); /// /// 初始化资源系统 /// /// 自定义日志处理 public static void Initialize(ILogger logger = null) { if (_isInitialize) { UnityEngine.Debug.LogWarning($"{nameof(YooAssets)} is initialized !"); return; } if (_isInitialize == false) { YooLogger.Logger = logger; // 创建驱动器 _isInitialize = true; _driver = new UnityEngine.GameObject($"[{nameof(YooAssets)}]"); _driver.AddComponent(); UnityEngine.Object.DontDestroyOnLoad(_driver); YooLogger.Log($"{nameof(YooAssets)} initialize !"); #if DEBUG // 添加远程调试脚本 _driver.AddComponent(); #endif OperationSystem.Initialize(); DownloadSystem.Initialize(); } } /// /// 销毁资源系统 /// public static void Destroy() { if (_isInitialize) { OperationSystem.DestroyAll(); DownloadSystem.DestroyAll(); CacheSystem.ClearAll(); foreach (var package in _packages) { package.DestroyPackage(); } _packages.Clear(); _isInitialize = false; if (_driver != null) GameObject.Destroy(_driver); YooLogger.Log($"{nameof(YooAssets)} destroy all !"); } } /// /// 更新资源系统 /// internal static void Update() { if (_isInitialize) { OperationSystem.Update(); DownloadSystem.Update(); for (int i = 0; i < _packages.Count; i++) { _packages[i].UpdatePackage(); } } } /// /// 创建资源包 /// /// 资源包名称 public static ResourcePackage CreatePackage(string packageName) { if (_isInitialize == false) throw new Exception($"{nameof(YooAssets)} not initialize !"); if (string.IsNullOrEmpty(packageName)) throw new Exception("Package name is null or empty !"); if (HasPackage(packageName)) throw new Exception($"Package {packageName} already existed !"); YooLogger.Log($"Create resource package : {packageName}"); ResourcePackage package = new ResourcePackage(packageName); _packages.Add(package); return package; } /// /// 获取资源包 /// /// 资源包名称 public static ResourcePackage GetPackage(string packageName) { var package = TryGetPackage(packageName); if (package == null) YooLogger.Error($"Not found resource package : {packageName}"); return package; } /// /// 尝试获取资源包 /// /// 资源包名称 public static ResourcePackage TryGetPackage(string packageName) { if (_isInitialize == false) throw new Exception($"{nameof(YooAssets)} not initialize !"); if (string.IsNullOrEmpty(packageName)) throw new Exception("Package name is null or empty !"); foreach (var package in _packages) { if (package.PackageName == packageName) return package; } return null; } /// /// 销毁资源包 /// /// 资源包名称 public static void DestroyPackage(string packageName) { ResourcePackage package = GetPackage(packageName); if (package == null) return; YooLogger.Log($"Destroy resource package : {packageName}"); _packages.Remove(package); package.DestroyPackage(); // 清空缓存 CacheSystem.ClearPackage(packageName); } /// /// 检测资源包是否存在 /// /// 资源包名称 public static bool HasPackage(string packageName) { if (_isInitialize == false) throw new Exception($"{nameof(YooAssets)} not initialize !"); foreach (var package in _packages) { if (package.PackageName == packageName) return true; } return false; } /// /// 开启一个异步操作 /// /// 异步操作对象 public static void StartOperation(GameAsyncOperation operation) { OperationSystem.StartOperation(operation); } #region 系统参数 /// /// 设置下载系统参数,启用断点续传功能文件的最小字节数 /// public static void SetDownloadSystemBreakpointResumeFileSize(int fileBytes) { DownloadSystem.BreakpointResumeFileSize = fileBytes; } /// /// 设置下载系统参数,下载失败后清理文件的HTTP错误码 /// public static void SetDownloadSystemClearFileResponseCode(List codes) { DownloadSystem.ClearFileResponseCodes = codes; } /// /// 设置下载系统参数,自定义的证书认证实例 /// public static void SetDownloadSystemCertificateHandler(UnityEngine.Networking.CertificateHandler instance) { DownloadSystem.CertificateHandlerInstance = instance; } /// /// 设置下载系统参数,自定义下载请求 /// public static void SetDownloadSystemUnityWebRequest(DownloadRequestDelegate requestDelegate) { DownloadSystem.RequestDelegate = requestDelegate; } /// /// 设置下载系统参数,网络重定向次数(Unity引擎默认值32) /// 注意:不支持设置为负值 /// public static void SetDownloadSystemRedirectLimit(int redirectLimit) { if (redirectLimit < 0) { YooLogger.Warning($"Invalid param value : {redirectLimit}"); return; } DownloadSystem.RedirectLimit = redirectLimit; } /// /// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒) /// public static void SetOperationSystemMaxTimeSlice(long milliseconds) { if (milliseconds < 10) { milliseconds = 10; YooLogger.Warning($"MaxTimeSlice minimum value is 10 milliseconds."); } OperationSystem.MaxTimeSlice = milliseconds; } /// /// 设置缓存系统参数,已经缓存文件的校验等级 /// public static void SetCacheSystemCachedFileVerifyLevel(EVerifyLevel verifyLevel) { CacheSystem.InitVerifyLevel = verifyLevel; } /// /// 设置缓存系统参数,禁用缓存在WebGL平台 /// public static void SetCacheSystemDisableCacheOnWebGL() { CacheSystem.DisableUnityCacheOnWebGL = true; } #endregion #region 调试信息 internal static DebugReport GetDebugReport() { DebugReport report = new DebugReport(); report.FrameCount = Time.frameCount; foreach (var package in _packages) { var packageData = package.GetDebugPackageData(); report.PackageDatas.Add(packageData); } return report; } #endregion } }