diff --git a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs index 11f5cab9..f187d0d5 100644 --- a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs +++ b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs @@ -93,7 +93,7 @@ internal virtual void InternalWaitForAsyncComplete() throw new System.NotImplementedException(this.GetType().Name); } - internal string GetPackageName() + public string GetPackageName() { return _packageName; } @@ -191,4 +191,4 @@ void IEnumerator.Reset() private TaskCompletionSource _taskCompletionSource; #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs b/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs index 5638d20c..8b281bb7 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Handle/HandleBase.cs @@ -15,6 +15,14 @@ internal HandleBase(ProviderOperation provider) } internal abstract void InvokeCallback(); + /// + /// 是否成功 + /// + public bool IsSucceed + { + get { return IsDone && Status == EOperationStatus.Succeed; } + } + /// /// 获取资源信息 /// @@ -158,4 +166,4 @@ object IEnumerator.Current } #endregion } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs index f713f1e0..6a01929c 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/DownloaderOperation.cs @@ -15,10 +15,10 @@ private enum ESteps private const int MAX_LOADER_COUNT = 64; - public delegate void OnDownloadOver(bool isSucceed); - public delegate void OnDownloadProgress(int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes); - public delegate void OnDownloadError(string fileName, string error); - public delegate void OnStartDownloadFile(string fileName, long sizeBytes); + public delegate void OnDownloadOver(string packageName, bool isSucceed); + public delegate void OnDownloadProgress(string packageName, int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes); + public delegate void OnDownloadError(string packageName, string fileName, string error); + public delegate void OnStartDownloadFile(string packageName, string fileName, long sizeBytes); private readonly string _packageName; private readonly int _downloadingMaxNumber; @@ -160,7 +160,7 @@ internal override void InternalOnUpdate() _lastDownloadBytes = downloadBytes; _lastDownloadCount = _cachedDownloadCount; Progress = (float)_lastDownloadBytes / TotalDownloadBytes; - OnDownloadProgressCallback?.Invoke(TotalDownloadCount, _lastDownloadCount, TotalDownloadBytes, _lastDownloadBytes); + OnDownloadProgressCallback?.Invoke(GetPackageName(), TotalDownloadCount, _lastDownloadCount, TotalDownloadBytes, _lastDownloadBytes); } // 动态创建新的下载器到最大数量限制 @@ -177,7 +177,7 @@ internal override void InternalOnUpdate() var downloader = bundleInfo.CreateDownloader(_failedTryAgain, _timeout); _downloaders.Add(downloader); _bundleInfoList.RemoveAt(index); - OnStartDownloadFileCallback?.Invoke(bundleInfo.Bundle.BundleName, bundleInfo.Bundle.FileSize); + OnStartDownloadFileCallback?.Invoke(GetPackageName(), bundleInfo.Bundle.BundleName, bundleInfo.Bundle.FileSize); } } @@ -191,15 +191,15 @@ internal override void InternalOnUpdate() _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"Failed to download file : {bundleName}"; - OnDownloadErrorCallback?.Invoke(bundleName, failedDownloader.Error); - OnDownloadOverCallback?.Invoke(false); + OnDownloadErrorCallback?.Invoke(GetPackageName(), bundleName, failedDownloader.Error); + OnDownloadOverCallback?.Invoke(GetPackageName(), false); } else { // 结算成功 _steps = ESteps.Done; Status = EOperationStatus.Succeed; - OnDownloadOverCallback?.Invoke(true); + OnDownloadOverCallback?.Invoke(GetPackageName(), true); } } } @@ -361,4 +361,4 @@ internal static ResourceImporterOperation CreateEmptyImporter(string packageName return operation; } } -} \ No newline at end of file +} diff --git a/Assets/YooAsset/Runtime/Utility/YooUtility.cs b/Assets/YooAsset/Runtime/Utility/YooUtility.cs index 1f12aa62..57132f2f 100644 --- a/Assets/YooAsset/Runtime/Utility/YooUtility.cs +++ b/Assets/YooAsset/Runtime/Utility/YooUtility.cs @@ -1,377 +1,87 @@ -using System; -using System.IO; -using System.Security.Cryptography; -using System.Text; +using System; +using System.Diagnostics; namespace YooAsset { /// - /// 路径工具类 + /// 自定义日志处理 /// - internal static class PathUtility + public interface ILogger { - /// - /// 路径归一化 - /// 注意:替换为Linux路径格式 - /// - public static string RegularPath(string path) - { - return path.Replace('\\', '/').Replace("\\", "/"); - } - - /// - /// 移除路径里的后缀名 - /// - public static string RemoveExtension(string str) - { - if (string.IsNullOrEmpty(str)) - return str; - - int index = str.LastIndexOf('.'); - if (index == -1) - return str; - else - return str.Remove(index); //"assets/config/test.unity3d" --> "assets/config/test" - } - - /// - /// 合并路径 - /// - public static string Combine(string path1, string path2) - { - return StringUtility.Format("{0}/{1}", path1, path2); - } - - /// - /// 合并路径 - /// - public static string Combine(string path1, string path2, string path3) - { - return StringUtility.Format("{0}/{1}/{2}", path1, path2, path3); - } - - /// - /// 合并路径 - /// - public static string Combine(string path1, string path2, string path3, string path4) - { - return StringUtility.Format("{0}/{1}/{2}/{3}", path1, path2, path3, path4); - } - } - - /// - /// 字符串工具类 - /// - internal static class StringUtility - { - [ThreadStatic] - private static StringBuilder _cacheBuilder = new StringBuilder(2048); - - public static string Format(string format, object arg0) - { - if (string.IsNullOrEmpty(format)) - throw new ArgumentNullException(); - - _cacheBuilder.Length = 0; - _cacheBuilder.AppendFormat(format, arg0); - return _cacheBuilder.ToString(); - } - public static string Format(string format, object arg0, object arg1) - { - if (string.IsNullOrEmpty(format)) - throw new ArgumentNullException(); - - _cacheBuilder.Length = 0; - _cacheBuilder.AppendFormat(format, arg0, arg1); - return _cacheBuilder.ToString(); - } - public static string Format(string format, object arg0, object arg1, object arg2) - { - if (string.IsNullOrEmpty(format)) - throw new ArgumentNullException(); - - _cacheBuilder.Length = 0; - _cacheBuilder.AppendFormat(format, arg0, arg1, arg2); - return _cacheBuilder.ToString(); - } - public static string Format(string format, params object[] args) - { - if (string.IsNullOrEmpty(format)) - throw new ArgumentNullException(); - - if (args == null) - throw new ArgumentNullException(); - - _cacheBuilder.Length = 0; - _cacheBuilder.AppendFormat(format, args); - return _cacheBuilder.ToString(); - } - } - - /// - /// 文件工具类 - /// - internal static class FileUtility - { - /// - /// 读取文件的文本数据 - /// - public static string ReadAllText(string filePath) - { - if (File.Exists(filePath) == false) - return null; - return File.ReadAllText(filePath, Encoding.UTF8); - } - - /// - /// 读取文件的字节数据 - /// - public static byte[] ReadAllBytes(string filePath) - { - if (File.Exists(filePath) == false) - return null; - return File.ReadAllBytes(filePath); - } - - /// - /// 写入文本数据(会覆盖指定路径的文件) - /// - public static void WriteAllText(string filePath, string content) - { - // 创建文件夹路径 - CreateFileDirectory(filePath); - - byte[] bytes = Encoding.UTF8.GetBytes(content); - File.WriteAllBytes(filePath, bytes); //避免写入BOM标记 - } - - /// - /// 写入字节数据(会覆盖指定路径的文件) - /// - public static void WriteAllBytes(string filePath, byte[] data) - { - // 创建文件夹路径 - CreateFileDirectory(filePath); - - File.WriteAllBytes(filePath, data); - } - - /// - /// 创建文件的文件夹路径 - /// - public static void CreateFileDirectory(string filePath) - { - // 获取文件的文件夹路径 - string directory = Path.GetDirectoryName(filePath); - CreateDirectory(directory); - } - - /// - /// 创建文件夹路径 - /// - public static void CreateDirectory(string directory) - { - // If the directory doesn't exist, create it. - if (Directory.Exists(directory) == false) - Directory.CreateDirectory(directory); - } - - /// - /// 获取文件大小(字节数) - /// - public static long GetFileSize(string filePath) - { - FileInfo fileInfo = new FileInfo(filePath); - return fileInfo.Length; - } + void Log(string message); + void Warning(string message); + void Error(string message); + void Exception(System.Exception exception); } - /// - /// 哈希工具类 - /// - public static class HashUtility + internal static class YooLogger { - private static string ToString(byte[] hashBytes) - { - string result = BitConverter.ToString(hashBytes); - result = result.Replace("-", ""); - return result.ToLower(); - } - - #region SHA1 - /// - /// 获取字符串的Hash值 - /// - public static string StringSHA1(string str) - { - byte[] buffer = Encoding.UTF8.GetBytes(str); - return BytesSHA1(buffer); - } + public static ILogger Logger = null; /// - /// 获取文件的Hash值 + /// 日志 /// - public static string FileSHA1(string filePath) + [Conditional("DEBUG")] + public static void Log(string info) { - using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + if (Logger != null) { - return StreamSHA1(fs); + Logger.Log(GetTime() + info); } - } - - /// - /// 获取文件的Hash值 - /// - public static string FileSHA1Safely(string filePath) - { - try - { - return FileSHA1(filePath); - } - catch (Exception e) + else { - YooLogger.Exception(e); - return string.Empty; + UnityEngine.Debug.Log(GetTime() + info); } } /// - /// 获取数据流的Hash值 - /// - public static string StreamSHA1(Stream stream) - { - // 说明:创建的是SHA1类的实例,生成的是160位的散列码 - HashAlgorithm hash = HashAlgorithm.Create(); - byte[] hashBytes = hash.ComputeHash(stream); - return ToString(hashBytes); - } - - /// - /// 获取字节数组的Hash值 - /// - public static string BytesSHA1(byte[] buffer) - { - // 说明:创建的是SHA1类的实例,生成的是160位的散列码 - HashAlgorithm hash = HashAlgorithm.Create(); - byte[] hashBytes = hash.ComputeHash(buffer); - return ToString(hashBytes); - } - #endregion - - #region MD5 - /// - /// 获取字符串的MD5 - /// - public static string StringMD5(string str) - { - byte[] buffer = Encoding.UTF8.GetBytes(str); - return BytesMD5(buffer); - } - - /// - /// 获取文件的MD5 + /// 警告 /// - public static string FileMD5(string filePath) + public static void Warning(string info) { - using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + if (Logger != null) + { + Logger.Warning(GetTime() + info); + } + else { - return StreamMD5(fs); + UnityEngine.Debug.LogWarning(GetTime() + info); } } /// - /// 获取文件的MD5 + /// 错误 /// - public static string FileMD5Safely(string filePath) + public static void Error(string info) { - try + if (Logger != null) { - return FileMD5(filePath); + Logger.Error(GetTime() + info); } - catch (Exception e) + else { - YooLogger.Exception(e); - return string.Empty; + UnityEngine.Debug.LogError(GetTime() + info); } } - /// - /// 获取数据流的MD5 - /// - public static string StreamMD5(Stream stream) - { - MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); - byte[] hashBytes = provider.ComputeHash(stream); - return ToString(hashBytes); - } - - /// - /// 获取字节数组的MD5 - /// - public static string BytesMD5(byte[] buffer) - { - MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); - byte[] hashBytes = provider.ComputeHash(buffer); - return ToString(hashBytes); - } - #endregion - - #region CRC32 - /// - /// 获取字符串的CRC32 - /// - public static string StringCRC32(string str) - { - byte[] buffer = Encoding.UTF8.GetBytes(str); - return BytesCRC32(buffer); - } - - /// - /// 获取文件的CRC32 - /// - public static string FileCRC32(string filePath) + private static string GetTime() { - using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) - { - return StreamCRC32(fs); - } + return $"[YooAsset]:[{DateTime.Now:HH:mm:ss.fff}]:"; } /// - /// 获取文件的CRC32 + /// 异常 /// - public static string FileCRC32Safely(string filePath) + public static void Exception(System.Exception exception) { - try + if (Logger != null) { - return FileCRC32(filePath); + Logger.Exception(exception); } - catch (Exception e) + else { - YooLogger.Exception(e); - return string.Empty; + UnityEngine.Debug.LogException(exception); } } - - /// - /// 获取数据流的CRC32 - /// - public static string StreamCRC32(Stream stream) - { - CRC32Algorithm hash = new CRC32Algorithm(); - byte[] hashBytes = hash.ComputeHash(stream); - return ToString(hashBytes); - } - - /// - /// 获取字节数组的CRC32 - /// - public static string BytesCRC32(byte[] buffer) - { - CRC32Algorithm hash = new CRC32Algorithm(); - byte[] hashBytes = hash.ComputeHash(buffer); - return ToString(hashBytes); - } - #endregion } -} \ No newline at end of file +}