mirror of https://github.com/tuyoogame/YooAsset
Merge 60fe96fb9c
into f0ed677d86
commit
ba0d193eb1
|
@ -98,7 +98,7 @@ namespace YooAsset
|
||||||
throw new System.NotImplementedException(this.GetType().Name);
|
throw new System.NotImplementedException(this.GetType().Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal string GetPackageName()
|
public string GetPackageName()
|
||||||
{
|
{
|
||||||
return _packageName;
|
return _packageName;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,14 @@ namespace YooAsset
|
||||||
}
|
}
|
||||||
internal abstract void InvokeCallback();
|
internal abstract void InvokeCallback();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否成功
|
||||||
|
/// </summary>
|
||||||
|
public bool IsSucceed
|
||||||
|
{
|
||||||
|
get { return IsDone && Status == EOperationStatus.Succeed; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取资源信息
|
/// 获取资源信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -15,10 +15,10 @@ namespace YooAsset
|
||||||
|
|
||||||
private const int MAX_LOADER_COUNT = 64;
|
private const int MAX_LOADER_COUNT = 64;
|
||||||
|
|
||||||
public delegate void OnDownloadOver(bool isSucceed);
|
public delegate void OnDownloadOver(string packageName, bool isSucceed);
|
||||||
public delegate void OnDownloadProgress(int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes);
|
public delegate void OnDownloadProgress(string packageName, int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes);
|
||||||
public delegate void OnDownloadError(string fileName, string error);
|
public delegate void OnDownloadError(string packageName, string fileName, string error);
|
||||||
public delegate void OnStartDownloadFile(string fileName, long sizeBytes);
|
public delegate void OnStartDownloadFile(string packageName, string fileName, long sizeBytes);
|
||||||
|
|
||||||
private readonly string _packageName;
|
private readonly string _packageName;
|
||||||
private readonly int _downloadingMaxNumber;
|
private readonly int _downloadingMaxNumber;
|
||||||
|
@ -160,7 +160,7 @@ namespace YooAsset
|
||||||
_lastDownloadBytes = downloadBytes;
|
_lastDownloadBytes = downloadBytes;
|
||||||
_lastDownloadCount = _cachedDownloadCount;
|
_lastDownloadCount = _cachedDownloadCount;
|
||||||
Progress = (float)_lastDownloadBytes / TotalDownloadBytes;
|
Progress = (float)_lastDownloadBytes / TotalDownloadBytes;
|
||||||
OnDownloadProgressCallback?.Invoke(TotalDownloadCount, _lastDownloadCount, TotalDownloadBytes, _lastDownloadBytes);
|
OnDownloadProgressCallback?.Invoke(GetPackageName(), TotalDownloadCount, _lastDownloadCount, TotalDownloadBytes, _lastDownloadBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 动态创建新的下载器到最大数量限制
|
// 动态创建新的下载器到最大数量限制
|
||||||
|
@ -177,7 +177,7 @@ namespace YooAsset
|
||||||
var downloader = bundleInfo.CreateDownloader(_failedTryAgain, _timeout);
|
var downloader = bundleInfo.CreateDownloader(_failedTryAgain, _timeout);
|
||||||
_downloaders.Add(downloader);
|
_downloaders.Add(downloader);
|
||||||
_bundleInfoList.RemoveAt(index);
|
_bundleInfoList.RemoveAt(index);
|
||||||
OnStartDownloadFileCallback?.Invoke(bundleInfo.Bundle.BundleName, bundleInfo.Bundle.FileSize);
|
OnStartDownloadFileCallback?.Invoke(GetPackageName(), bundleInfo.Bundle.BundleName, bundleInfo.Bundle.FileSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,15 +191,15 @@ namespace YooAsset
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = $"Failed to download file : {bundleName}";
|
Error = $"Failed to download file : {bundleName}";
|
||||||
OnDownloadErrorCallback?.Invoke(bundleName, failedDownloader.Error);
|
OnDownloadErrorCallback?.Invoke(GetPackageName(), bundleName, failedDownloader.Error);
|
||||||
OnDownloadOverCallback?.Invoke(false);
|
OnDownloadOverCallback?.Invoke(GetPackageName(), false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 结算成功
|
// 结算成功
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeed;
|
Status = EOperationStatus.Succeed;
|
||||||
OnDownloadOverCallback?.Invoke(true);
|
OnDownloadOverCallback?.Invoke(GetPackageName(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,377 +1,87 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.Diagnostics;
|
||||||
using System.Security.Cryptography;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 路径工具类
|
/// 自定义日志处理
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static class PathUtility
|
public interface ILogger
|
||||||
{
|
{
|
||||||
/// <summary>
|
void Log(string message);
|
||||||
/// 路径归一化
|
void Warning(string message);
|
||||||
/// 注意:替换为Linux路径格式
|
void Error(string message);
|
||||||
/// </summary>
|
void Exception(System.Exception exception);
|
||||||
public static string RegularPath(string path)
|
}
|
||||||
{
|
|
||||||
return path.Replace('\\', '/').Replace("\\", "/");
|
internal static class YooLogger
|
||||||
}
|
{
|
||||||
|
public static ILogger Logger = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 移除路径里的后缀名
|
/// 日志
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string RemoveExtension(string str)
|
[Conditional("DEBUG")]
|
||||||
|
public static void Log(string info)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(str))
|
if (Logger != null)
|
||||||
return str;
|
{
|
||||||
|
Logger.Log(GetTime() + info);
|
||||||
int index = str.LastIndexOf('.');
|
}
|
||||||
if (index == -1)
|
|
||||||
return str;
|
|
||||||
else
|
else
|
||||||
return str.Remove(index); //"assets/config/test.unity3d" --> "assets/config/test"
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 合并路径
|
|
||||||
/// </summary>
|
|
||||||
public static string Combine(string path1, string path2)
|
|
||||||
{
|
|
||||||
return StringUtility.Format("{0}/{1}", path1, path2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 合并路径
|
|
||||||
/// </summary>
|
|
||||||
public static string Combine(string path1, string path2, string path3)
|
|
||||||
{
|
|
||||||
return StringUtility.Format("{0}/{1}/{2}", path1, path2, path3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 合并路径
|
|
||||||
/// </summary>
|
|
||||||
public static string Combine(string path1, string path2, string path3, string path4)
|
|
||||||
{
|
|
||||||
return StringUtility.Format("{0}/{1}/{2}/{3}", path1, path2, path3, path4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 字符串工具类
|
|
||||||
/// </summary>
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 文件工具类
|
|
||||||
/// </summary>
|
|
||||||
internal static class FileUtility
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 读取文件的文本数据
|
|
||||||
/// </summary>
|
|
||||||
public static string ReadAllText(string filePath)
|
|
||||||
{
|
|
||||||
if (File.Exists(filePath) == false)
|
|
||||||
return null;
|
|
||||||
return File.ReadAllText(filePath, Encoding.UTF8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读取文件的字节数据
|
|
||||||
/// </summary>
|
|
||||||
public static byte[] ReadAllBytes(string filePath)
|
|
||||||
{
|
|
||||||
if (File.Exists(filePath) == false)
|
|
||||||
return null;
|
|
||||||
return File.ReadAllBytes(filePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写入文本数据(会覆盖指定路径的文件)
|
|
||||||
/// </summary>
|
|
||||||
public static void WriteAllText(string filePath, string content)
|
|
||||||
{
|
|
||||||
// 创建文件夹路径
|
|
||||||
CreateFileDirectory(filePath);
|
|
||||||
|
|
||||||
byte[] bytes = Encoding.UTF8.GetBytes(content);
|
|
||||||
File.WriteAllBytes(filePath, bytes); //避免写入BOM标记
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 写入字节数据(会覆盖指定路径的文件)
|
|
||||||
/// </summary>
|
|
||||||
public static void WriteAllBytes(string filePath, byte[] data)
|
|
||||||
{
|
|
||||||
// 创建文件夹路径
|
|
||||||
CreateFileDirectory(filePath);
|
|
||||||
|
|
||||||
File.WriteAllBytes(filePath, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 创建文件的文件夹路径
|
|
||||||
/// </summary>
|
|
||||||
public static void CreateFileDirectory(string filePath)
|
|
||||||
{
|
|
||||||
// 获取文件的文件夹路径
|
|
||||||
string directory = Path.GetDirectoryName(filePath);
|
|
||||||
CreateDirectory(directory);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 创建文件夹路径
|
|
||||||
/// </summary>
|
|
||||||
public static void CreateDirectory(string directory)
|
|
||||||
{
|
|
||||||
// If the directory doesn't exist, create it.
|
|
||||||
if (Directory.Exists(directory) == false)
|
|
||||||
Directory.CreateDirectory(directory);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取文件大小(字节数)
|
|
||||||
/// </summary>
|
|
||||||
public static long GetFileSize(string filePath)
|
|
||||||
{
|
|
||||||
FileInfo fileInfo = new FileInfo(filePath);
|
|
||||||
return fileInfo.Length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 哈希工具类
|
|
||||||
/// </summary>
|
|
||||||
public static class HashUtility
|
|
||||||
{
|
|
||||||
private static string ToString(byte[] hashBytes)
|
|
||||||
{
|
|
||||||
string result = BitConverter.ToString(hashBytes);
|
|
||||||
result = result.Replace("-", "");
|
|
||||||
return result.ToLower();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region SHA1
|
|
||||||
/// <summary>
|
|
||||||
/// 获取字符串的Hash值
|
|
||||||
/// </summary>
|
|
||||||
public static string StringSHA1(string str)
|
|
||||||
{
|
|
||||||
byte[] buffer = Encoding.UTF8.GetBytes(str);
|
|
||||||
return BytesSHA1(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取文件的Hash值
|
|
||||||
/// </summary>
|
|
||||||
public static string FileSHA1(string filePath)
|
|
||||||
{
|
|
||||||
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|
||||||
{
|
{
|
||||||
return StreamSHA1(fs);
|
UnityEngine.Debug.Log(GetTime() + info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取文件的Hash值
|
/// 警告
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string FileSHA1Safely(string filePath)
|
public static void Warning(string info)
|
||||||
{
|
{
|
||||||
try
|
if (Logger != null)
|
||||||
{
|
{
|
||||||
return FileSHA1(filePath);
|
Logger.Warning(GetTime() + info);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
else
|
||||||
{
|
{
|
||||||
YooLogger.Exception(e);
|
UnityEngine.Debug.LogWarning(GetTime() + info);
|
||||||
return string.Empty;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取数据流的Hash值
|
/// 错误
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string StreamSHA1(Stream stream)
|
public static void Error(string info)
|
||||||
{
|
{
|
||||||
// 说明:创建的是SHA1类的实例,生成的是160位的散列码
|
if (Logger != null)
|
||||||
HashAlgorithm hash = HashAlgorithm.Create();
|
|
||||||
byte[] hashBytes = hash.ComputeHash(stream);
|
|
||||||
return ToString(hashBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取字节数组的Hash值
|
|
||||||
/// </summary>
|
|
||||||
public static string BytesSHA1(byte[] buffer)
|
|
||||||
{
|
|
||||||
// 说明:创建的是SHA1类的实例,生成的是160位的散列码
|
|
||||||
HashAlgorithm hash = HashAlgorithm.Create();
|
|
||||||
byte[] hashBytes = hash.ComputeHash(buffer);
|
|
||||||
return ToString(hashBytes);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region MD5
|
|
||||||
/// <summary>
|
|
||||||
/// 获取字符串的MD5
|
|
||||||
/// </summary>
|
|
||||||
public static string StringMD5(string str)
|
|
||||||
{
|
|
||||||
byte[] buffer = Encoding.UTF8.GetBytes(str);
|
|
||||||
return BytesMD5(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取文件的MD5
|
|
||||||
/// </summary>
|
|
||||||
public static string FileMD5(string filePath)
|
|
||||||
{
|
|
||||||
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|
||||||
{
|
{
|
||||||
return StreamMD5(fs);
|
Logger.Error(GetTime() + info);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.LogError(GetTime() + info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private static string GetTime()
|
||||||
/// 获取文件的MD5
|
|
||||||
/// </summary>
|
|
||||||
public static string FileMD5Safely(string filePath)
|
|
||||||
{
|
{
|
||||||
try
|
return $"[YooAsset]:[{DateTime.Now:HH:mm:ss.fff}]:";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异常
|
||||||
|
/// </summary>
|
||||||
|
public static void Exception(System.Exception exception)
|
||||||
|
{
|
||||||
|
if (Logger != null)
|
||||||
{
|
{
|
||||||
return FileMD5(filePath);
|
Logger.Exception(exception);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
else
|
||||||
{
|
{
|
||||||
YooLogger.Exception(e);
|
UnityEngine.Debug.LogException(exception);
|
||||||
return string.Empty;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取数据流的MD5
|
|
||||||
/// </summary>
|
|
||||||
public static string StreamMD5(Stream stream)
|
|
||||||
{
|
|
||||||
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
|
|
||||||
byte[] hashBytes = provider.ComputeHash(stream);
|
|
||||||
return ToString(hashBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取字节数组的MD5
|
|
||||||
/// </summary>
|
|
||||||
public static string BytesMD5(byte[] buffer)
|
|
||||||
{
|
|
||||||
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
|
|
||||||
byte[] hashBytes = provider.ComputeHash(buffer);
|
|
||||||
return ToString(hashBytes);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region CRC32
|
|
||||||
/// <summary>
|
|
||||||
/// 获取字符串的CRC32
|
|
||||||
/// </summary>
|
|
||||||
public static string StringCRC32(string str)
|
|
||||||
{
|
|
||||||
byte[] buffer = Encoding.UTF8.GetBytes(str);
|
|
||||||
return BytesCRC32(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取文件的CRC32
|
|
||||||
/// </summary>
|
|
||||||
public static string FileCRC32(string filePath)
|
|
||||||
{
|
|
||||||
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|
||||||
{
|
|
||||||
return StreamCRC32(fs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取文件的CRC32
|
|
||||||
/// </summary>
|
|
||||||
public static string FileCRC32Safely(string filePath)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return FileCRC32(filePath);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
YooLogger.Exception(e);
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取数据流的CRC32
|
|
||||||
/// </summary>
|
|
||||||
public static string StreamCRC32(Stream stream)
|
|
||||||
{
|
|
||||||
CRC32Algorithm hash = new CRC32Algorithm();
|
|
||||||
byte[] hashBytes = hash.ComputeHash(stream);
|
|
||||||
return ToString(hashBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取字节数组的CRC32
|
|
||||||
/// </summary>
|
|
||||||
public static string BytesCRC32(byte[] buffer)
|
|
||||||
{
|
|
||||||
CRC32Algorithm hash = new CRC32Algorithm();
|
|
||||||
byte[] hashBytes = hash.ComputeHash(buffer);
|
|
||||||
return ToString(hashBytes);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue