| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | 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<ResourcePackage> _packages = new List<ResourcePackage>();		/// <summary>		/// 初始化资源系统		/// </summary>		/// <param name="logger">自定义日志处理</param>		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<YooAssetsDriver>();				UnityEngine.Object.DontDestroyOnLoad(_driver);				YooLogger.Log($"{nameof(YooAssets)} initialize !");#if DEBUG				// 添加远程调试脚本				_driver.AddComponent<RemoteDebuggerInRuntime>();#endif				OperationSystem.Initialize();				DownloadSystem.Initialize();			}		}		/// <summary>		/// 销毁资源系统		/// </summary>		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 !");			}		}		/// <summary>		/// 更新资源系统		/// </summary>		internal static void Update()		{			if (_isInitialize)			{				OperationSystem.Update();				DownloadSystem.Update();				for (int i = 0; i < _packages.Count; i++)				{					_packages[i].UpdatePackage();				}			}		}		/// <summary>		/// 创建资源包		/// </summary>		/// <param name="packageName">资源包名称</param>		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;		}		/// <summary>		/// 获取资源包		/// </summary>		/// <param name="packageName">资源包名称</param>		public static ResourcePackage GetPackage(string packageName)		{			var package = TryGetPackage(packageName);			if (package == null)				YooLogger.Error($"Not found resource package : {packageName}");			return package;		}		/// <summary>		/// 尝试获取资源包		/// </summary>		/// <param name="packageName">资源包名称</param>		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;		}		/// <summary>		/// 销毁资源包		/// </summary>		/// <param name="packageName">资源包名称</param>		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);		}		/// <summary>		/// 检测资源包是否存在		/// </summary>		/// <param name="packageName">资源包名称</param>		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;		}		/// <summary>		/// 开启一个异步操作		/// </summary>		/// <param name="operation">异步操作对象</param>		public static void StartOperation(GameAsyncOperation operation)		{			OperationSystem.StartOperation(operation);		}		#region 系统参数		/// <summary>		/// 设置下载系统参数,启用断点续传功能文件的最小字节数		/// </summary>		public static void SetDownloadSystemBreakpointResumeFileSize(int fileBytes)		{			DownloadSystem.BreakpointResumeFileSize = fileBytes;		}		/// <summary>		/// 设置下载系统参数,下载失败后清理文件的HTTP错误码		/// </summary>		public static void SetDownloadSystemClearFileResponseCode(List<long> codes)		{			DownloadSystem.ClearFileResponseCodes = codes;		}		/// <summary>		/// 设置下载系统参数,自定义的证书认证实例		/// </summary>		public static void SetDownloadSystemCertificateHandler(UnityEngine.Networking.CertificateHandler instance)		{			DownloadSystem.CertificateHandlerInstance = instance;		}		/// <summary>		/// 设置下载系统参数,自定义下载请求		/// </summary>		public static void SetDownloadSystemUnityWebRequest(DownloadRequestDelegate requestDelegate)		{			DownloadSystem.RequestDelegate = requestDelegate;		}		/// <summary>		/// 设置下载系统参数,网络重定向次数(Unity引擎默认值32)		/// 注意:不支持设置为负值		/// </summary>		public static void SetDownloadSystemRedirectLimit(int redirectLimit)		{			if (redirectLimit < 0)			{				YooLogger.Warning($"Invalid param value : {redirectLimit}");				return;			}			DownloadSystem.RedirectLimit = redirectLimit;		}		/// <summary>		/// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)		/// </summary>		public static void SetOperationSystemMaxTimeSlice(long milliseconds)		{			if (milliseconds < 10)			{				milliseconds = 10;				YooLogger.Warning($"MaxTimeSlice minimum value is 10 milliseconds.");			}			OperationSystem.MaxTimeSlice = milliseconds;		}		/// <summary>		/// 设置缓存系统参数,已经缓存文件的校验等级		/// </summary>		public static void SetCacheSystemCachedFileVerifyLevel(EVerifyLevel verifyLevel)		{			CacheSystem.InitVerifyLevel = verifyLevel;		}		/// <summary>		/// 设置缓存系统参数,禁用缓存在WebGL平台		/// </summary>		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	}}
 |