mirror of
https://github.com/tuyoogame/YooAsset.git
synced 2026-05-23 17:20:12 +00:00
Compare commits
28 Commits
1.4.17
...
1.5.2-prev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
92ed6e7d1c | ||
|
|
b9a45a58a8 | ||
|
|
0c1efe7420 | ||
|
|
9dd7680457 | ||
|
|
087216b9da | ||
|
|
ecb6f71f81 | ||
|
|
ffffff16e9 | ||
|
|
0311d976bb | ||
|
|
120c07cc2e | ||
|
|
ed5ae40cb3 | ||
|
|
5931d91b5f | ||
|
|
472a5ae97a | ||
|
|
829ea66d0e | ||
|
|
ba39291ee7 | ||
|
|
d3d15fc59f | ||
|
|
8a3358c990 | ||
|
|
8eadba3aa6 | ||
|
|
b0917623b6 | ||
|
|
a7d9a4ecbc | ||
|
|
2643ab81ed | ||
|
|
c5314c72f0 | ||
|
|
fbb48ba330 | ||
|
|
4e6879e34f | ||
|
|
09c3d4e479 | ||
|
|
1e88bad73e | ||
|
|
9a2ed64b4e | ||
|
|
60e93f9809 | ||
|
|
f5c72e913f |
@@ -2,6 +2,150 @@
|
|||||||
|
|
||||||
All notable changes to this package will be documented in this file.
|
All notable changes to this package will be documented in this file.
|
||||||
|
|
||||||
|
## [1.5.2-preview] - 2023-07-18
|
||||||
|
|
||||||
|
重新设计了对WebGL平台的支持,新增加了专属模式:WebPlayMode
|
||||||
|
|
||||||
|
## [1.5.1] - 2023-07-12
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- 修复了太空战机DEMO在生成内置文件清单的时候,目录不存在引发的异常。
|
||||||
|
- 修复了在销毁Package时,如果存在正在加载的bundle,会导致后续加载该bundle报错的问题。
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- 真机上使用错误方法加载原生文件的时候给予正确的错误提示。
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- 新增了HostPlayModeParameters.RemoteServices字段
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 远端资源地址查询服务类
|
||||||
|
/// </summary>
|
||||||
|
public IRemoteServices RemoteServices = null;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- 移除了HostPlayModeParameters.DefaultHostServer字段
|
||||||
|
- 移除了HostPlayModeParameters.FallbackHostServer字段
|
||||||
|
|
||||||
|
## [1.5.0] - 2023-07-05
|
||||||
|
|
||||||
|
该版本重构了Persistent类,导致沙盒目录和内置目录的存储结构发生了变化。
|
||||||
|
|
||||||
|
该版本支持按照Package自定义沙盒存储目录和内置存储目录。
|
||||||
|
|
||||||
|
**注意:低版本升级用户,请使用Space Shooter目录下的StreamingAssetsHelper插件覆盖到本地工程!**
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- BuildParameters.OutputRoot重命名为BuildOutputRoot
|
||||||
|
- 变更了IQueryServices.QueryStreamingAssets(string packageName, string fileName)方法
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- 新增了YooAssets.SetCacheSystemDisableCacheOnWebGL()方法
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 设置缓存系统参数,禁用缓存在WebGL平台
|
||||||
|
/// </summary>
|
||||||
|
public static void SetCacheSystemDisableCacheOnWebGL()
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了YooAssets.SetDownloadSystemRedirectLimit()方法
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 设置下载系统参数,网络重定向次数(Unity引擎默认值32)
|
||||||
|
/// 注意:不支持设置为负值
|
||||||
|
/// </summary>
|
||||||
|
public static void SetDownloadSystemRedirectLimit(int redirectLimit)
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了构建流程可扩展的方法。
|
||||||
|
|
||||||
|
```c#
|
||||||
|
public class AssetBundleBuilder
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 构建资源包
|
||||||
|
/// </summary>
|
||||||
|
public BuildResult Run(BuildParameters buildParameters, List<IBuildTask> buildPipeline)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了BuildParameters.StreamingAssetsRoot字段
|
||||||
|
|
||||||
|
```c#
|
||||||
|
public class BuildParameters
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 内置资源的根目录
|
||||||
|
/// </summary>
|
||||||
|
public string StreamingAssetsRoot;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了InitializeParameters.BuildinRootDirectory字段
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 内置文件的根路径
|
||||||
|
/// 注意:当参数为空的时候会使用默认的根目录。
|
||||||
|
/// </summary>
|
||||||
|
public string BuildinRootDirectory = string.Empty;
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了InitializeParameters.SandboxRootDirectory字段
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 沙盒文件的根路径
|
||||||
|
/// 注意:当参数为空的时候会使用默认的根目录。
|
||||||
|
/// </summary>
|
||||||
|
public string SandboxRootDirectory = string.Empty;
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了ResourcePackage.GetPackageBuildinRootDirectory()方法
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 获取包裹的内置文件根路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetPackageBuildinRootDirectory()
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了ResourcePackage.GetPackageSandboxRootDirectory()方法
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 获取包裹的沙盒文件根路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetPackageSandboxRootDirectory()
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了ResourcePackage.ClearPackageSandbox()方法
|
||||||
|
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// 清空包裹的沙盒目录
|
||||||
|
/// </summary>
|
||||||
|
public void ClearPackageSandbox()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- 移除了资源包构建流程任务节点可扩展功能。
|
||||||
|
- 移除了YooAssets.SetCacheSystemSandboxPath()方法
|
||||||
|
- 移除了YooAssets.GetStreamingAssetBuildinFolderName()方法
|
||||||
|
- 移除了YooAssets.GetSandboxRoot()方法
|
||||||
|
- 移除了YooAssets.ClearSandbox()方法
|
||||||
|
|
||||||
## [1.4.17] - 2023-06-27
|
## [1.4.17] - 2023-06-27
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
@@ -25,8 +169,6 @@ All notable changes to this package will be documented in this file.
|
|||||||
|
|
||||||
- IShareAssetPackRule 重命名为 ISharedPackRule
|
- IShareAssetPackRule 重命名为 ISharedPackRule
|
||||||
|
|
||||||
-
|
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- 新增了ResourcePackage.LoadAllAssetsAsync方法
|
- 新增了ResourcePackage.LoadAllAssetsAsync方法
|
||||||
|
|||||||
@@ -13,29 +13,20 @@ namespace YooAsset.Editor
|
|||||||
private readonly BuildContext _buildContext = new BuildContext();
|
private readonly BuildContext _buildContext = new BuildContext();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 开始构建
|
/// 构建资源包
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public BuildResult Run(BuildParameters buildParameters)
|
public BuildResult Run(BuildParameters buildParameters, List<IBuildTask> buildPipeline)
|
||||||
{
|
{
|
||||||
// 清空旧数据
|
|
||||||
_buildContext.ClearAllContext();
|
|
||||||
|
|
||||||
// 检测构建参数是否为空
|
// 检测构建参数是否为空
|
||||||
if (buildParameters == null)
|
if (buildParameters == null)
|
||||||
throw new Exception($"{nameof(buildParameters)} is null !");
|
throw new Exception($"{nameof(buildParameters)} is null !");
|
||||||
|
|
||||||
// 检测可编程构建管线参数
|
// 检测构建参数是否为空
|
||||||
if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
if (buildPipeline.Count == 0)
|
||||||
{
|
throw new Exception($"Build pipeline is empty !");
|
||||||
if (buildParameters.SBPParameters == null)
|
|
||||||
throw new Exception($"{nameof(BuildParameters.SBPParameters)} is null !");
|
|
||||||
|
|
||||||
if (buildParameters.BuildMode == EBuildMode.DryRunBuild)
|
// 清空旧数据
|
||||||
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.DryRunBuild)} build mode !");
|
_buildContext.ClearAllContext();
|
||||||
|
|
||||||
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
|
|
||||||
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.ForceRebuild)} build mode !");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建参数
|
// 构建参数
|
||||||
var buildParametersContext = new BuildParametersContext(buildParameters);
|
var buildParametersContext = new BuildParametersContext(buildParameters);
|
||||||
@@ -45,8 +36,7 @@ namespace YooAsset.Editor
|
|||||||
BuildLogger.InitLogger(buildParameters.EnableLog);
|
BuildLogger.InitLogger(buildParameters.EnableLog);
|
||||||
|
|
||||||
// 执行构建流程
|
// 执行构建流程
|
||||||
var pipeline = GetBuildTasks(buildParameters.BuildPipeline);
|
var buildResult = BuildRunner.Run(buildPipeline, _buildContext);
|
||||||
var buildResult = BuildRunner.Run(pipeline, _buildContext);
|
|
||||||
if (buildResult.Success)
|
if (buildResult.Success)
|
||||||
{
|
{
|
||||||
buildResult.OutputPackageDirectory = buildParametersContext.GetPackageOutputDirectory();
|
buildResult.OutputPackageDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
@@ -62,13 +52,23 @@ namespace YooAsset.Editor
|
|||||||
return buildResult;
|
return buildResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<IBuildTask> GetBuildTasks(EBuildPipeline buildPipeline)
|
/// <summary>
|
||||||
|
/// 构建资源包
|
||||||
|
/// </summary>
|
||||||
|
public BuildResult Run(BuildParameters buildParameters)
|
||||||
|
{
|
||||||
|
var buildPipeline = GetDefaultBuildPipeline(buildParameters.BuildPipeline);
|
||||||
|
return Run(buildParameters, buildPipeline);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取默认的构建流程
|
||||||
|
/// </summary>
|
||||||
|
private List<IBuildTask> GetDefaultBuildPipeline(EBuildPipeline buildPipeline)
|
||||||
{
|
{
|
||||||
// 获取任务节点的属性集合
|
// 获取任务节点的属性集合
|
||||||
List<TaskAttribute> attrList = new List<TaskAttribute>();
|
|
||||||
if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
List<IBuildTask> pipeline = new List<IBuildTask>
|
List<IBuildTask> pipeline = new List<IBuildTask>
|
||||||
{
|
{
|
||||||
new TaskPrepare(), //前期准备工作
|
new TaskPrepare(), //前期准备工作
|
||||||
@@ -83,23 +83,10 @@ namespace YooAsset.Editor
|
|||||||
new TaskCreatePackage(), //制作包裹
|
new TaskCreatePackage(), //制作包裹
|
||||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||||
};
|
};
|
||||||
*/
|
return pipeline;
|
||||||
|
|
||||||
var classTypes = EditorTools.GetAssignableTypes(typeof(IBuildTask));
|
|
||||||
foreach (var classType in classTypes)
|
|
||||||
{
|
|
||||||
var attribute = classType.GetCustomAttribute<TaskAttribute>();
|
|
||||||
if (attribute == null)
|
|
||||||
throw new Exception($"Not found {nameof(TaskAttribute)} int type : {classType.FullName}");
|
|
||||||
|
|
||||||
attribute.ClassType = classType;
|
|
||||||
if (attribute.Pipeline == ETaskPipeline.AllPipeline || attribute.Pipeline == ETaskPipeline.BuiltinBuildPipeline)
|
|
||||||
attrList.Add(attribute);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (buildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
else if (buildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
List<IBuildTask> pipeline = new List<IBuildTask>
|
List<IBuildTask> pipeline = new List<IBuildTask>
|
||||||
{
|
{
|
||||||
new TaskPrepare(), //前期准备工作
|
new TaskPrepare(), //前期准备工作
|
||||||
@@ -114,42 +101,12 @@ namespace YooAsset.Editor
|
|||||||
new TaskCreatePackage(), //制作补丁包
|
new TaskCreatePackage(), //制作补丁包
|
||||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||||
};
|
};
|
||||||
*/
|
return pipeline;
|
||||||
|
|
||||||
var classTypes = EditorTools.GetAssignableTypes(typeof(IBuildTask));
|
|
||||||
foreach (var classType in classTypes)
|
|
||||||
{
|
|
||||||
var attribute = classType.GetCustomAttribute<TaskAttribute>();
|
|
||||||
if (attribute == null)
|
|
||||||
throw new Exception($"Not found {nameof(TaskAttribute)} int type : {classType.FullName}");
|
|
||||||
|
|
||||||
attribute.ClassType = classType;
|
|
||||||
if (attribute.Pipeline == ETaskPipeline.AllPipeline || attribute.Pipeline == ETaskPipeline.ScriptableBuildPipeline)
|
|
||||||
attrList.Add(attribute);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 对任务节点进行排序
|
|
||||||
attrList.Sort((a, b) =>
|
|
||||||
{
|
|
||||||
if (a.TaskOrder > b.TaskOrder) { return 1; }
|
|
||||||
else if (a.TaskOrder < b.TaskOrder) { return -1; }
|
|
||||||
else { return 0; }
|
|
||||||
});
|
|
||||||
|
|
||||||
// 创建任务节点实例
|
|
||||||
List<IBuildTask> pipeline = new List<IBuildTask>(attrList.Count);
|
|
||||||
foreach (var taskAttr in attrList)
|
|
||||||
{
|
|
||||||
var task = Activator.CreateInstance(taskAttr.ClassType) as IBuildTask;
|
|
||||||
pipeline.Add(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pipeline;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ namespace YooAsset.Editor
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取默认的输出根路录
|
/// 获取默认的输出根路录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetDefaultOutputRoot()
|
public static string GetDefaultBuildOutputRoot()
|
||||||
{
|
{
|
||||||
string projectPath = EditorTools.GetProjectPath();
|
string projectPath = EditorTools.GetProjectPath();
|
||||||
return $"{projectPath}/Bundles";
|
return $"{projectPath}/Bundles";
|
||||||
@@ -20,43 +20,9 @@ namespace YooAsset.Editor
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取流文件夹路径
|
/// 获取流文件夹路径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetStreamingAssetsFolderPath()
|
public static string GetDefaultStreamingAssetsRoot()
|
||||||
{
|
{
|
||||||
return $"{Application.dataPath}/StreamingAssets/{YooAssetSettings.StreamingAssetsBuildinFolder}/";
|
return $"{Application.dataPath}/StreamingAssets/{YooAssetSettings.DefaultYooFolderName}/";
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清空流文件夹
|
|
||||||
/// </summary>
|
|
||||||
public static void ClearStreamingAssetsFolder()
|
|
||||||
{
|
|
||||||
string streamingFolderPath = GetStreamingAssetsFolderPath();
|
|
||||||
EditorTools.ClearFolder(streamingFolderPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除流文件夹内无关的文件
|
|
||||||
/// 删除.manifest文件和.meta文件
|
|
||||||
/// </summary>
|
|
||||||
public static void DeleteStreamingAssetsIgnoreFiles()
|
|
||||||
{
|
|
||||||
string streamingFolderPath = GetStreamingAssetsFolderPath();
|
|
||||||
if (Directory.Exists(streamingFolderPath))
|
|
||||||
{
|
|
||||||
string[] files = Directory.GetFiles(streamingFolderPath, "*.manifest", SearchOption.AllDirectories);
|
|
||||||
foreach (var file in files)
|
|
||||||
{
|
|
||||||
FileInfo info = new FileInfo(file);
|
|
||||||
info.Delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
files = Directory.GetFiles(streamingFolderPath, "*.meta", SearchOption.AllDirectories);
|
|
||||||
foreach (var item in files)
|
|
||||||
{
|
|
||||||
FileInfo info = new FileInfo(item);
|
|
||||||
info.Delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ namespace YooAsset.Editor
|
|||||||
_encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.Name).ToList();
|
_encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.Name).ToList();
|
||||||
|
|
||||||
// 输出目录
|
// 输出目录
|
||||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
_buildOutputField = root.Q<TextField>("BuildOutput");
|
_buildOutputField = root.Q<TextField>("BuildOutput");
|
||||||
_buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
|
_buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
|
||||||
_buildOutputField.SetEnabled(false);
|
_buildOutputField.SetEnabled(false);
|
||||||
@@ -266,9 +266,9 @@ namespace YooAsset.Editor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void ExecuteBuild()
|
private void ExecuteBuild()
|
||||||
{
|
{
|
||||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
|
||||||
BuildParameters buildParameters = new BuildParameters();
|
BuildParameters buildParameters = new BuildParameters();
|
||||||
buildParameters.OutputRoot = defaultOutputRoot;
|
buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
buildParameters.BuildTarget = _buildTarget;
|
buildParameters.BuildTarget = _buildTarget;
|
||||||
buildParameters.BuildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
|
buildParameters.BuildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
|
||||||
buildParameters.BuildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
|
buildParameters.BuildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ namespace YooAsset.Editor
|
|||||||
public static string SimulateBuild(string packageName)
|
public static string SimulateBuild(string packageName)
|
||||||
{
|
{
|
||||||
Debug.Log($"Begin to create simulate package : {packageName}");
|
Debug.Log($"Begin to create simulate package : {packageName}");
|
||||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
|
||||||
BuildParameters buildParameters = new BuildParameters();
|
BuildParameters buildParameters = new BuildParameters();
|
||||||
buildParameters.OutputRoot = defaultOutputRoot;
|
buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||||
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
||||||
buildParameters.PackageName = packageName;
|
buildParameters.PackageName = packageName;
|
||||||
|
|||||||
@@ -8,39 +8,54 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
public class BuildBundleInfo
|
public class BuildBundleInfo
|
||||||
{
|
{
|
||||||
public class InfoWrapper
|
#region 补丁文件的关键信息
|
||||||
{
|
/// <summary>
|
||||||
/// <summary>
|
/// Unity引擎生成的哈希值(构建内容的哈希值)
|
||||||
/// 构建内容的哈希值
|
/// </summary>
|
||||||
/// </summary>
|
public string PackageUnityHash { set; get; }
|
||||||
public string ContentHash { set; get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件哈希值
|
/// Unity引擎生成的CRC
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string FileHash { set; get; }
|
public uint PackageUnityCRC { set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件哈希值
|
/// 文件哈希值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string FileCRC { set; get; }
|
public string PackageFileHash { set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件哈希值
|
/// 文件哈希值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long FileSize { set; get; }
|
public string PackageFileCRC { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 文件哈希值
|
||||||
|
/// </summary>
|
||||||
|
public long PackageFileSize { set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建输出的文件路径
|
/// 构建输出的文件路径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string BuildOutputFilePath { set; get; }
|
public string BuildOutputFilePath { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 补丁包的源文件路径
|
||||||
|
/// </summary>
|
||||||
|
public string PackageSourceFilePath { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 补丁包的目标文件路径
|
||||||
|
/// </summary>
|
||||||
|
public string PackageDestFilePath { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加密生成文件的路径
|
||||||
|
/// 注意:如果未加密该路径为空
|
||||||
|
/// </summary>
|
||||||
|
public string EncryptedFilePath { set; get; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 补丁包输出文件路径
|
|
||||||
/// </summary>
|
|
||||||
public string PackageOutputFilePath { set; get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源包名称
|
/// 资源包名称
|
||||||
@@ -53,22 +68,11 @@ namespace YooAsset.Editor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly List<BuildAssetInfo> AllMainAssets = new List<BuildAssetInfo>();
|
public readonly List<BuildAssetInfo> AllMainAssets = new List<BuildAssetInfo>();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 补丁文件信息
|
|
||||||
/// </summary>
|
|
||||||
public readonly InfoWrapper BundleInfo = new InfoWrapper();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Bundle文件的加载方法
|
/// Bundle文件的加载方法
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EBundleLoadMethod LoadMethod { set; get; }
|
public EBundleLoadMethod LoadMethod { set; get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 加密生成文件的路径
|
|
||||||
/// 注意:如果未加密该路径为空
|
|
||||||
/// </summary>
|
|
||||||
public string EncryptedFilePath { set; get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否为原生文件
|
/// 是否为原生文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -208,9 +212,10 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
PackageBundle packageBundle = new PackageBundle();
|
PackageBundle packageBundle = new PackageBundle();
|
||||||
packageBundle.BundleName = BundleName;
|
packageBundle.BundleName = BundleName;
|
||||||
packageBundle.FileHash = BundleInfo.FileHash;
|
packageBundle.FileHash = PackageFileHash;
|
||||||
packageBundle.FileCRC = BundleInfo.FileCRC;
|
packageBundle.FileCRC = PackageFileCRC;
|
||||||
packageBundle.FileSize = BundleInfo.FileSize;
|
packageBundle.FileSize = PackageFileSize;
|
||||||
|
packageBundle.UnityCRC = PackageUnityCRC;
|
||||||
packageBundle.IsRawFile = IsRawFile;
|
packageBundle.IsRawFile = IsRawFile;
|
||||||
packageBundle.LoadMethod = (byte)LoadMethod;
|
packageBundle.LoadMethod = (byte)LoadMethod;
|
||||||
packageBundle.Tags = GetBundleTags();
|
packageBundle.Tags = GetBundleTags();
|
||||||
|
|||||||
@@ -37,9 +37,14 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 输出的根目录
|
/// 内置资源的根目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string OutputRoot;
|
public string StreamingAssetsRoot;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建输出的根目录
|
||||||
|
/// </summary>
|
||||||
|
public string BuildOutputRoot;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建的平台
|
/// 构建的平台
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
private string _pipelineOutputDirectory = string.Empty;
|
private string _pipelineOutputDirectory = string.Empty;
|
||||||
private string _packageOutputDirectory = string.Empty;
|
private string _packageOutputDirectory = string.Empty;
|
||||||
|
private string _packageRootDirectory = string.Empty;
|
||||||
|
private string _streamingAssetsDirectory = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建参数
|
/// 构建参数
|
||||||
@@ -29,23 +31,47 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_pipelineOutputDirectory))
|
if (string.IsNullOrEmpty(_pipelineOutputDirectory))
|
||||||
{
|
{
|
||||||
_pipelineOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{YooAssetSettings.OutputFolderName}";
|
_pipelineOutputDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{YooAssetSettings.OutputFolderName}";
|
||||||
}
|
}
|
||||||
return _pipelineOutputDirectory;
|
return _pipelineOutputDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取本次构建的补丁目录
|
/// 获取本次构建的补丁输出目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string GetPackageOutputDirectory()
|
public string GetPackageOutputDirectory()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_packageOutputDirectory))
|
if (string.IsNullOrEmpty(_packageOutputDirectory))
|
||||||
{
|
{
|
||||||
_packageOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{Parameters.PackageVersion}";
|
_packageOutputDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{Parameters.PackageVersion}";
|
||||||
}
|
}
|
||||||
return _packageOutputDirectory;
|
return _packageOutputDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取本次构建的补丁根目录
|
||||||
|
/// </summary>
|
||||||
|
public string GetPackageRootDirectory()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_packageRootDirectory))
|
||||||
|
{
|
||||||
|
_packageRootDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}";
|
||||||
|
}
|
||||||
|
return _packageRootDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取内置资源的目录
|
||||||
|
/// </summary>
|
||||||
|
public string GetStreamingAssetsDirectory()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_streamingAssetsDirectory))
|
||||||
|
{
|
||||||
|
_streamingAssetsDirectory = $"{Parameters.StreamingAssetsRoot}/{Parameters.PackageName}";
|
||||||
|
}
|
||||||
|
return _streamingAssetsDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取内置构建管线的构建选项
|
/// 获取内置构建管线的构建选项
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
|
||||||
{
|
|
||||||
public enum ETaskPipeline
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 所有的构建管线
|
|
||||||
/// </summary>
|
|
||||||
AllPipeline,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 内置构建管线
|
|
||||||
/// </summary>
|
|
||||||
BuiltinBuildPipeline,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 可编程构建管线
|
|
||||||
/// </summary>
|
|
||||||
ScriptableBuildPipeline,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,28 +5,13 @@ namespace YooAsset.Editor
|
|||||||
[AttributeUsage(AttributeTargets.Class)]
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
public class TaskAttribute : Attribute
|
public class TaskAttribute : Attribute
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// 任务所属的构建流水线
|
|
||||||
/// </summary>
|
|
||||||
public ETaskPipeline Pipeline;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 执行顺序
|
|
||||||
/// </summary>
|
|
||||||
public int TaskOrder;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 任务说明
|
/// 任务说明
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string TaskDesc;
|
public string TaskDesc;
|
||||||
|
|
||||||
// 关联的任务类
|
public TaskAttribute(string taskDesc)
|
||||||
public Type ClassType { set; get; }
|
|
||||||
|
|
||||||
public TaskAttribute(ETaskPipeline pipeline, int taskOrder, string taskDesc)
|
|
||||||
{
|
{
|
||||||
Pipeline = pipeline;
|
|
||||||
TaskOrder = taskOrder;
|
|
||||||
TaskDesc = taskDesc;
|
TaskDesc = taskDesc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.BuiltinBuildPipeline, 300, "资源构建内容打包")]
|
[TaskAttribute("资源构建内容打包")]
|
||||||
public class TaskBuilding : IBuildTask
|
public class TaskBuilding : IBuildTask
|
||||||
{
|
{
|
||||||
public class BuildResultContext : IContextObject
|
public class BuildResultContext : IContextObject
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using UnityEditor.Build.Pipeline.Tasks;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.ScriptableBuildPipeline, 300, "资源构建内容打包")]
|
[TaskAttribute("资源构建内容打包")]
|
||||||
public class TaskBuilding_SBP : IBuildTask
|
public class TaskBuilding_SBP : IBuildTask
|
||||||
{
|
{
|
||||||
public class BuildResultContext : IContextObject
|
public class BuildResultContext : IContextObject
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 1100, "拷贝内置文件到流目录")]
|
[TaskAttribute("拷贝内置文件到流目录")]
|
||||||
public class TaskCopyBuildinFiles : IBuildTask
|
public class TaskCopyBuildinFiles : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
@@ -30,7 +30,7 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
ECopyBuildinFileOption option = buildParametersContext.Parameters.CopyBuildinFileOption;
|
ECopyBuildinFileOption option = buildParametersContext.Parameters.CopyBuildinFileOption;
|
||||||
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
string streamingAssetsDirectory = AssetBundleBuilderHelper.GetStreamingAssetsFolderPath();
|
string streamingAssetsDirectory = buildParametersContext.GetStreamingAssetsDirectory();
|
||||||
string buildPackageName = buildParametersContext.Parameters.PackageName;
|
string buildPackageName = buildParametersContext.Parameters.PackageName;
|
||||||
string buildPackageVersion = buildParametersContext.Parameters.PackageVersion;
|
string buildPackageVersion = buildParametersContext.Parameters.PackageVersion;
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ namespace YooAsset.Editor
|
|||||||
// 清空流目录
|
// 清空流目录
|
||||||
if (option == ECopyBuildinFileOption.ClearAndCopyAll || option == ECopyBuildinFileOption.ClearAndCopyByTags)
|
if (option == ECopyBuildinFileOption.ClearAndCopyAll || option == ECopyBuildinFileOption.ClearAndCopyByTags)
|
||||||
{
|
{
|
||||||
AssetBundleBuilderHelper.ClearStreamingAssetsFolder();
|
EditorTools.ClearFolder(streamingAssetsDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拷贝补丁清单文件
|
// 拷贝补丁清单文件
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 400, "拷贝原生文件")]
|
[TaskAttribute("拷贝原生文件")]
|
||||||
public class TaskCopyRawFile : IBuildTask
|
public class TaskCopyRawFile : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace YooAsset.Editor
|
|||||||
internal PackageManifest Manifest;
|
internal PackageManifest Manifest;
|
||||||
}
|
}
|
||||||
|
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 800, "创建清单文件")]
|
[TaskAttribute("创建清单文件")]
|
||||||
public class TaskCreateManifest : IBuildTask
|
public class TaskCreateManifest : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 1000, "制作包裹")]
|
[TaskAttribute("制作包裹")]
|
||||||
public class TaskCreatePackage : IBuildTask
|
public class TaskCreatePackage : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
@@ -70,7 +70,7 @@ namespace YooAsset.Editor
|
|||||||
int fileTotalCount = buildMapContext.Collection.Count;
|
int fileTotalCount = buildMapContext.Collection.Count;
|
||||||
foreach (var bundleInfo in buildMapContext.Collection)
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
{
|
{
|
||||||
EditorTools.CopyFile(bundleInfo.BundleInfo.BuildOutputFilePath, bundleInfo.BundleInfo.PackageOutputFilePath, true);
|
EditorTools.CopyFile(bundleInfo.PackageSourceFilePath, bundleInfo.PackageDestFilePath, true);
|
||||||
EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, fileTotalCount);
|
EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, fileTotalCount);
|
||||||
}
|
}
|
||||||
EditorTools.ClearProgressBar();
|
EditorTools.ClearProgressBar();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using UnityEditor;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 900, "创建构建报告文件")]
|
[TaskAttribute("创建构建报告文件")]
|
||||||
public class TaskCreateReport : IBuildTask
|
public class TaskCreateReport : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 600, "资源包加密")]
|
[TaskAttribute("资源包加密")]
|
||||||
public class TaskEncryption : IBuildTask
|
public class TaskEncryption : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using UnityEditor;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 200, "获取资源构建内容")]
|
[TaskAttribute("获取资源构建内容")]
|
||||||
public class TaskGetBuildMap : IBuildTask
|
public class TaskGetBuildMap : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
@@ -147,17 +147,17 @@ namespace YooAsset.Editor
|
|||||||
private void RemoveZeroReferenceAssets(List<CollectAssetInfo> allCollectAssetInfos)
|
private void RemoveZeroReferenceAssets(List<CollectAssetInfo> allCollectAssetInfos)
|
||||||
{
|
{
|
||||||
// 1. 检测是否任何存在依赖资源
|
// 1. 检测是否任何存在依赖资源
|
||||||
bool hasAnyDependAsset = false;
|
bool hasAnyDependCollector = false;
|
||||||
foreach (var collectAssetInfo in allCollectAssetInfos)
|
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||||
{
|
{
|
||||||
var collectorType = collectAssetInfo.CollectorType;
|
var collectorType = collectAssetInfo.CollectorType;
|
||||||
if (collectorType == ECollectorType.DependAssetCollector)
|
if (collectorType == ECollectorType.DependAssetCollector)
|
||||||
{
|
{
|
||||||
hasAnyDependAsset = true;
|
hasAnyDependCollector = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasAnyDependAsset == false)
|
if (hasAnyDependCollector == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 2. 获取所有主资源的依赖资源集合
|
// 2. 获取所有主资源的依赖资源集合
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using UnityEditor;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 100, "资源构建准备工作")]
|
[TaskAttribute("资源构建准备工作")]
|
||||||
public class TaskPrepare : IBuildTask
|
public class TaskPrepare : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
@@ -16,11 +16,27 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
// 检测构建参数合法性
|
// 检测构建参数合法性
|
||||||
if (buildParameters.BuildTarget == BuildTarget.NoTarget)
|
if (buildParameters.BuildTarget == BuildTarget.NoTarget)
|
||||||
throw new Exception("请选择目标平台");
|
throw new Exception("请选择目标平台!");
|
||||||
if (string.IsNullOrEmpty(buildParameters.PackageName))
|
if (string.IsNullOrEmpty(buildParameters.PackageName))
|
||||||
throw new Exception("包裹名称不能为空");
|
throw new Exception("包裹名称不能为空!");
|
||||||
if (string.IsNullOrEmpty(buildParameters.PackageVersion))
|
if (string.IsNullOrEmpty(buildParameters.PackageVersion))
|
||||||
throw new Exception("包裹版本不能为空");
|
throw new Exception("包裹版本不能为空!");
|
||||||
|
if (string.IsNullOrEmpty(buildParameters.BuildOutputRoot))
|
||||||
|
throw new Exception("构建输出的根目录为空!");
|
||||||
|
if (string.IsNullOrEmpty(buildParameters.StreamingAssetsRoot))
|
||||||
|
throw new Exception("内置资源根目录为空!");
|
||||||
|
|
||||||
|
if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||||
|
{
|
||||||
|
if (buildParameters.SBPParameters == null)
|
||||||
|
throw new Exception($"{nameof(BuildParameters.SBPParameters)} is null !");
|
||||||
|
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.DryRunBuild)
|
||||||
|
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.DryRunBuild)} build mode !");
|
||||||
|
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
|
||||||
|
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.ForceRebuild)} build mode !");
|
||||||
|
}
|
||||||
|
|
||||||
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
|
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
|
||||||
{
|
{
|
||||||
@@ -72,11 +88,10 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
|
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
|
||||||
{
|
{
|
||||||
// 删除总目录
|
string packageRootDirectory = buildParametersContext.GetPackageRootDirectory();
|
||||||
string platformDirectory = $"{buildParameters.OutputRoot}/{buildParameters.BuildTarget}/{buildParameters.PackageName}";
|
if (EditorTools.DeleteDirectory(packageRootDirectory))
|
||||||
if (EditorTools.DeleteDirectory(platformDirectory))
|
|
||||||
{
|
{
|
||||||
BuildLogger.Log($"删除平台总目录:{platformDirectory}");
|
BuildLogger.Log($"删除包裹目录:{packageRootDirectory}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using UnityEditor;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.AllPipeline, 700, "更新资源包信息")]
|
[TaskAttribute("更新资源包信息")]
|
||||||
public class TaskUpdateBundleInfo : IBuildTask
|
public class TaskUpdateBundleInfo : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
@@ -29,32 +29,35 @@ namespace YooAsset.Editor
|
|||||||
// 2.更新构建输出的文件路径
|
// 2.更新构建输出的文件路径
|
||||||
foreach (var bundleInfo in buildMapContext.Collection)
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
{
|
{
|
||||||
|
bundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||||
if (bundleInfo.IsEncryptedFile)
|
if (bundleInfo.IsEncryptedFile)
|
||||||
bundleInfo.BundleInfo.BuildOutputFilePath = bundleInfo.EncryptedFilePath;
|
bundleInfo.PackageSourceFilePath = bundleInfo.EncryptedFilePath;
|
||||||
else
|
else
|
||||||
bundleInfo.BundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
bundleInfo.PackageSourceFilePath = bundleInfo.BuildOutputFilePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3.更新文件其它信息
|
// 3.更新文件其它信息
|
||||||
foreach (var bundleInfo in buildMapContext.Collection)
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
{
|
{
|
||||||
string buildOutputFilePath = bundleInfo.BundleInfo.BuildOutputFilePath;
|
bundleInfo.PackageUnityHash = GetUnityHash(bundleInfo, context);
|
||||||
bundleInfo.BundleInfo.ContentHash = GetBundleContentHash(bundleInfo, context);
|
bundleInfo.PackageUnityCRC = GetUnityCRC(bundleInfo, context);
|
||||||
bundleInfo.BundleInfo.FileHash = GetBundleFileHash(buildOutputFilePath, buildParametersContext);
|
bundleInfo.PackageFileHash = GetBundleFileHash(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||||
bundleInfo.BundleInfo.FileCRC = GetBundleFileCRC(buildOutputFilePath, buildParametersContext);
|
bundleInfo.PackageFileCRC = GetBundleFileCRC(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||||
bundleInfo.BundleInfo.FileSize = GetBundleFileSize(buildOutputFilePath, buildParametersContext);
|
bundleInfo.PackageFileSize = GetBundleFileSize(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4.更新补丁包输出的文件路径
|
// 4.更新补丁包输出的文件路径
|
||||||
foreach (var bundleInfo in buildMapContext.Collection)
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
{
|
{
|
||||||
string fileExtension = ManifestTools.GetRemoteBundleFileExtension(bundleInfo.BundleName);
|
string bundleName = bundleInfo.BundleName;
|
||||||
string fileName = ManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleInfo.BundleName, fileExtension, bundleInfo.BundleInfo.FileHash);
|
string fileHash = bundleInfo.PackageFileHash;
|
||||||
bundleInfo.BundleInfo.PackageOutputFilePath = $"{packageOutputDirectory}/{fileName}";
|
string fileExtension = ManifestTools.GetRemoteBundleFileExtension(bundleName);
|
||||||
|
string fileName = ManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleName, fileExtension, fileHash);
|
||||||
|
bundleInfo.PackageDestFilePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetBundleContentHash(BuildBundleInfo bundleInfo, BuildContext context)
|
private string GetUnityHash(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
{
|
{
|
||||||
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
var parameters = buildParametersContext.Parameters;
|
var parameters = buildParametersContext.Parameters;
|
||||||
@@ -64,7 +67,7 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
if (bundleInfo.IsRawFile)
|
if (bundleInfo.IsRawFile)
|
||||||
{
|
{
|
||||||
string filePath = bundleInfo.BundleInfo.BuildOutputFilePath;
|
string filePath = bundleInfo.PackageSourceFilePath;
|
||||||
return HashUtility.FileMD5(filePath);
|
return HashUtility.FileMD5(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +78,7 @@ namespace YooAsset.Editor
|
|||||||
if (hash.isValid)
|
if (hash.isValid)
|
||||||
return hash.ToString();
|
return hash.ToString();
|
||||||
else
|
else
|
||||||
throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
|
throw new Exception($"Not found bundle hash in build result : {bundleInfo.BundleName}");
|
||||||
}
|
}
|
||||||
else if (parameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
else if (parameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||||
{
|
{
|
||||||
@@ -84,7 +87,39 @@ namespace YooAsset.Editor
|
|||||||
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
||||||
return value.Hash.ToString();
|
return value.Hash.ToString();
|
||||||
else
|
else
|
||||||
throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
|
throw new Exception($"Not found bundle hash in build result : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new System.NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private uint GetUnityCRC(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var parameters = buildParametersContext.Parameters;
|
||||||
|
var buildMode = parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (bundleInfo.IsRawFile)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (parameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
||||||
|
{
|
||||||
|
string filePath = bundleInfo.BuildOutputFilePath;
|
||||||
|
if (BuildPipeline.GetCRCForAssetBundle(filePath, out uint crc))
|
||||||
|
return crc;
|
||||||
|
else
|
||||||
|
throw new Exception($"Not found bundle crc in build result : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
else if (parameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||||
|
{
|
||||||
|
var buildResult = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||||
|
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
||||||
|
return value.Crc;
|
||||||
|
else
|
||||||
|
throw new Exception($"Not found bundle crc in build result : {bundleInfo.BundleName}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.BuiltinBuildPipeline, 500, "验证构建结果")]
|
[TaskAttribute("验证构建结果")]
|
||||||
public class TaskVerifyBuildResult : IBuildTask
|
public class TaskVerifyBuildResult : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using UnityEditor.Build.Pipeline.Interfaces;
|
|||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute(ETaskPipeline.ScriptableBuildPipeline, 500, "验证构建结果")]
|
[TaskAttribute("验证构建结果")]
|
||||||
public class TaskVerifyBuildResult_SBP : IBuildTask
|
public class TaskVerifyBuildResult_SBP : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
|||||||
@@ -79,30 +79,6 @@ namespace YooAsset
|
|||||||
_isUnloadSafe = true;
|
_isUnloadSafe = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 销毁
|
|
||||||
/// </summary>
|
|
||||||
public void DestroyAll()
|
|
||||||
{
|
|
||||||
foreach (var provider in _providerList)
|
|
||||||
{
|
|
||||||
provider.Destroy();
|
|
||||||
}
|
|
||||||
_providerList.Clear();
|
|
||||||
_providerDic.Clear();
|
|
||||||
|
|
||||||
foreach (var loader in _loaderList)
|
|
||||||
{
|
|
||||||
loader.Destroy(true);
|
|
||||||
}
|
|
||||||
_loaderList.Clear();
|
|
||||||
_loaderDic.Clear();
|
|
||||||
|
|
||||||
ClearSceneHandle();
|
|
||||||
DecryptionServices = null;
|
|
||||||
BundleServices = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源回收(卸载引用计数为零的资源)
|
/// 资源回收(卸载引用计数为零的资源)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -135,7 +111,7 @@ namespace YooAsset
|
|||||||
if (loader.CanDestroy())
|
if (loader.CanDestroy())
|
||||||
{
|
{
|
||||||
string bundleName = loader.MainBundleInfo.Bundle.BundleName;
|
string bundleName = loader.MainBundleInfo.Bundle.BundleName;
|
||||||
loader.Destroy(false);
|
loader.Destroy();
|
||||||
_loaderList.RemoveAt(i);
|
_loaderList.RemoveAt(i);
|
||||||
_loaderDic.Remove(bundleName);
|
_loaderDic.Remove(bundleName);
|
||||||
}
|
}
|
||||||
@@ -147,13 +123,16 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void ForceUnloadAllAssets()
|
public void ForceUnloadAllAssets()
|
||||||
{
|
{
|
||||||
|
#if UNITY_WEBGL
|
||||||
|
throw new Exception($"WebGL not support invoke {nameof(ForceUnloadAllAssets)}");
|
||||||
|
#else
|
||||||
foreach (var provider in _providerList)
|
foreach (var provider in _providerList)
|
||||||
{
|
{
|
||||||
provider.Destroy();
|
provider.DestroySafely();
|
||||||
}
|
}
|
||||||
foreach (var loader in _loaderList)
|
foreach (var loader in _loaderList)
|
||||||
{
|
{
|
||||||
loader.Destroy(true);
|
loader.DestroySafely();
|
||||||
}
|
}
|
||||||
|
|
||||||
_providerList.Clear();
|
_providerList.Clear();
|
||||||
@@ -164,6 +143,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
// 注意:调用底层接口释放所有资源
|
// 注意:调用底层接口释放所有资源
|
||||||
Resources.UnloadUnusedAssets();
|
Resources.UnloadUnusedAssets();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -436,7 +416,7 @@ namespace YooAsset
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 调试信息
|
#region 调试信息
|
||||||
internal List<DebugProviderInfo> GetDebugReportInfos()
|
internal List<DebugProviderInfo> GetDebugReportInfos()
|
||||||
{
|
{
|
||||||
List<DebugProviderInfo> result = new List<DebugProviderInfo>(_providerList.Count);
|
List<DebugProviderInfo> result = new List<DebugProviderInfo>(_providerList.Count);
|
||||||
@@ -464,6 +444,6 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,9 +73,7 @@ namespace YooAsset
|
|||||||
if (IsValidWithWarning == false)
|
if (IsValidWithWarning == false)
|
||||||
return null;
|
return null;
|
||||||
string filePath = Provider.RawFilePath;
|
string filePath = Provider.RawFilePath;
|
||||||
if (File.Exists(filePath) == false)
|
return FileUtility.ReadAllBytes(filePath);
|
||||||
return null;
|
|
||||||
return File.ReadAllBytes(filePath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -82,7 +82,8 @@ namespace YooAsset
|
|||||||
if (_steps == ESteps.Download)
|
if (_steps == ESteps.Download)
|
||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain);
|
||||||
|
_downloader.SendRequest();
|
||||||
_steps = ESteps.CheckDownload;
|
_steps = ESteps.CheckDownload;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +113,8 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||||
_unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
_unpacker = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain);
|
||||||
|
_unpacker.SendRequest();
|
||||||
_steps = ESteps.CheckUnpack;
|
_steps = ESteps.CheckUnpack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,9 +264,9 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 销毁
|
/// 销毁
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void Destroy(bool forceDestroy)
|
public override void Destroy()
|
||||||
{
|
{
|
||||||
base.Destroy(forceDestroy);
|
base.Destroy();
|
||||||
|
|
||||||
if (_stream != null)
|
if (_stream != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,21 +15,14 @@ namespace YooAsset
|
|||||||
private enum ESteps
|
private enum ESteps
|
||||||
{
|
{
|
||||||
None = 0,
|
None = 0,
|
||||||
Download,
|
LoadWebSiteFile,
|
||||||
CheckDownload,
|
LoadRemoteFile,
|
||||||
LoadCacheFile,
|
CheckLoadFile,
|
||||||
CheckLoadCacheFile,
|
|
||||||
LoadWebFile,
|
|
||||||
CheckLoadWebFile,
|
|
||||||
TryLoadWebFile,
|
|
||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
private float _tryTimer = 0;
|
private WebDownloader _downloader;
|
||||||
private DownloaderBase _downloader;
|
|
||||||
private UnityWebRequest _webRequest;
|
|
||||||
private AssetBundleCreateRequest _createRequest;
|
|
||||||
|
|
||||||
|
|
||||||
public AssetBundleWebLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
|
public AssetBundleWebLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
|
||||||
@@ -48,18 +41,13 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
|
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Download;
|
_steps = ESteps.LoadRemoteFile;
|
||||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
FileLoadPath = string.Empty;
|
||||||
}
|
}
|
||||||
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
|
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
|
||||||
{
|
{
|
||||||
_steps = ESteps.LoadWebFile;
|
_steps = ESteps.LoadWebSiteFile;
|
||||||
FileLoadPath = MainBundleInfo.Bundle.StreamingFilePath;
|
FileLoadPath = string.Empty;
|
||||||
}
|
|
||||||
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
|
|
||||||
{
|
|
||||||
_steps = ESteps.LoadCacheFile;
|
|
||||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -67,159 +55,49 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. 从服务器下载
|
// 1. 跨域获取资源包
|
||||||
if (_steps == ESteps.Download)
|
if (_steps == ESteps.LoadRemoteFile)
|
||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain) as WebDownloader;
|
||||||
_steps = ESteps.CheckDownload;
|
_downloader.SendRequest(true);
|
||||||
|
_steps = ESteps.CheckLoadFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 检测服务器下载结果
|
// 2. 从站点获取资源包
|
||||||
if (_steps == ESteps.CheckDownload)
|
if (_steps == ESteps.LoadWebSiteFile)
|
||||||
|
{
|
||||||
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
|
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||||
|
_downloader = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain) as WebDownloader;
|
||||||
|
_downloader.SendRequest(true);
|
||||||
|
_steps = ESteps.CheckLoadFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 检测加载结果
|
||||||
|
if (_steps == ESteps.CheckLoadFile)
|
||||||
{
|
{
|
||||||
DownloadProgress = _downloader.DownloadProgress;
|
DownloadProgress = _downloader.DownloadProgress;
|
||||||
DownloadedBytes = _downloader.DownloadedBytes;
|
DownloadedBytes = _downloader.DownloadedBytes;
|
||||||
if (_downloader.IsDone() == false)
|
if (_downloader.IsDone() == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_downloader.HasError())
|
CacheBundle = _downloader.GetAssetBundle();
|
||||||
{
|
|
||||||
_steps = ESteps.Done;
|
|
||||||
Status = EStatus.Failed;
|
|
||||||
LastError = _downloader.GetLastError();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_steps = ESteps.LoadCacheFile;
|
|
||||||
return; //下载完毕等待一帧再去加载!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 从本地缓存里加载AssetBundle
|
|
||||||
if (_steps == ESteps.LoadCacheFile)
|
|
||||||
{
|
|
||||||
#if UNITY_EDITOR
|
|
||||||
// 注意:Unity2017.4编辑器模式下,如果AssetBundle文件不存在会导致编辑器崩溃,这里做了预判。
|
|
||||||
if (System.IO.File.Exists(FileLoadPath) == false)
|
|
||||||
{
|
|
||||||
_steps = ESteps.Done;
|
|
||||||
Status = EStatus.Failed;
|
|
||||||
LastError = $"Not found assetBundle file : {FileLoadPath}";
|
|
||||||
YooLogger.Error(LastError);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// 设置下载进度
|
|
||||||
DownloadProgress = 1f;
|
|
||||||
DownloadedBytes = (ulong)MainBundleInfo.Bundle.FileSize;
|
|
||||||
|
|
||||||
// Load assetBundle file
|
|
||||||
var loadMethod = (EBundleLoadMethod)MainBundleInfo.Bundle.LoadMethod;
|
|
||||||
if (loadMethod == EBundleLoadMethod.Normal)
|
|
||||||
{
|
|
||||||
_createRequest = AssetBundle.LoadFromFileAsync(FileLoadPath);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_steps = ESteps.Done;
|
|
||||||
Status = EStatus.Failed;
|
|
||||||
LastError = $"WebGL not support encrypted bundle file : {MainBundleInfo.Bundle.BundleName}";
|
|
||||||
YooLogger.Error(LastError);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_steps = ESteps.CheckLoadCacheFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. 检测AssetBundle加载结果
|
|
||||||
if (_steps == ESteps.CheckLoadCacheFile)
|
|
||||||
{
|
|
||||||
if (_createRequest.isDone == false)
|
|
||||||
return;
|
|
||||||
|
|
||||||
CacheBundle = _createRequest.assetBundle;
|
|
||||||
if (CacheBundle == null)
|
if (CacheBundle == null)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EStatus.Failed;
|
Status = EStatus.Failed;
|
||||||
LastError = $"Failed to load AssetBundle file : {MainBundleInfo.Bundle.BundleName}";
|
LastError = $"AssetBundle file is invalid : {MainBundleInfo.Bundle.BundleName}";
|
||||||
YooLogger.Error(LastError);
|
YooLogger.Error(LastError);
|
||||||
|
|
||||||
// 注意:当缓存文件的校验等级为Low的时候,并不能保证缓存文件的完整性。
|
|
||||||
// 在AssetBundle文件加载失败的情况下,我们需要重新验证文件的完整性!
|
|
||||||
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
|
|
||||||
{
|
|
||||||
var result = CacheSystem.VerifyingRecordFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
|
|
||||||
if (result != EVerifyResult.Succeed)
|
|
||||||
{
|
|
||||||
YooLogger.Error($"Found possibly corrupt file ! {MainBundleInfo.Bundle.CacheGUID}");
|
|
||||||
CacheSystem.DiscardFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EStatus.Succeed;
|
Status = EStatus.Succeed;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// 5. 从WEB网站获取AssetBundle文件
|
// 注意:释放下载句柄
|
||||||
if (_steps == ESteps.LoadWebFile)
|
_downloader.DisposeHandler();
|
||||||
{
|
|
||||||
var hash = Hash128.Parse(MainBundleInfo.Bundle.FileHash);
|
|
||||||
_webRequest = UnityWebRequestAssetBundle.GetAssetBundle(FileLoadPath, hash);
|
|
||||||
_webRequest.SendWebRequest();
|
|
||||||
_steps = ESteps.CheckLoadWebFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 6. 检测AssetBundle加载结果
|
|
||||||
if (_steps == ESteps.CheckLoadWebFile)
|
|
||||||
{
|
|
||||||
DownloadProgress = _webRequest.downloadProgress;
|
|
||||||
DownloadedBytes = _webRequest.downloadedBytes;
|
|
||||||
if (_webRequest.isDone == false)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if UNITY_2020_1_OR_NEWER
|
|
||||||
if (_webRequest.result != UnityWebRequest.Result.Success)
|
|
||||||
#else
|
|
||||||
if (_webRequest.isNetworkError || _webRequest.isHttpError)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
YooLogger.Warning($"Failed to get asset bundle from web : {FileLoadPath} Error : {_webRequest.error}");
|
|
||||||
_steps = ESteps.TryLoadWebFile;
|
|
||||||
_tryTimer = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CacheBundle = DownloadHandlerAssetBundle.GetContent(_webRequest);
|
|
||||||
if (CacheBundle == null)
|
|
||||||
{
|
|
||||||
_steps = ESteps.Done;
|
|
||||||
Status = EStatus.Failed;
|
|
||||||
LastError = $"AssetBundle file is invalid : {MainBundleInfo.Bundle.BundleName}";
|
|
||||||
YooLogger.Error(LastError);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_steps = ESteps.Done;
|
|
||||||
Status = EStatus.Succeed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 7. 如果获取失败,重新尝试
|
|
||||||
if (_steps == ESteps.TryLoadWebFile)
|
|
||||||
{
|
|
||||||
_tryTimer += Time.unscaledDeltaTime;
|
|
||||||
if (_tryTimer > 1f)
|
|
||||||
{
|
|
||||||
_webRequest.Dispose();
|
|
||||||
_webRequest = null;
|
|
||||||
_steps = ESteps.LoadWebFile;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -144,6 +144,15 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 销毁资源包(安全模式)
|
||||||
|
/// </summary>
|
||||||
|
public void DestroySafely()
|
||||||
|
{
|
||||||
|
WaitForAsyncComplete();
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 轮询更新
|
/// 轮询更新
|
||||||
@@ -153,18 +162,15 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 销毁
|
/// 销毁
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void Destroy(bool forceDestroy)
|
public virtual void Destroy()
|
||||||
{
|
{
|
||||||
IsDestroyed = true;
|
IsDestroyed = true;
|
||||||
|
|
||||||
// Check fatal
|
// Check fatal
|
||||||
if (forceDestroy == false)
|
if (RefCount > 0)
|
||||||
{
|
throw new Exception($"Bundle file loader ref is not zero : {MainBundleInfo.Bundle.BundleName}");
|
||||||
if (RefCount > 0)
|
if (IsDone() == false)
|
||||||
throw new Exception($"Bundle file loader ref is not zero : {MainBundleInfo.Bundle.BundleName}");
|
throw new Exception($"Bundle file loader is not done : {MainBundleInfo.Bundle.BundleName}");
|
||||||
if (IsDone() == false)
|
|
||||||
throw new Exception($"Bundle file loader is not done : {MainBundleInfo.Bundle.BundleName}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CacheBundle != null)
|
if (CacheBundle != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ namespace YooAsset
|
|||||||
if (_steps == ESteps.Download)
|
if (_steps == ESteps.Download)
|
||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain);
|
||||||
|
_downloader.SendRequest();
|
||||||
_steps = ESteps.CheckDownload;
|
_steps = ESteps.CheckDownload;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +94,8 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||||
_unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
_unpacker = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain);
|
||||||
|
_unpacker.SendRequest();
|
||||||
_steps = ESteps.CheckUnpack;
|
_steps = ESteps.CheckUnpack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,11 +47,6 @@ namespace YooAsset
|
|||||||
_steps = ESteps.Website;
|
_steps = ESteps.Website;
|
||||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
||||||
}
|
}
|
||||||
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
|
|
||||||
{
|
|
||||||
_steps = ESteps.CheckFile;
|
|
||||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException(MainBundleInfo.LoadMode.ToString());
|
throw new System.NotImplementedException(MainBundleInfo.LoadMode.ToString());
|
||||||
@@ -62,7 +57,8 @@ namespace YooAsset
|
|||||||
if (_steps == ESteps.Download)
|
if (_steps == ESteps.Download)
|
||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain);
|
||||||
|
_downloader.SendRequest();
|
||||||
_steps = ESteps.CheckDownload;
|
_steps = ESteps.CheckDownload;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +87,8 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||||
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||||
_website = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
_website = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain);
|
||||||
|
_website.SendRequest();
|
||||||
_steps = ESteps.CheckWebsite;
|
_steps = ESteps.CheckWebsite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ namespace YooAsset
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (OwnerBundle.CacheBundle == null)
|
||||||
|
{
|
||||||
|
ProcessCacheBundleException();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Status = EStatus.Loading;
|
Status = EStatus.Loading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,12 +55,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (OwnerBundle.CacheBundle == null)
|
if (OwnerBundle.CacheBundle == null)
|
||||||
{
|
{
|
||||||
if (OwnerBundle.IsDestroyed)
|
ProcessCacheBundleException();
|
||||||
throw new System.Exception("Should never get here !");
|
|
||||||
Status = EStatus.Failed;
|
|
||||||
LastError = $"The bundle {OwnerBundle.MainBundleInfo.Bundle.BundleName} has been destroyed by unity bugs !";
|
|
||||||
YooLogger.Error(LastError);
|
|
||||||
InvokeCompletion();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ namespace YooAsset
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (OwnerBundle.CacheBundle == null)
|
||||||
|
{
|
||||||
|
ProcessCacheBundleException();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Status = EStatus.Loading;
|
Status = EStatus.Loading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 销毁资源对象
|
/// 销毁资源对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void Destroy()
|
public void Destroy()
|
||||||
{
|
{
|
||||||
IsDestroyed = true;
|
IsDestroyed = true;
|
||||||
|
|
||||||
@@ -140,6 +140,22 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 销毁资源对象(安全模式)
|
||||||
|
/// </summary>
|
||||||
|
public void DestroySafely()
|
||||||
|
{
|
||||||
|
if (Status == EStatus.Loading || Status == EStatus.Checking)
|
||||||
|
{
|
||||||
|
WaitForAsyncComplete();
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否可以销毁
|
/// 是否可以销毁
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -220,6 +236,30 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理特殊异常
|
||||||
|
/// </summary>
|
||||||
|
protected void ProcessCacheBundleException()
|
||||||
|
{
|
||||||
|
if (OwnerBundle.IsDestroyed)
|
||||||
|
throw new System.Exception("Should never get here !");
|
||||||
|
|
||||||
|
if (OwnerBundle.MainBundleInfo.Bundle.IsRawFile)
|
||||||
|
{
|
||||||
|
Status = EStatus.Failed;
|
||||||
|
LastError = $"Cannot load asset bundle file using {nameof(ResourcePackage.LoadRawFileAsync)} method !";
|
||||||
|
YooLogger.Error(LastError);
|
||||||
|
InvokeCompletion();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = EStatus.Failed;
|
||||||
|
LastError = $"The bundle {OwnerBundle.MainBundleInfo.Bundle.BundleName} has been destroyed by unity bugs !";
|
||||||
|
YooLogger.Error(LastError);
|
||||||
|
InvokeCompletion();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 异步操作任务
|
/// 异步操作任务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -10,6 +10,11 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
private readonly static Dictionary<string, PackageCache> _cachedDic = new Dictionary<string, PackageCache>(1000);
|
private readonly static Dictionary<string, PackageCache> _cachedDic = new Dictionary<string, PackageCache>(1000);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 禁用Unity缓存系统在WebGL平台
|
||||||
|
/// </summary>
|
||||||
|
public static bool DisableUnityCacheOnWebGL = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化时的验证级别
|
/// 初始化时的验证级别
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -88,7 +93,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 验证缓存文件(子线程内操作)
|
/// 验证缓存文件(子线程内操作)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static EVerifyResult VerifyingCacheFile(VerifyCacheElement element)
|
public static EVerifyResult VerifyingCacheFile(VerifyCacheFileElement element)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -120,7 +125,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 验证下载文件(子线程内操作)
|
/// 验证下载文件(子线程内操作)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static EVerifyResult VerifyingTempFile(VerifyTempElement element)
|
public static EVerifyResult VerifyingTempFile(VerifyTempFileElement element)
|
||||||
{
|
{
|
||||||
return VerifyingInternal(element.TempDataFilePath, element.FileSize, element.FileCRC, EVerifyLevel.High);
|
return VerifyingInternal(element.TempDataFilePath, element.FileSize, element.FileCRC, EVerifyLevel.High);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 需要验证的元素
|
/// 需要验证的元素
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly List<VerifyCacheElement> VerifyElements = new List<VerifyCacheElement>(5000);
|
public readonly List<VerifyCacheFileElement> VerifyElements = new List<VerifyCacheFileElement>(5000);
|
||||||
|
|
||||||
public FindCacheFilesOperation(string packageName)
|
public FindCacheFilesOperation(string packageName)
|
||||||
{
|
{
|
||||||
@@ -45,7 +45,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
// BundleFiles
|
// BundleFiles
|
||||||
{
|
{
|
||||||
string rootPath = PersistentTools.GetCachedBundleFileFolderPath(_packageName);
|
string rootPath = PersistentTools.GetPersistent(_packageName).SandboxCacheBundleFilesRoot;
|
||||||
DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
|
DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
|
||||||
if (rootDirectory.Exists)
|
if (rootDirectory.Exists)
|
||||||
{
|
{
|
||||||
@@ -56,7 +56,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
// RawFiles
|
// RawFiles
|
||||||
{
|
{
|
||||||
string rootPath = PersistentTools.GetCachedRawFileFolderPath(_packageName);
|
string rootPath = PersistentTools.GetPersistent(_packageName).SandboxCacheRawFilesRoot;
|
||||||
DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
|
DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
|
||||||
if (rootDirectory.Exists)
|
if (rootDirectory.Exists)
|
||||||
{
|
{
|
||||||
@@ -113,7 +113,7 @@ namespace YooAsset
|
|||||||
string fileRootPath = chidDirectory.FullName;
|
string fileRootPath = chidDirectory.FullName;
|
||||||
string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}";
|
string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}";
|
||||||
string infoFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleInfoFileName}";
|
string infoFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleInfoFileName}";
|
||||||
VerifyCacheElement element = new VerifyCacheElement(_packageName, cacheGUID, fileRootPath, dataFilePath, infoFilePath);
|
VerifyCacheFileElement element = new VerifyCacheFileElement(_packageName, cacheGUID, fileRootPath, dataFilePath, infoFilePath);
|
||||||
VerifyElements.Add(element);
|
VerifyElements.Add(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ namespace YooAsset
|
|||||||
string fileRootPath = chidDirectory.FullName;
|
string fileRootPath = chidDirectory.FullName;
|
||||||
string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}{dataFileExtension}";
|
string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}{dataFileExtension}";
|
||||||
string infoFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleInfoFileName}";
|
string infoFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleInfoFileName}";
|
||||||
VerifyCacheElement element = new VerifyCacheElement(_packageName, cacheGUID, fileRootPath, dataFilePath, infoFilePath);
|
VerifyCacheFileElement element = new VerifyCacheFileElement(_packageName, cacheGUID, fileRootPath, dataFilePath, infoFilePath);
|
||||||
VerifyElements.Add(element);
|
VerifyElements.Add(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
internal abstract class VerifyCacheFilesOperation : AsyncOperationBase
|
internal abstract class VerifyCacheFilesOperation : AsyncOperationBase
|
||||||
{
|
{
|
||||||
public static VerifyCacheFilesOperation CreateOperation(List<VerifyCacheElement> elements)
|
public static VerifyCacheFilesOperation CreateOperation(List<VerifyCacheFileElement> elements)
|
||||||
{
|
{
|
||||||
#if UNITY_WEBGL
|
#if UNITY_WEBGL
|
||||||
var operation = new VerifyCacheFilesWithoutThreadOperation(elements);
|
var operation = new VerifyCacheFilesWithoutThreadOperation(elements);
|
||||||
@@ -33,8 +33,8 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly ThreadSyncContext _syncContext = new ThreadSyncContext();
|
private readonly ThreadSyncContext _syncContext = new ThreadSyncContext();
|
||||||
private List<VerifyCacheElement> _waitingList;
|
private List<VerifyCacheFileElement> _waitingList;
|
||||||
private List<VerifyCacheElement> _verifyingList;
|
private List<VerifyCacheFileElement> _verifyingList;
|
||||||
private int _verifyMaxNum;
|
private int _verifyMaxNum;
|
||||||
private int _verifyTotalCount;
|
private int _verifyTotalCount;
|
||||||
private float _verifyStartTime;
|
private float _verifyStartTime;
|
||||||
@@ -42,7 +42,7 @@ namespace YooAsset
|
|||||||
private int _failedCount;
|
private int _failedCount;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VerifyCacheFilesWithThreadOperation(List<VerifyCacheElement> elements)
|
public VerifyCacheFilesWithThreadOperation(List<VerifyCacheFileElement> elements)
|
||||||
{
|
{
|
||||||
_waitingList = elements;
|
_waitingList = elements;
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,7 @@ namespace YooAsset
|
|||||||
if (_verifyMaxNum < 1)
|
if (_verifyMaxNum < 1)
|
||||||
_verifyMaxNum = 1;
|
_verifyMaxNum = 1;
|
||||||
|
|
||||||
_verifyingList = new List<VerifyCacheElement>(_verifyMaxNum);
|
_verifyingList = new List<VerifyCacheFileElement>(_verifyMaxNum);
|
||||||
_steps = ESteps.UpdateVerify;
|
_steps = ESteps.UpdateVerify;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,19 +114,19 @@ namespace YooAsset
|
|||||||
return 1f;
|
return 1f;
|
||||||
return (float)(_succeedCount + _failedCount) / _verifyTotalCount;
|
return (float)(_succeedCount + _failedCount) / _verifyTotalCount;
|
||||||
}
|
}
|
||||||
private bool BeginVerifyFileWithThread(VerifyCacheElement element)
|
private bool BeginVerifyFileWithThread(VerifyCacheFileElement element)
|
||||||
{
|
{
|
||||||
return ThreadPool.QueueUserWorkItem(new WaitCallback(VerifyInThread), element);
|
return ThreadPool.QueueUserWorkItem(new WaitCallback(VerifyInThread), element);
|
||||||
}
|
}
|
||||||
private void VerifyInThread(object obj)
|
private void VerifyInThread(object obj)
|
||||||
{
|
{
|
||||||
VerifyCacheElement element = (VerifyCacheElement)obj;
|
VerifyCacheFileElement element = (VerifyCacheFileElement)obj;
|
||||||
element.Result = CacheSystem.VerifyingCacheFile(element);
|
element.Result = CacheSystem.VerifyingCacheFile(element);
|
||||||
_syncContext.Post(VerifyCallback, element);
|
_syncContext.Post(VerifyCallback, element);
|
||||||
}
|
}
|
||||||
private void VerifyCallback(object obj)
|
private void VerifyCallback(object obj)
|
||||||
{
|
{
|
||||||
VerifyCacheElement element = (VerifyCacheElement)obj;
|
VerifyCacheFileElement element = (VerifyCacheFileElement)obj;
|
||||||
_verifyingList.Remove(element);
|
_verifyingList.Remove(element);
|
||||||
|
|
||||||
if (element.Result == EVerifyResult.Succeed)
|
if (element.Result == EVerifyResult.Succeed)
|
||||||
@@ -158,8 +158,8 @@ namespace YooAsset
|
|||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<VerifyCacheElement> _waitingList;
|
private List<VerifyCacheFileElement> _waitingList;
|
||||||
private List<VerifyCacheElement> _verifyingList;
|
private List<VerifyCacheFileElement> _verifyingList;
|
||||||
private int _verifyMaxNum;
|
private int _verifyMaxNum;
|
||||||
private int _verifyTotalCount;
|
private int _verifyTotalCount;
|
||||||
private float _verifyStartTime;
|
private float _verifyStartTime;
|
||||||
@@ -167,7 +167,7 @@ namespace YooAsset
|
|||||||
private int _failedCount;
|
private int _failedCount;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VerifyCacheFilesWithoutThreadOperation(List<VerifyCacheElement> elements)
|
public VerifyCacheFilesWithoutThreadOperation(List<VerifyCacheFileElement> elements)
|
||||||
{
|
{
|
||||||
_waitingList = elements;
|
_waitingList = elements;
|
||||||
}
|
}
|
||||||
@@ -189,7 +189,7 @@ namespace YooAsset
|
|||||||
_verifyMaxNum = fileCount;
|
_verifyMaxNum = fileCount;
|
||||||
_verifyTotalCount = fileCount;
|
_verifyTotalCount = fileCount;
|
||||||
|
|
||||||
_verifyingList = new List<VerifyCacheElement>(_verifyMaxNum);
|
_verifyingList = new List<VerifyCacheFileElement>(_verifyMaxNum);
|
||||||
_steps = ESteps.UpdateVerify;
|
_steps = ESteps.UpdateVerify;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ namespace YooAsset
|
|||||||
return 1f;
|
return 1f;
|
||||||
return (float)(_succeedCount + _failedCount) / _verifyTotalCount;
|
return (float)(_succeedCount + _failedCount) / _verifyTotalCount;
|
||||||
}
|
}
|
||||||
private void BeginVerifyFileWithoutThread(VerifyCacheElement element)
|
private void BeginVerifyFileWithoutThread(VerifyCacheFileElement element)
|
||||||
{
|
{
|
||||||
element.Result = CacheSystem.VerifyingCacheFile(element);
|
element.Result = CacheSystem.VerifyingCacheFile(element);
|
||||||
if (element.Result == EVerifyResult.Succeed)
|
if (element.Result == EVerifyResult.Succeed)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
public EVerifyResult VerifyResult { protected set; get; }
|
public EVerifyResult VerifyResult { protected set; get; }
|
||||||
|
|
||||||
public static VerifyTempFileOperation CreateOperation(VerifyTempElement element)
|
public static VerifyTempFileOperation CreateOperation(VerifyTempFileElement element)
|
||||||
{
|
{
|
||||||
#if UNITY_WEBGL
|
#if UNITY_WEBGL
|
||||||
var operation = new VerifyTempFileWithoutThreadOperation(element);
|
var operation = new VerifyTempFileWithoutThreadOperation(element);
|
||||||
@@ -34,10 +34,10 @@ namespace YooAsset
|
|||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly VerifyTempElement _element;
|
private readonly VerifyTempFileElement _element;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VerifyTempFileWithThreadOperation(VerifyTempElement element)
|
public VerifyTempFileWithThreadOperation(VerifyTempFileElement element)
|
||||||
{
|
{
|
||||||
_element = element;
|
_element = element;
|
||||||
}
|
}
|
||||||
@@ -79,13 +79,13 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool BeginVerifyFileWithThread(VerifyTempElement element)
|
private bool BeginVerifyFileWithThread(VerifyTempFileElement element)
|
||||||
{
|
{
|
||||||
return ThreadPool.QueueUserWorkItem(new WaitCallback(VerifyInThread), element);
|
return ThreadPool.QueueUserWorkItem(new WaitCallback(VerifyInThread), element);
|
||||||
}
|
}
|
||||||
private void VerifyInThread(object obj)
|
private void VerifyInThread(object obj)
|
||||||
{
|
{
|
||||||
VerifyTempElement element = (VerifyTempElement)obj;
|
VerifyTempFileElement element = (VerifyTempFileElement)obj;
|
||||||
int result = (int)CacheSystem.VerifyingTempFile(element);
|
int result = (int)CacheSystem.VerifyingTempFile(element);
|
||||||
element.Result = result;
|
element.Result = result;
|
||||||
}
|
}
|
||||||
@@ -103,10 +103,10 @@ namespace YooAsset
|
|||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly VerifyTempElement _element;
|
private readonly VerifyTempFileElement _element;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VerifyTempFileWithoutThreadOperation(VerifyTempElement element)
|
public VerifyTempFileWithoutThreadOperation(VerifyTempFileElement element)
|
||||||
{
|
{
|
||||||
_element = element;
|
_element = element;
|
||||||
}
|
}
|
||||||
|
|||||||
163
Assets/YooAsset/Runtime/CacheSystem/Persistent.cs
Normal file
163
Assets/YooAsset/Runtime/CacheSystem/Persistent.cs
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal class Persistent
|
||||||
|
{
|
||||||
|
private readonly string _packageName;
|
||||||
|
|
||||||
|
public string BuildinRoot { private set; get; }
|
||||||
|
public string BuildinPackageRoot { private set; get; }
|
||||||
|
|
||||||
|
public string SandboxRoot { private set; get; }
|
||||||
|
public string SandboxPackageRoot { private set; get; }
|
||||||
|
public string SandboxCacheBundleFilesRoot { private set; get; }
|
||||||
|
public string SandboxCacheRawFilesRoot { private set; get; }
|
||||||
|
public string SandboxManifestFilesRoot { private set; get; }
|
||||||
|
public string SandboxAppFootPrintFilePath { private set; get; }
|
||||||
|
|
||||||
|
|
||||||
|
public Persistent(string packageName)
|
||||||
|
{
|
||||||
|
_packageName = packageName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重写根路径
|
||||||
|
/// </summary>
|
||||||
|
public void OverwriteRootDirectory(string buildinRoot, string sandboxRoot)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(buildinRoot))
|
||||||
|
BuildinRoot = CreateDefaultBuildinRoot();
|
||||||
|
else
|
||||||
|
BuildinRoot = buildinRoot;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(sandboxRoot))
|
||||||
|
SandboxRoot = CreateDefaultSandboxRoot();
|
||||||
|
else
|
||||||
|
SandboxRoot = sandboxRoot;
|
||||||
|
|
||||||
|
BuildinPackageRoot = PathUtility.Combine(BuildinRoot, _packageName);
|
||||||
|
SandboxPackageRoot = PathUtility.Combine(SandboxRoot, _packageName);
|
||||||
|
SandboxCacheBundleFilesRoot = PathUtility.Combine(SandboxPackageRoot, YooAssetSettings.CachedBundleFileFolder);
|
||||||
|
SandboxCacheRawFilesRoot = PathUtility.Combine(SandboxPackageRoot, YooAssetSettings.CachedRawFileFolder);
|
||||||
|
SandboxManifestFilesRoot = PathUtility.Combine(SandboxPackageRoot, YooAssetSettings.ManifestFolderName);
|
||||||
|
SandboxAppFootPrintFilePath = PathUtility.Combine(SandboxPackageRoot, YooAssetSettings.AppFootPrintFileName);
|
||||||
|
}
|
||||||
|
private static string CreateDefaultBuildinRoot()
|
||||||
|
{
|
||||||
|
return PathUtility.Combine(UnityEngine.Application.streamingAssetsPath, YooAssetSettings.DefaultYooFolderName);
|
||||||
|
}
|
||||||
|
private static string CreateDefaultSandboxRoot()
|
||||||
|
{
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
// 注意:为了方便调试查看,编辑器下把存储目录放到项目里。
|
||||||
|
string projectPath = Path.GetDirectoryName(UnityEngine.Application.dataPath);
|
||||||
|
projectPath = PathUtility.RegularPath(projectPath);
|
||||||
|
return PathUtility.Combine(projectPath, YooAssetSettings.DefaultYooFolderName);
|
||||||
|
#elif UNITY_STANDALONE
|
||||||
|
return PathUtility.Combine(UnityEngine.Application.dataPath, YooAssetSettings.DefaultYooFolderName);
|
||||||
|
#else
|
||||||
|
return PathUtility.Combine(UnityEngine.Application.persistentDataPath, YooAssetSettings.DefaultYooFolderName);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除沙盒里的包裹目录
|
||||||
|
/// </summary>
|
||||||
|
public void DeleteSandboxPackageFolder()
|
||||||
|
{
|
||||||
|
if (Directory.Exists(SandboxPackageRoot))
|
||||||
|
Directory.Delete(SandboxPackageRoot, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除沙盒内的缓存文件夹
|
||||||
|
/// </summary>
|
||||||
|
public void DeleteSandboxCacheFilesFolder()
|
||||||
|
{
|
||||||
|
// CacheBundleFiles
|
||||||
|
if (Directory.Exists(SandboxCacheBundleFilesRoot))
|
||||||
|
Directory.Delete(SandboxCacheBundleFilesRoot, true);
|
||||||
|
|
||||||
|
// CacheRawFiles
|
||||||
|
if (Directory.Exists(SandboxCacheRawFilesRoot))
|
||||||
|
Directory.Delete(SandboxCacheRawFilesRoot, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除沙盒内的清单文件夹
|
||||||
|
/// </summary>
|
||||||
|
public void DeleteSandboxManifestFilesFolder()
|
||||||
|
{
|
||||||
|
if (Directory.Exists(SandboxManifestFilesRoot))
|
||||||
|
Directory.Delete(SandboxManifestFilesRoot, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取沙盒内包裹的清单文件的路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetSandboxPackageManifestFilePath(string packageVersion)
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_packageName, packageVersion);
|
||||||
|
return PathUtility.Combine(SandboxManifestFilesRoot, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取沙盒内包裹的哈希文件的路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetSandboxPackageHashFilePath(string packageVersion)
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageHashFileName(_packageName, packageVersion);
|
||||||
|
return PathUtility.Combine(SandboxManifestFilesRoot, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取沙盒内包裹的版本文件的路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetSandboxPackageVersionFilePath()
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageVersionFileName(_packageName);
|
||||||
|
return PathUtility.Combine(SandboxManifestFilesRoot, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存沙盒内默认的包裹版本
|
||||||
|
/// </summary>
|
||||||
|
public void SaveSandboxPackageVersionFile(string version)
|
||||||
|
{
|
||||||
|
string filePath = GetSandboxPackageVersionFilePath();
|
||||||
|
FileUtility.WriteAllText(filePath, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取APP内包裹的清单文件的路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetBuildinPackageManifestFilePath(string packageVersion)
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_packageName, packageVersion);
|
||||||
|
return PathUtility.Combine(BuildinPackageRoot, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取APP内包裹的哈希文件的路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetBuildinPackageHashFilePath(string packageVersion)
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageHashFileName(_packageName, packageVersion);
|
||||||
|
return PathUtility.Combine(BuildinPackageRoot, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取APP内包裹的版本文件的路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetBuildinPackageVersionFilePath()
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageVersionFileName(_packageName);
|
||||||
|
return PathUtility.Combine(BuildinPackageRoot, fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 32477ef3a448a9144aa1574a052fe54e
|
guid: 62ee5fd2821fe85488efff3f8242b703
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
@@ -3,84 +3,31 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal static class PersistentTools
|
internal class PersistentTools
|
||||||
{
|
{
|
||||||
private const string SandboxFolderName = "Sandbox";
|
private static readonly Dictionary<string, Persistent> _persitentDic = new Dictionary<string, Persistent>(100);
|
||||||
private const string CacheFolderName = "CacheFiles";
|
|
||||||
private const string CachedBundleFileFolder = "BundleFiles";
|
|
||||||
private const string CachedRawFileFolder = "RawFiles";
|
|
||||||
private const string ManifestFolderName = "ManifestFiles";
|
|
||||||
private const string AppFootPrintFileName = "ApplicationFootPrint.bytes";
|
|
||||||
|
|
||||||
private static string _buildinPath;
|
|
||||||
private static string _sandboxPath;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 重写沙盒跟路径
|
/// 获取包裹的持久化类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void OverwriteSandboxPath(string sandboxPath)
|
public static Persistent GetPersistent(string packageName)
|
||||||
{
|
{
|
||||||
_sandboxPath = sandboxPath;
|
if (_persitentDic.ContainsKey(packageName) == false)
|
||||||
|
throw new System.Exception("Should never get here !");
|
||||||
|
return _persitentDic[packageName];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取沙盒文件夹路径
|
/// 获取或创建包裹的持久化类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetPersistentRootPath()
|
public static Persistent GetOrCreatePersistent(string packageName)
|
||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
if (_persitentDic.ContainsKey(packageName) == false)
|
||||||
// 注意:为了方便调试查看,编辑器下把存储目录放到项目里
|
|
||||||
if (string.IsNullOrEmpty(_sandboxPath))
|
|
||||||
{
|
{
|
||||||
string projectPath = Path.GetDirectoryName(UnityEngine.Application.dataPath);
|
Persistent persistent = new Persistent(packageName);
|
||||||
projectPath = PathUtility.RegularPath(projectPath);
|
_persitentDic.Add(packageName, persistent);
|
||||||
_sandboxPath = PathUtility.Combine(projectPath, SandboxFolderName);
|
|
||||||
}
|
}
|
||||||
#elif UNITY_STANDALONE
|
return _persitentDic[packageName];
|
||||||
if (string.IsNullOrEmpty(_sandboxPath))
|
|
||||||
{
|
|
||||||
_sandboxPath = PathUtility.Combine(UnityEngine.Application.dataPath, SandboxFolderName);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (string.IsNullOrEmpty(_sandboxPath))
|
|
||||||
{
|
|
||||||
_sandboxPath = PathUtility.Combine(UnityEngine.Application.persistentDataPath, SandboxFolderName);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return _sandboxPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取基于流文件夹的加载路径
|
|
||||||
/// </summary>
|
|
||||||
public static string MakeStreamingLoadPath(string path)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(_buildinPath))
|
|
||||||
{
|
|
||||||
_buildinPath = PathUtility.Combine(UnityEngine.Application.streamingAssetsPath, YooAssetSettings.StreamingAssetsBuildinFolder);
|
|
||||||
}
|
|
||||||
return PathUtility.Combine(_buildinPath, path);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取基于沙盒文件夹的加载路径
|
|
||||||
/// </summary>
|
|
||||||
public static string MakePersistentLoadPath(string path)
|
|
||||||
{
|
|
||||||
string root = GetPersistentRootPath();
|
|
||||||
return PathUtility.Combine(root, path);
|
|
||||||
}
|
|
||||||
public static string MakePersistentLoadPath(string path1, string path2)
|
|
||||||
{
|
|
||||||
string root = GetPersistentRootPath();
|
|
||||||
return PathUtility.Combine(root, path1, path2);
|
|
||||||
}
|
|
||||||
public static string MakePersistentLoadPath(string path1, string path2, string path3)
|
|
||||||
{
|
|
||||||
string root = GetPersistentRootPath();
|
|
||||||
return PathUtility.Combine(root, path1, path2, path3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -100,109 +47,5 @@ namespace YooAsset
|
|||||||
return path;
|
return path;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除沙盒总目录
|
|
||||||
/// </summary>
|
|
||||||
public static void DeleteSandbox()
|
|
||||||
{
|
|
||||||
string directoryPath = GetPersistentRootPath();
|
|
||||||
if (Directory.Exists(directoryPath))
|
|
||||||
Directory.Delete(directoryPath, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除沙盒内的缓存文件夹
|
|
||||||
/// </summary>
|
|
||||||
public static void DeleteCacheFolder()
|
|
||||||
{
|
|
||||||
string root = MakePersistentLoadPath(CacheFolderName);
|
|
||||||
if (Directory.Exists(root))
|
|
||||||
Directory.Delete(root, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除沙盒内的清单文件夹
|
|
||||||
/// </summary>
|
|
||||||
public static void DeleteManifestFolder()
|
|
||||||
{
|
|
||||||
string root = MakePersistentLoadPath(ManifestFolderName);
|
|
||||||
if (Directory.Exists(root))
|
|
||||||
Directory.Delete(root, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取缓存的BundleFile文件夹路径
|
|
||||||
/// </summary>
|
|
||||||
private readonly static Dictionary<string, string> _cachedBundleFileFolder = new Dictionary<string, string>(100);
|
|
||||||
public static string GetCachedBundleFileFolderPath(string packageName)
|
|
||||||
{
|
|
||||||
if (_cachedBundleFileFolder.TryGetValue(packageName, out string value) == false)
|
|
||||||
{
|
|
||||||
value = MakePersistentLoadPath(CacheFolderName, packageName, CachedBundleFileFolder);
|
|
||||||
_cachedBundleFileFolder.Add(packageName, value);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取缓存的RawFile文件夹路径
|
|
||||||
/// </summary>
|
|
||||||
private readonly static Dictionary<string, string> _cachedRawFileFolder = new Dictionary<string, string>(100);
|
|
||||||
public static string GetCachedRawFileFolderPath(string packageName)
|
|
||||||
{
|
|
||||||
if (_cachedRawFileFolder.TryGetValue(packageName, out string value) == false)
|
|
||||||
{
|
|
||||||
value = MakePersistentLoadPath(CacheFolderName, packageName, CachedRawFileFolder);
|
|
||||||
_cachedRawFileFolder.Add(packageName, value);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取应用程序的水印文件路径
|
|
||||||
/// </summary>
|
|
||||||
public static string GetAppFootPrintFilePath()
|
|
||||||
{
|
|
||||||
return MakePersistentLoadPath(AppFootPrintFileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取沙盒内清单文件的路径
|
|
||||||
/// </summary>
|
|
||||||
public static string GetCacheManifestFilePath(string packageName, string packageVersion)
|
|
||||||
{
|
|
||||||
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(packageName, packageVersion);
|
|
||||||
return MakePersistentLoadPath(ManifestFolderName, fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取沙盒内包裹的哈希文件的路径
|
|
||||||
/// </summary>
|
|
||||||
public static string GetCachePackageHashFilePath(string packageName, string packageVersion)
|
|
||||||
{
|
|
||||||
string fileName = YooAssetSettingsData.GetPackageHashFileName(packageName, packageVersion);
|
|
||||||
return MakePersistentLoadPath(ManifestFolderName, fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取沙盒内包裹的版本文件的路径
|
|
||||||
/// </summary>
|
|
||||||
public static string GetCachePackageVersionFilePath(string packageName)
|
|
||||||
{
|
|
||||||
string fileName = YooAssetSettingsData.GetPackageVersionFileName(packageName);
|
|
||||||
return MakePersistentLoadPath(ManifestFolderName, fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 保存默认的包裹版本
|
|
||||||
/// </summary>
|
|
||||||
public static void SaveCachePackageVersionFile(string packageName, string version)
|
|
||||||
{
|
|
||||||
string filePath = GetCachePackageVersionFilePath(packageName);
|
|
||||||
FileUtility.WriteAllText(filePath, version);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 缓存文件验证元素
|
/// 缓存文件验证元素
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class VerifyCacheElement
|
internal class VerifyCacheFileElement
|
||||||
{
|
{
|
||||||
public string PackageName { private set; get; }
|
public string PackageName { private set; get; }
|
||||||
public string CacheGUID { private set; get; }
|
public string CacheGUID { private set; get; }
|
||||||
@@ -17,7 +17,7 @@ namespace YooAsset
|
|||||||
public string DataFileCRC;
|
public string DataFileCRC;
|
||||||
public long DataFileSize;
|
public long DataFileSize;
|
||||||
|
|
||||||
public VerifyCacheElement(string packageName, string cacheGUID, string fileRootPath, string dataFilePath, string infoFilePath)
|
public VerifyCacheFileElement(string packageName, string cacheGUID, string fileRootPath, string dataFilePath, string infoFilePath)
|
||||||
{
|
{
|
||||||
PackageName = packageName;
|
PackageName = packageName;
|
||||||
CacheGUID = cacheGUID;
|
CacheGUID = cacheGUID;
|
||||||
@@ -43,7 +43,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 下载文件验证元素
|
/// 下载文件验证元素
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class VerifyTempElement
|
internal class VerifyTempFileElement
|
||||||
{
|
{
|
||||||
public string TempDataFilePath { private set; get; }
|
public string TempDataFilePath { private set; get; }
|
||||||
public string FileCRC { private set; get; }
|
public string FileCRC { private set; get; }
|
||||||
@@ -51,7 +51,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
public int Result = 0; // 注意:原子操作对象
|
public int Result = 0; // 注意:原子操作对象
|
||||||
|
|
||||||
public VerifyTempElement(string tempDataFilePath, string fileCRC, long fileSize)
|
public VerifyTempFileElement(string tempDataFilePath, string fileCRC, long fileSize)
|
||||||
{
|
{
|
||||||
TempDataFilePath = tempDataFilePath;
|
TempDataFilePath = tempDataFilePath;
|
||||||
FileCRC = fileCRC;
|
FileCRC = fileCRC;
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static CertificateHandler CertificateHandlerInstance = null;
|
public static CertificateHandler CertificateHandlerInstance = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 网络重定向次数
|
||||||
|
/// </summary>
|
||||||
|
public static int RedirectLimit { set; get; } = -1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启用断点续传功能文件的最小字节数
|
/// 启用断点续传功能文件的最小字节数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -93,34 +98,49 @@ namespace YooAsset
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 开始下载资源文件
|
/// 创建下载器
|
||||||
/// 注意:只有第一次请求的参数才是有效的
|
/// 注意:只有第一次请求的参数才有效
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static DownloaderBase BeginDownload(BundleInfo bundleInfo, int failedTryAgain, int timeout = 60)
|
public static DownloaderBase CreateDownload(BundleInfo bundleInfo, int failedTryAgain, int timeout = 60)
|
||||||
{
|
{
|
||||||
// 查询存在的下载器
|
// 查询存在的下载器
|
||||||
if (_downloaderDic.TryGetValue(bundleInfo.Bundle.CachedDataFilePath, out var downloader))
|
if (_downloaderDic.TryGetValue(bundleInfo.Bundle.CachedDataFilePath, out var downloader))
|
||||||
{
|
|
||||||
return downloader;
|
return downloader;
|
||||||
}
|
|
||||||
|
|
||||||
// 如果资源已经缓存
|
// 如果资源已经缓存
|
||||||
if (CacheSystem.IsCached(bundleInfo.Bundle.PackageName, bundleInfo.Bundle.CacheGUID))
|
if (CacheSystem.IsCached(bundleInfo.Bundle.PackageName, bundleInfo.Bundle.CacheGUID))
|
||||||
{
|
{
|
||||||
var tempDownloader = new TempDownloader(bundleInfo);
|
var completedDownloader = new CompletedDownloader(bundleInfo);
|
||||||
return tempDownloader;
|
return completedDownloader;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建新的下载器
|
// 创建新的下载器
|
||||||
|
YooLogger.Log($"Beginning to download bundle : {bundleInfo.Bundle.BundleName} URL : {bundleInfo.RemoteMainURL}");
|
||||||
|
#if UNITY_WEBGL
|
||||||
|
if (bundleInfo.Bundle.IsRawFile)
|
||||||
{
|
{
|
||||||
YooLogger.Log($"Beginning to download file : {bundleInfo.Bundle.FileName} URL : {bundleInfo.RemoteMainURL}");
|
|
||||||
FileUtility.CreateFileDirectory(bundleInfo.Bundle.CachedDataFilePath);
|
FileUtility.CreateFileDirectory(bundleInfo.Bundle.CachedDataFilePath);
|
||||||
bool breakDownload = bundleInfo.Bundle.FileSize >= BreakpointResumeFileSize;
|
DownloaderBase newDownloader = new FileGeneralDownloader(bundleInfo, failedTryAgain, timeout);
|
||||||
DownloaderBase newDownloader = new FileDownloader(bundleInfo, breakDownload);
|
|
||||||
newDownloader.SendRequest(failedTryAgain, timeout);
|
|
||||||
_downloaderDic.Add(bundleInfo.Bundle.CachedDataFilePath, newDownloader);
|
_downloaderDic.Add(bundleInfo.Bundle.CachedDataFilePath, newDownloader);
|
||||||
return newDownloader;
|
return newDownloader;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WebDownloader newDownloader = new WebDownloader(bundleInfo, failedTryAgain, timeout);
|
||||||
|
_downloaderDic.Add(bundleInfo.Bundle.CachedDataFilePath, newDownloader);
|
||||||
|
return newDownloader;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
FileUtility.CreateFileDirectory(bundleInfo.Bundle.CachedDataFilePath);
|
||||||
|
bool resumeDownload = bundleInfo.Bundle.FileSize >= BreakpointResumeFileSize;
|
||||||
|
DownloaderBase newDownloader;
|
||||||
|
if (resumeDownload)
|
||||||
|
newDownloader = new FileResumeDownloader(bundleInfo, failedTryAgain, timeout);
|
||||||
|
else
|
||||||
|
newDownloader = new FileGeneralDownloader(bundleInfo, failedTryAgain, timeout);
|
||||||
|
_downloaderDic.Add(bundleInfo.Bundle.CachedDataFilePath, newDownloader);
|
||||||
|
return newDownloader;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -128,11 +148,29 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static UnityWebRequest NewRequest(string requestURL)
|
public static UnityWebRequest NewRequest(string requestURL)
|
||||||
{
|
{
|
||||||
|
UnityWebRequest webRequest;
|
||||||
if (RequestDelegate != null)
|
if (RequestDelegate != null)
|
||||||
return RequestDelegate.Invoke(requestURL);
|
webRequest = RequestDelegate.Invoke(requestURL);
|
||||||
|
else
|
||||||
|
webRequest = new UnityWebRequest(requestURL, UnityWebRequest.kHttpVerbGET);
|
||||||
|
|
||||||
var request = new UnityWebRequest(requestURL, UnityWebRequest.kHttpVerbGET);
|
SetUnityWebRequestParam(webRequest);
|
||||||
return request;
|
return webRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置网络请求的自定义参数
|
||||||
|
/// </summary>
|
||||||
|
private static void SetUnityWebRequestParam(UnityWebRequest webRequest)
|
||||||
|
{
|
||||||
|
if (RedirectLimit >= 0)
|
||||||
|
webRequest.redirectLimit = RedirectLimit;
|
||||||
|
|
||||||
|
if (CertificateHandlerInstance != null)
|
||||||
|
{
|
||||||
|
webRequest.certificateHandler = CertificateHandlerInstance;
|
||||||
|
webRequest.disposeCertificateHandlerOnDispose = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal sealed class CompletedDownloader : DownloaderBase
|
||||||
|
{
|
||||||
|
public CompletedDownloader(BundleInfo bundleInfo) : base(bundleInfo, 0, 0)
|
||||||
|
{
|
||||||
|
_downloadProgress = 1f;
|
||||||
|
_downloadedBytes = (ulong)bundleInfo.Bundle.FileSize;
|
||||||
|
_status = EStatus.Succeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SendRequest(params object[] param)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public override void Update()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public override void Abort()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,39 +1,41 @@
|
|||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal abstract class DownloaderBase
|
internal abstract class DownloaderBase
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
public enum EStatus
|
||||||
{
|
{
|
||||||
None,
|
None = 0,
|
||||||
CheckTempFile,
|
|
||||||
WaitingCheckTempFile,
|
|
||||||
PrepareDownload,
|
|
||||||
CreateResumeDownloader,
|
|
||||||
CreateGeneralDownloader,
|
|
||||||
CheckDownload,
|
|
||||||
VerifyTempFile,
|
|
||||||
WaitingVerifyTempFile,
|
|
||||||
CachingFile,
|
|
||||||
TryAgain,
|
|
||||||
Succeed,
|
Succeed,
|
||||||
Failed,
|
Failed
|
||||||
}
|
}
|
||||||
|
|
||||||
protected readonly BundleInfo _bundleInfo;
|
protected readonly BundleInfo _bundleInfo;
|
||||||
|
protected readonly int _timeout;
|
||||||
protected ESteps _steps = ESteps.None;
|
|
||||||
|
|
||||||
protected int _timeout;
|
|
||||||
protected int _failedTryAgain;
|
protected int _failedTryAgain;
|
||||||
protected int _requestCount;
|
|
||||||
protected string _requestURL;
|
|
||||||
|
|
||||||
|
protected UnityWebRequest _webRequest;
|
||||||
|
protected EStatus _status = EStatus.None;
|
||||||
protected string _lastError = string.Empty;
|
protected string _lastError = string.Empty;
|
||||||
protected long _lastCode = 0;
|
protected long _lastCode = 0;
|
||||||
|
|
||||||
|
// 请求次数
|
||||||
|
protected int _requestCount = 0;
|
||||||
|
protected string _requestURL;
|
||||||
|
|
||||||
|
// 下载进度
|
||||||
protected float _downloadProgress = 0f;
|
protected float _downloadProgress = 0f;
|
||||||
protected ulong _downloadedBytes = 0;
|
protected ulong _downloadedBytes = 0;
|
||||||
|
|
||||||
|
// 超时相关
|
||||||
|
protected bool _isAbort = false;
|
||||||
|
protected ulong _latestDownloadBytes;
|
||||||
|
protected float _latestDownloadRealtime;
|
||||||
|
protected float _tryAgainTimer;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否等待异步结束
|
/// 是否等待异步结束
|
||||||
/// 警告:只能用于解压APP内部资源
|
/// 警告:只能用于解压APP内部资源
|
||||||
@@ -57,41 +59,31 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public DownloaderBase(BundleInfo bundleInfo)
|
public DownloaderBase(BundleInfo bundleInfo, int failedTryAgain, int timeout)
|
||||||
{
|
{
|
||||||
_bundleInfo = bundleInfo;
|
_bundleInfo = bundleInfo;
|
||||||
|
_failedTryAgain = failedTryAgain;
|
||||||
|
_timeout = timeout;
|
||||||
}
|
}
|
||||||
public void SendRequest(int failedTryAgain, int timeout)
|
public abstract void SendRequest(params object[] param);
|
||||||
{
|
|
||||||
if (_steps == ESteps.None)
|
|
||||||
{
|
|
||||||
_failedTryAgain = failedTryAgain;
|
|
||||||
_timeout = timeout;
|
|
||||||
_steps = ESteps.CheckTempFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public abstract void Update();
|
public abstract void Update();
|
||||||
public abstract void Abort();
|
public abstract void Abort();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取网络请求地址
|
/// 获取下载文件的大小
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected string GetRequestURL()
|
/// <returns></returns>
|
||||||
|
public long GetDownloadFileSize()
|
||||||
{
|
{
|
||||||
// 轮流返回请求地址
|
return _bundleInfo.Bundle.FileSize;
|
||||||
_requestCount++;
|
|
||||||
if (_requestCount % 2 == 0)
|
|
||||||
return _bundleInfo.RemoteFallbackURL;
|
|
||||||
else
|
|
||||||
return _bundleInfo.RemoteMainURL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取资源包信息
|
/// 获取下载文件的资源包名
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public BundleInfo GetBundleInfo()
|
public string GetDownloadBundleName()
|
||||||
{
|
{
|
||||||
return _bundleInfo;
|
return _bundleInfo.Bundle.BundleName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -99,7 +91,7 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsDone()
|
public bool IsDone()
|
||||||
{
|
{
|
||||||
return _steps == ESteps.Succeed || _steps == ESteps.Failed;
|
return _status == EStatus.Succeed || _status == EStatus.Failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -107,7 +99,7 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool HasError()
|
public bool HasError()
|
||||||
{
|
{
|
||||||
return _steps == ESteps.Failed;
|
return _status == EStatus.Failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -133,5 +125,69 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
return $"Failed to download : {_requestURL} Error : {_lastError} Code : {_lastCode}";
|
return $"Failed to download : {_requestURL} Error : {_lastError} Code : {_lastCode}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取网络请求地址
|
||||||
|
/// </summary>
|
||||||
|
protected string GetRequestURL()
|
||||||
|
{
|
||||||
|
// 轮流返回请求地址
|
||||||
|
_requestCount++;
|
||||||
|
if (_requestCount % 2 == 0)
|
||||||
|
return _bundleInfo.RemoteFallbackURL;
|
||||||
|
else
|
||||||
|
return _bundleInfo.RemoteMainURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 超时判定方法
|
||||||
|
/// </summary>
|
||||||
|
protected void CheckTimeout()
|
||||||
|
{
|
||||||
|
// 注意:在连续时间段内无新增下载数据及判定为超时
|
||||||
|
if (_isAbort == false)
|
||||||
|
{
|
||||||
|
if (_latestDownloadBytes != DownloadedBytes)
|
||||||
|
{
|
||||||
|
_latestDownloadBytes = DownloadedBytes;
|
||||||
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||||
|
}
|
||||||
|
|
||||||
|
float offset = Time.realtimeSinceStartup - _latestDownloadRealtime;
|
||||||
|
if (offset > _timeout)
|
||||||
|
{
|
||||||
|
YooLogger.Warning($"Web file request timeout : {_requestURL}");
|
||||||
|
_webRequest.Abort();
|
||||||
|
_isAbort = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存下载文件
|
||||||
|
/// </summary>
|
||||||
|
protected void CachingFile(string tempFilePath)
|
||||||
|
{
|
||||||
|
string infoFilePath = _bundleInfo.Bundle.CachedInfoFilePath;
|
||||||
|
string dataFilePath = _bundleInfo.Bundle.CachedDataFilePath;
|
||||||
|
string dataFileCRC = _bundleInfo.Bundle.FileCRC;
|
||||||
|
long dataFileSize = _bundleInfo.Bundle.FileSize;
|
||||||
|
|
||||||
|
if (File.Exists(infoFilePath))
|
||||||
|
File.Delete(infoFilePath);
|
||||||
|
if (File.Exists(dataFilePath))
|
||||||
|
File.Delete(dataFilePath);
|
||||||
|
|
||||||
|
FileInfo fileInfo = new FileInfo(tempFilePath);
|
||||||
|
fileInfo.MoveTo(dataFilePath);
|
||||||
|
|
||||||
|
// 写入信息文件记录验证数据
|
||||||
|
CacheFileInfo.WriteInfoToFile(infoFilePath, dataFileCRC, dataFileSize);
|
||||||
|
|
||||||
|
// 记录缓存文件
|
||||||
|
var wrapper = new PackageCache.RecordWrapper(infoFilePath, dataFilePath, dataFileCRC, dataFileSize);
|
||||||
|
CacheSystem.RecordFile(_bundleInfo.Bundle.PackageName, _bundleInfo.Bundle.CacheGUID, wrapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,225 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 普通的下载器
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class FileGeneralDownloader : DownloaderBase
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
PrepareDownload,
|
||||||
|
CreateDownloader,
|
||||||
|
CheckDownload,
|
||||||
|
VerifyTempFile,
|
||||||
|
WaitingVerifyTempFile,
|
||||||
|
CachingFile,
|
||||||
|
TryAgain,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string _tempFilePath;
|
||||||
|
private VerifyTempFileOperation _verifyFileOp = null;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
|
||||||
|
public FileGeneralDownloader(BundleInfo bundleInfo, int failedTryAgain, int timeout) : base(bundleInfo, failedTryAgain, timeout)
|
||||||
|
{
|
||||||
|
_tempFilePath = bundleInfo.Bundle.TempDataFilePath;
|
||||||
|
}
|
||||||
|
public override void SendRequest(params object[] param)
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None)
|
||||||
|
{
|
||||||
|
_steps = ESteps.PrepareDownload;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None)
|
||||||
|
return;
|
||||||
|
if (IsDone())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 准备下载
|
||||||
|
if (_steps == ESteps.PrepareDownload)
|
||||||
|
{
|
||||||
|
// 重置变量
|
||||||
|
_downloadProgress = 0f;
|
||||||
|
_downloadedBytes = 0;
|
||||||
|
|
||||||
|
// 重置变量
|
||||||
|
_isAbort = false;
|
||||||
|
_latestDownloadBytes = 0;
|
||||||
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||||
|
_tryAgainTimer = 0f;
|
||||||
|
|
||||||
|
// 删除临时文件
|
||||||
|
if (File.Exists(_tempFilePath))
|
||||||
|
File.Delete(_tempFilePath);
|
||||||
|
|
||||||
|
// 获取请求地址
|
||||||
|
_requestURL = GetRequestURL();
|
||||||
|
_steps = ESteps.CreateDownloader;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建下载器
|
||||||
|
if (_steps == ESteps.CreateDownloader)
|
||||||
|
{
|
||||||
|
_webRequest = DownloadSystem.NewRequest(_requestURL);
|
||||||
|
DownloadHandlerFile handler = new DownloadHandlerFile(_tempFilePath);
|
||||||
|
handler.removeFileOnAbort = true;
|
||||||
|
_webRequest.downloadHandler = handler;
|
||||||
|
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||||
|
_webRequest.SendWebRequest();
|
||||||
|
_steps = ESteps.CheckDownload;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检测下载结果
|
||||||
|
if (_steps == ESteps.CheckDownload)
|
||||||
|
{
|
||||||
|
_downloadProgress = _webRequest.downloadProgress;
|
||||||
|
_downloadedBytes = _webRequest.downloadedBytes;
|
||||||
|
if (_webRequest.isDone == false)
|
||||||
|
{
|
||||||
|
CheckTimeout();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasError = false;
|
||||||
|
|
||||||
|
// 检查网络错误
|
||||||
|
#if UNITY_2020_3_OR_NEWER
|
||||||
|
if (_webRequest.result != UnityWebRequest.Result.Success)
|
||||||
|
{
|
||||||
|
hasError = true;
|
||||||
|
_lastError = _webRequest.error;
|
||||||
|
_lastCode = _webRequest.responseCode;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (_webRequest.isNetworkError || _webRequest.isHttpError)
|
||||||
|
{
|
||||||
|
hasError = true;
|
||||||
|
_lastError = _webRequest.error;
|
||||||
|
_lastCode = _webRequest.responseCode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 如果网络异常
|
||||||
|
if (hasError)
|
||||||
|
{
|
||||||
|
// 下载失败之后删除文件
|
||||||
|
if (File.Exists(_tempFilePath))
|
||||||
|
File.Delete(_tempFilePath);
|
||||||
|
|
||||||
|
_steps = ESteps.TryAgain;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.VerifyTempFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 最终释放下载器
|
||||||
|
DisposeWebRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证下载文件
|
||||||
|
if (_steps == ESteps.VerifyTempFile)
|
||||||
|
{
|
||||||
|
VerifyTempFileElement element = new VerifyTempFileElement(_bundleInfo.Bundle.TempDataFilePath, _bundleInfo.Bundle.FileCRC, _bundleInfo.Bundle.FileSize);
|
||||||
|
_verifyFileOp = VerifyTempFileOperation.CreateOperation(element);
|
||||||
|
OperationSystem.StartOperation(_verifyFileOp);
|
||||||
|
_steps = ESteps.WaitingVerifyTempFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 等待验证完成
|
||||||
|
if (_steps == ESteps.WaitingVerifyTempFile)
|
||||||
|
{
|
||||||
|
if (WaitForAsyncComplete)
|
||||||
|
_verifyFileOp.Update();
|
||||||
|
|
||||||
|
if (_verifyFileOp.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_verifyFileOp.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
_steps = ESteps.CachingFile;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (File.Exists(_tempFilePath))
|
||||||
|
File.Delete(_tempFilePath);
|
||||||
|
|
||||||
|
_lastError = _verifyFileOp.Error;
|
||||||
|
_steps = ESteps.TryAgain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缓存下载文件
|
||||||
|
if (_steps == ESteps.CachingFile)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CachingFile(_tempFilePath);
|
||||||
|
_status = EStatus.Succeed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
_lastError = string.Empty;
|
||||||
|
_lastCode = 0;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_lastError = e.Message;
|
||||||
|
_steps = ESteps.TryAgain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重新尝试下载
|
||||||
|
if (_steps == ESteps.TryAgain)
|
||||||
|
{
|
||||||
|
if (_failedTryAgain <= 0)
|
||||||
|
{
|
||||||
|
ReportError();
|
||||||
|
_status = EStatus.Failed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tryAgainTimer += Time.unscaledDeltaTime;
|
||||||
|
if (_tryAgainTimer > 1f)
|
||||||
|
{
|
||||||
|
_failedTryAgain--;
|
||||||
|
_steps = ESteps.PrepareDownload;
|
||||||
|
ReportWarning();
|
||||||
|
YooLogger.Warning($"Try again download : {_requestURL}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override void Abort()
|
||||||
|
{
|
||||||
|
if (IsDone() == false)
|
||||||
|
{
|
||||||
|
_status = EStatus.Failed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
_lastError = "user abort";
|
||||||
|
_lastCode = 0;
|
||||||
|
DisposeWebRequest();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DisposeWebRequest()
|
||||||
|
{
|
||||||
|
if (_webRequest != null)
|
||||||
|
{
|
||||||
|
_webRequest.Dispose();
|
||||||
|
_webRequest = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,28 +7,47 @@ using UnityEngine.Networking;
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal sealed class FileDownloader : DownloaderBase
|
/// <summary>
|
||||||
|
/// 断点续传下载器
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class FileResumeDownloader : DownloaderBase
|
||||||
{
|
{
|
||||||
private readonly bool _breakResume;
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
CheckTempFile,
|
||||||
|
WaitingCheckTempFile,
|
||||||
|
PrepareDownload,
|
||||||
|
CreateDownloader,
|
||||||
|
CheckDownload,
|
||||||
|
VerifyTempFile,
|
||||||
|
WaitingVerifyTempFile,
|
||||||
|
CachingFile,
|
||||||
|
TryAgain,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
private readonly string _tempFilePath;
|
private readonly string _tempFilePath;
|
||||||
private UnityWebRequest _webRequest = null;
|
|
||||||
private DownloadHandlerFileRange _downloadHandle = null;
|
private DownloadHandlerFileRange _downloadHandle = null;
|
||||||
private VerifyTempFileOperation _checkFileOp = null;
|
private VerifyTempFileOperation _checkFileOp = null;
|
||||||
private VerifyTempFileOperation _verifyFileOp = null;
|
private VerifyTempFileOperation _verifyFileOp = null;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
// 重置变量
|
// 重置变量
|
||||||
private bool _isAbort = false;
|
|
||||||
private ulong _fileOriginLength;
|
private ulong _fileOriginLength;
|
||||||
private ulong _latestDownloadBytes;
|
|
||||||
private float _latestDownloadRealtime;
|
|
||||||
private float _tryAgainTimer;
|
|
||||||
|
|
||||||
|
|
||||||
public FileDownloader(BundleInfo bundleInfo, bool breakResume) : base(bundleInfo)
|
public FileResumeDownloader(BundleInfo bundleInfo, int failedTryAgain, int timeout) : base(bundleInfo, failedTryAgain, timeout)
|
||||||
{
|
{
|
||||||
_breakResume = breakResume;
|
|
||||||
_tempFilePath = bundleInfo.Bundle.TempDataFilePath;
|
_tempFilePath = bundleInfo.Bundle.TempDataFilePath;
|
||||||
}
|
}
|
||||||
|
public override void SendRequest(params object[] param)
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None)
|
||||||
|
{
|
||||||
|
_steps = ESteps.CheckTempFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
if (_steps == ESteps.None)
|
if (_steps == ESteps.None)
|
||||||
@@ -39,7 +58,7 @@ namespace YooAsset
|
|||||||
// 检测临时文件
|
// 检测临时文件
|
||||||
if (_steps == ESteps.CheckTempFile)
|
if (_steps == ESteps.CheckTempFile)
|
||||||
{
|
{
|
||||||
VerifyTempElement element = new VerifyTempElement(_bundleInfo.Bundle.TempDataFilePath, _bundleInfo.Bundle.FileCRC, _bundleInfo.Bundle.FileSize);
|
VerifyTempFileElement element = new VerifyTempFileElement(_bundleInfo.Bundle.TempDataFilePath, _bundleInfo.Bundle.FileCRC, _bundleInfo.Bundle.FileSize);
|
||||||
_checkFileOp = VerifyTempFileOperation.CreateOperation(element);
|
_checkFileOp = VerifyTempFileOperation.CreateOperation(element);
|
||||||
OperationSystem.StartOperation(_checkFileOp);
|
OperationSystem.StartOperation(_checkFileOp);
|
||||||
_steps = ESteps.WaitingCheckTempFile;
|
_steps = ESteps.WaitingCheckTempFile;
|
||||||
@@ -75,45 +94,21 @@ namespace YooAsset
|
|||||||
// 重置变量
|
// 重置变量
|
||||||
_downloadProgress = 0f;
|
_downloadProgress = 0f;
|
||||||
_downloadedBytes = 0;
|
_downloadedBytes = 0;
|
||||||
|
|
||||||
|
// 重置变量
|
||||||
_isAbort = false;
|
_isAbort = false;
|
||||||
_fileOriginLength = 0;
|
|
||||||
_latestDownloadBytes = 0;
|
_latestDownloadBytes = 0;
|
||||||
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||||
_tryAgainTimer = 0f;
|
_tryAgainTimer = 0f;
|
||||||
|
_fileOriginLength = 0;
|
||||||
|
|
||||||
// 获取请求地址
|
// 获取请求地址
|
||||||
_requestURL = GetRequestURL();
|
_requestURL = GetRequestURL();
|
||||||
|
_steps = ESteps.CreateDownloader;
|
||||||
if (_breakResume)
|
|
||||||
_steps = ESteps.CreateResumeDownloader;
|
|
||||||
else
|
|
||||||
_steps = ESteps.CreateGeneralDownloader;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建普通的下载器
|
// 创建下载器
|
||||||
if (_steps == ESteps.CreateGeneralDownloader)
|
if (_steps == ESteps.CreateDownloader)
|
||||||
{
|
|
||||||
if (File.Exists(_tempFilePath))
|
|
||||||
File.Delete(_tempFilePath);
|
|
||||||
|
|
||||||
_webRequest = DownloadSystem.NewRequest(_requestURL);
|
|
||||||
DownloadHandlerFile handler = new DownloadHandlerFile(_tempFilePath);
|
|
||||||
handler.removeFileOnAbort = true;
|
|
||||||
_webRequest.downloadHandler = handler;
|
|
||||||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
|
||||||
|
|
||||||
if (DownloadSystem.CertificateHandlerInstance != null)
|
|
||||||
{
|
|
||||||
_webRequest.certificateHandler = DownloadSystem.CertificateHandlerInstance;
|
|
||||||
_webRequest.disposeCertificateHandlerOnDispose = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
_webRequest.SendWebRequest();
|
|
||||||
_steps = ESteps.CheckDownload;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建断点续传下载器
|
|
||||||
if (_steps == ESteps.CreateResumeDownloader)
|
|
||||||
{
|
{
|
||||||
long fileLength = -1;
|
long fileLength = -1;
|
||||||
if (File.Exists(_tempFilePath))
|
if (File.Exists(_tempFilePath))
|
||||||
@@ -137,13 +132,6 @@ namespace YooAsset
|
|||||||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||||
if (fileLength > 0)
|
if (fileLength > 0)
|
||||||
_webRequest.SetRequestHeader("Range", $"bytes={fileLength}-");
|
_webRequest.SetRequestHeader("Range", $"bytes={fileLength}-");
|
||||||
|
|
||||||
if (DownloadSystem.CertificateHandlerInstance != null)
|
|
||||||
{
|
|
||||||
_webRequest.certificateHandler = DownloadSystem.CertificateHandlerInstance;
|
|
||||||
_webRequest.disposeCertificateHandlerOnDispose = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
_webRequest.SendWebRequest();
|
_webRequest.SendWebRequest();
|
||||||
_steps = ESteps.CheckDownload;
|
_steps = ESteps.CheckDownload;
|
||||||
}
|
}
|
||||||
@@ -181,24 +169,15 @@ namespace YooAsset
|
|||||||
// 如果网络异常
|
// 如果网络异常
|
||||||
if (hasError)
|
if (hasError)
|
||||||
{
|
{
|
||||||
if (_breakResume)
|
// 注意:下载断点续传文件发生特殊错误码之后删除文件
|
||||||
|
if (DownloadSystem.ClearFileResponseCodes != null)
|
||||||
{
|
{
|
||||||
// 注意:下载断点续传文件发生特殊错误码之后删除文件
|
if (DownloadSystem.ClearFileResponseCodes.Contains(_webRequest.responseCode))
|
||||||
if (DownloadSystem.ClearFileResponseCodes != null)
|
|
||||||
{
|
{
|
||||||
if (DownloadSystem.ClearFileResponseCodes.Contains(_webRequest.responseCode))
|
if (File.Exists(_tempFilePath))
|
||||||
{
|
File.Delete(_tempFilePath);
|
||||||
if (File.Exists(_tempFilePath))
|
|
||||||
File.Delete(_tempFilePath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// 注意:非断点续传下载失败之后删除文件
|
|
||||||
if (File.Exists(_tempFilePath))
|
|
||||||
File.Delete(_tempFilePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
_steps = ESteps.TryAgain;
|
_steps = ESteps.TryAgain;
|
||||||
}
|
}
|
||||||
@@ -207,14 +186,14 @@ namespace YooAsset
|
|||||||
_steps = ESteps.VerifyTempFile;
|
_steps = ESteps.VerifyTempFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 释放下载器
|
// 最终释放下载器
|
||||||
DisposeWebRequest();
|
DisposeWebRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证下载文件
|
// 验证下载文件
|
||||||
if (_steps == ESteps.VerifyTempFile)
|
if (_steps == ESteps.VerifyTempFile)
|
||||||
{
|
{
|
||||||
VerifyTempElement element = new VerifyTempElement(_bundleInfo.Bundle.TempDataFilePath, _bundleInfo.Bundle.FileCRC, _bundleInfo.Bundle.FileSize);
|
VerifyTempFileElement element = new VerifyTempFileElement(_bundleInfo.Bundle.TempDataFilePath, _bundleInfo.Bundle.FileCRC, _bundleInfo.Bundle.FileSize);
|
||||||
_verifyFileOp = VerifyTempFileOperation.CreateOperation(element);
|
_verifyFileOp = VerifyTempFileOperation.CreateOperation(element);
|
||||||
OperationSystem.StartOperation(_verifyFileOp);
|
OperationSystem.StartOperation(_verifyFileOp);
|
||||||
_steps = ESteps.WaitingVerifyTempFile;
|
_steps = ESteps.WaitingVerifyTempFile;
|
||||||
@@ -248,29 +227,11 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string infoFilePath = _bundleInfo.Bundle.CachedInfoFilePath;
|
CachingFile(_tempFilePath);
|
||||||
string dataFilePath = _bundleInfo.Bundle.CachedDataFilePath;
|
_status = EStatus.Succeed;
|
||||||
string dataFileCRC = _bundleInfo.Bundle.FileCRC;
|
_steps = ESteps.Done;
|
||||||
long dataFileSize = _bundleInfo.Bundle.FileSize;
|
|
||||||
|
|
||||||
if (File.Exists(infoFilePath))
|
|
||||||
File.Delete(infoFilePath);
|
|
||||||
if (File.Exists(dataFilePath))
|
|
||||||
File.Delete(dataFilePath);
|
|
||||||
|
|
||||||
FileInfo fileInfo = new FileInfo(_tempFilePath);
|
|
||||||
fileInfo.MoveTo(dataFilePath);
|
|
||||||
|
|
||||||
// 写入信息文件记录验证数据
|
|
||||||
CacheFileInfo.WriteInfoToFile(infoFilePath, dataFileCRC, dataFileSize);
|
|
||||||
|
|
||||||
// 记录缓存文件
|
|
||||||
var wrapper = new PackageCache.RecordWrapper(infoFilePath, dataFilePath, dataFileCRC, dataFileSize);
|
|
||||||
CacheSystem.RecordFile(_bundleInfo.Bundle.PackageName, _bundleInfo.Bundle.CacheGUID, wrapper);
|
|
||||||
|
|
||||||
_lastError = string.Empty;
|
_lastError = string.Empty;
|
||||||
_lastCode = 0;
|
_lastCode = 0;
|
||||||
_steps = ESteps.Succeed;
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -285,7 +246,8 @@ namespace YooAsset
|
|||||||
if (_failedTryAgain <= 0)
|
if (_failedTryAgain <= 0)
|
||||||
{
|
{
|
||||||
ReportError();
|
ReportError();
|
||||||
_steps = ESteps.Failed;
|
_status = EStatus.Failed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,33 +265,14 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (IsDone() == false)
|
if (IsDone() == false)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Failed;
|
_status = EStatus.Failed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
_lastError = "user abort";
|
_lastError = "user abort";
|
||||||
_lastCode = 0;
|
_lastCode = 0;
|
||||||
DisposeWebRequest();
|
DisposeWebRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckTimeout()
|
|
||||||
{
|
|
||||||
// 注意:在连续时间段内无新增下载数据及判定为超时
|
|
||||||
if (_isAbort == false)
|
|
||||||
{
|
|
||||||
if (_latestDownloadBytes != DownloadedBytes)
|
|
||||||
{
|
|
||||||
_latestDownloadBytes = DownloadedBytes;
|
|
||||||
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
|
||||||
}
|
|
||||||
|
|
||||||
float offset = Time.realtimeSinceStartup - _latestDownloadRealtime;
|
|
||||||
if (offset > _timeout)
|
|
||||||
{
|
|
||||||
YooLogger.Warning($"Web file request timeout : {_requestURL}");
|
|
||||||
_webRequest.Abort();
|
|
||||||
_isAbort = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void DisposeWebRequest()
|
private void DisposeWebRequest()
|
||||||
{
|
{
|
||||||
if (_downloadHandle != null)
|
if (_downloadHandle != null)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a439c9a8f36dcc942b92a8e8af927237
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
namespace YooAsset
|
|
||||||
{
|
|
||||||
internal sealed class TempDownloader : DownloaderBase
|
|
||||||
{
|
|
||||||
public TempDownloader(BundleInfo bundleInfo) : base(bundleInfo)
|
|
||||||
{
|
|
||||||
_downloadProgress = 1f;
|
|
||||||
_downloadedBytes = (ulong)bundleInfo.Bundle.FileSize;
|
|
||||||
_steps = ESteps.Succeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Update()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
public override void Abort()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,209 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal sealed class WebDownloader : DownloaderBase
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
PrepareDownload,
|
||||||
|
CreateDownloader,
|
||||||
|
CheckDownload,
|
||||||
|
VerifyTempFile,
|
||||||
|
WaitingVerifyTempFile,
|
||||||
|
CachingFile,
|
||||||
|
TryAgain,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _keepDownloadHandleLife = false;
|
||||||
|
private DownloadHandlerAssetBundle _downloadhandler;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
|
||||||
|
public WebDownloader(BundleInfo bundleInfo, int failedTryAgain, int timeout) : base(bundleInfo, failedTryAgain, timeout)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public override void SendRequest(params object[] param)
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None)
|
||||||
|
{
|
||||||
|
_keepDownloadHandleLife = (bool)param[0];
|
||||||
|
_steps = ESteps.PrepareDownload;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None)
|
||||||
|
return;
|
||||||
|
if (IsDone())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 创建下载器
|
||||||
|
if (_steps == ESteps.PrepareDownload)
|
||||||
|
{
|
||||||
|
// 重置变量
|
||||||
|
_downloadProgress = 0f;
|
||||||
|
_downloadedBytes = 0;
|
||||||
|
|
||||||
|
// 重置变量
|
||||||
|
_isAbort = false;
|
||||||
|
_latestDownloadBytes = 0;
|
||||||
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||||
|
_tryAgainTimer = 0f;
|
||||||
|
|
||||||
|
// 获取请求地址
|
||||||
|
_requestURL = GetRequestURL();
|
||||||
|
_steps = ESteps.CreateDownloader;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建下载器
|
||||||
|
if (_steps == ESteps.CreateDownloader)
|
||||||
|
{
|
||||||
|
_webRequest = DownloadSystem.NewRequest(_requestURL);
|
||||||
|
|
||||||
|
if (CacheSystem.DisableUnityCacheOnWebGL)
|
||||||
|
{
|
||||||
|
uint crc = _bundleInfo.Bundle.UnityCRC;
|
||||||
|
_downloadhandler = new DownloadHandlerAssetBundle(_requestURL, crc);
|
||||||
|
_downloadhandler.autoLoadAssetBundle = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint crc = _bundleInfo.Bundle.UnityCRC;
|
||||||
|
var hash = Hash128.Parse(_bundleInfo.Bundle.FileHash);
|
||||||
|
_downloadhandler = new DownloadHandlerAssetBundle(_requestURL, hash, crc);
|
||||||
|
_downloadhandler.autoLoadAssetBundle = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_webRequest.downloadHandler = _downloadhandler;
|
||||||
|
_webRequest.disposeDownloadHandlerOnDispose = false;
|
||||||
|
_webRequest.SendWebRequest();
|
||||||
|
_steps = ESteps.CheckDownload;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检测下载结果
|
||||||
|
if (_steps == ESteps.CheckDownload)
|
||||||
|
{
|
||||||
|
_downloadProgress = _webRequest.downloadProgress;
|
||||||
|
_downloadedBytes = _webRequest.downloadedBytes;
|
||||||
|
if (_webRequest.isDone == false)
|
||||||
|
{
|
||||||
|
CheckTimeout();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasError = false;
|
||||||
|
|
||||||
|
// 检查网络错误
|
||||||
|
#if UNITY_2020_3_OR_NEWER
|
||||||
|
if (_webRequest.result != UnityWebRequest.Result.Success)
|
||||||
|
{
|
||||||
|
hasError = true;
|
||||||
|
_lastError = _webRequest.error;
|
||||||
|
_lastCode = _webRequest.responseCode;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (_webRequest.isNetworkError || _webRequest.isHttpError)
|
||||||
|
{
|
||||||
|
hasError = true;
|
||||||
|
_lastError = _webRequest.error;
|
||||||
|
_lastCode = _webRequest.responseCode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 如果网络异常
|
||||||
|
if (hasError)
|
||||||
|
{
|
||||||
|
_steps = ESteps.TryAgain;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_status = EStatus.Succeed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
_lastError = string.Empty;
|
||||||
|
_lastCode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 最终释放请求
|
||||||
|
DisposeRequest();
|
||||||
|
|
||||||
|
if (_keepDownloadHandleLife == false)
|
||||||
|
DisposeHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重新尝试下载
|
||||||
|
if (_steps == ESteps.TryAgain)
|
||||||
|
{
|
||||||
|
if (_failedTryAgain <= 0)
|
||||||
|
{
|
||||||
|
DisposeRequest();
|
||||||
|
DisposeHandler();
|
||||||
|
ReportError();
|
||||||
|
_status = EStatus.Failed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tryAgainTimer += Time.unscaledDeltaTime;
|
||||||
|
if (_tryAgainTimer > 1f)
|
||||||
|
{
|
||||||
|
_failedTryAgain--;
|
||||||
|
_steps = ESteps.PrepareDownload;
|
||||||
|
ReportWarning();
|
||||||
|
YooLogger.Warning($"Try again download : {_requestURL}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override void Abort()
|
||||||
|
{
|
||||||
|
if (IsDone() == false)
|
||||||
|
{
|
||||||
|
_status = EStatus.Failed;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
_lastError = "user abort";
|
||||||
|
_lastCode = 0;
|
||||||
|
|
||||||
|
DisposeRequest();
|
||||||
|
DisposeHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void DisposeRequest()
|
||||||
|
{
|
||||||
|
if (_webRequest != null)
|
||||||
|
{
|
||||||
|
_webRequest.Dispose();
|
||||||
|
_webRequest = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源包
|
||||||
|
/// </summary>
|
||||||
|
public AssetBundle GetAssetBundle()
|
||||||
|
{
|
||||||
|
if (_downloadhandler != null)
|
||||||
|
return _downloadhandler.assetBundle;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 释放下载句柄
|
||||||
|
/// </summary>
|
||||||
|
public void DisposeHandler()
|
||||||
|
{
|
||||||
|
if (_downloadhandler != null)
|
||||||
|
{
|
||||||
|
_downloadhandler.Dispose();
|
||||||
|
_downloadhandler = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 41bc4bc56f59ddb4b8925f9536bbbfbc
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -2,38 +2,26 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine.Networking;
|
using UnityEngine.Networking;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
/// <summary>
|
internal class UnityWebDataRequester : UnityWebRequesterBase
|
||||||
/// 下载器
|
|
||||||
/// 说明:UnityWebRequest(UWR) supports reading streaming assets since 2017.1
|
|
||||||
/// </summary>
|
|
||||||
internal class UnityWebDataRequester
|
|
||||||
{
|
{
|
||||||
private UnityWebRequest _webRequest;
|
|
||||||
private UnityWebRequestAsyncOperation _operationHandle;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求URL地址
|
|
||||||
/// </summary>
|
|
||||||
public string URL { private set; get; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 发送GET请求
|
/// 发送GET请求
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="timeout">超时:从请求开始计时</param>
|
public void SendRequest(string url, int timeout = 60)
|
||||||
public void SendRequest(string url, int timeout = 0)
|
|
||||||
{
|
{
|
||||||
if (_webRequest == null)
|
if (_webRequest == null)
|
||||||
{
|
{
|
||||||
URL = url;
|
URL = url;
|
||||||
|
ResetTimeout(timeout);
|
||||||
|
|
||||||
_webRequest = DownloadSystem.NewRequest(URL);
|
_webRequest = DownloadSystem.NewRequest(URL);
|
||||||
DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
|
DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
|
||||||
_webRequest.downloadHandler = handler;
|
_webRequest.downloadHandler = handler;
|
||||||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||||
_webRequest.timeout = timeout;
|
|
||||||
_operationHandle = _webRequest.SendWebRequest();
|
_operationHandle = _webRequest.SendWebRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,65 +47,5 @@ namespace YooAsset
|
|||||||
else
|
else
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 释放下载器
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_webRequest != null)
|
|
||||||
{
|
|
||||||
_webRequest.Dispose();
|
|
||||||
_webRequest = null;
|
|
||||||
_operationHandle = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否完毕(无论成功失败)
|
|
||||||
/// </summary>
|
|
||||||
public bool IsDone()
|
|
||||||
{
|
|
||||||
if (_operationHandle == null)
|
|
||||||
return false;
|
|
||||||
return _operationHandle.isDone;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载进度
|
|
||||||
/// </summary>
|
|
||||||
public float Progress()
|
|
||||||
{
|
|
||||||
if (_operationHandle == null)
|
|
||||||
return 0;
|
|
||||||
return _operationHandle.progress;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载是否发生错误
|
|
||||||
/// </summary>
|
|
||||||
public bool HasError()
|
|
||||||
{
|
|
||||||
#if UNITY_2020_3_OR_NEWER
|
|
||||||
return _webRequest.result != UnityWebRequest.Result.Success;
|
|
||||||
#else
|
|
||||||
if (_webRequest.isNetworkError || _webRequest.isHttpError)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取错误信息
|
|
||||||
/// </summary>
|
|
||||||
public string GetError()
|
|
||||||
{
|
|
||||||
if (_webRequest != null)
|
|
||||||
{
|
|
||||||
return $"URL : {URL} Error : {_webRequest.error}";
|
|
||||||
}
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,129 +6,25 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
/// <summary>
|
internal class UnityWebFileRequester : UnityWebRequesterBase
|
||||||
/// 下载器
|
|
||||||
/// 说明:UnityWebRequest(UWR) supports reading streaming assets since 2017.1
|
|
||||||
/// </summary>
|
|
||||||
internal class UnityWebFileRequester
|
|
||||||
{
|
{
|
||||||
private UnityWebRequest _webRequest;
|
|
||||||
private UnityWebRequestAsyncOperation _operationHandle;
|
|
||||||
|
|
||||||
// 超时相关
|
|
||||||
private float _timeout;
|
|
||||||
private bool _isAbort = false;
|
|
||||||
private ulong _latestDownloadBytes;
|
|
||||||
private float _latestDownloadRealtime;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求URL地址
|
|
||||||
/// </summary>
|
|
||||||
public string URL { private set; get; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 发送GET请求
|
/// 发送GET请求
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendRequest(string url, string savePath, float timeout = 60)
|
public void SendRequest(string url, string fileSavePath, int timeout = 60)
|
||||||
{
|
{
|
||||||
if (_webRequest == null)
|
if (_webRequest == null)
|
||||||
{
|
{
|
||||||
URL = url;
|
URL = url;
|
||||||
_timeout = timeout;
|
ResetTimeout(timeout);
|
||||||
_latestDownloadBytes = 0;
|
|
||||||
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
|
||||||
|
|
||||||
_webRequest = DownloadSystem.NewRequest(URL);
|
_webRequest = DownloadSystem.NewRequest(URL);
|
||||||
DownloadHandlerFile handler = new DownloadHandlerFile(savePath);
|
DownloadHandlerFile handler = new DownloadHandlerFile(fileSavePath);
|
||||||
handler.removeFileOnAbort = true;
|
handler.removeFileOnAbort = true;
|
||||||
_webRequest.downloadHandler = handler;
|
_webRequest.downloadHandler = handler;
|
||||||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||||
_operationHandle = _webRequest.SendWebRequest();
|
_operationHandle = _webRequest.SendWebRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 释放下载器
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_webRequest != null)
|
|
||||||
{
|
|
||||||
_webRequest.Dispose();
|
|
||||||
_webRequest = null;
|
|
||||||
_operationHandle = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否完毕(无论成功失败)
|
|
||||||
/// </summary>
|
|
||||||
public bool IsDone()
|
|
||||||
{
|
|
||||||
if (_operationHandle == null)
|
|
||||||
return false;
|
|
||||||
return _operationHandle.isDone;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载进度
|
|
||||||
/// </summary>
|
|
||||||
public float Progress()
|
|
||||||
{
|
|
||||||
if (_operationHandle == null)
|
|
||||||
return 0;
|
|
||||||
return _operationHandle.progress;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载是否发生错误
|
|
||||||
/// </summary>
|
|
||||||
public bool HasError()
|
|
||||||
{
|
|
||||||
#if UNITY_2020_3_OR_NEWER
|
|
||||||
return _webRequest.result != UnityWebRequest.Result.Success;
|
|
||||||
#else
|
|
||||||
if (_webRequest.isNetworkError || _webRequest.isHttpError)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取错误信息
|
|
||||||
/// </summary>
|
|
||||||
public string GetError()
|
|
||||||
{
|
|
||||||
if (_webRequest != null)
|
|
||||||
{
|
|
||||||
return $"URL : {URL} Error : {_webRequest.error}";
|
|
||||||
}
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 检测超时
|
|
||||||
/// </summary>
|
|
||||||
public void CheckTimeout()
|
|
||||||
{
|
|
||||||
// 注意:在连续时间段内无新增下载数据及判定为超时
|
|
||||||
if (_isAbort == false)
|
|
||||||
{
|
|
||||||
if (_latestDownloadBytes != _webRequest.downloadedBytes)
|
|
||||||
{
|
|
||||||
_latestDownloadBytes = _webRequest.downloadedBytes;
|
|
||||||
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
|
||||||
}
|
|
||||||
|
|
||||||
float offset = Time.realtimeSinceStartup - _latestDownloadRealtime;
|
|
||||||
if (offset > _timeout)
|
|
||||||
{
|
|
||||||
_webRequest.Abort();
|
|
||||||
_isAbort = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
116
Assets/YooAsset/Runtime/DownloadSystem/UnityWebRequesterBase.cs
Normal file
116
Assets/YooAsset/Runtime/DownloadSystem/UnityWebRequesterBase.cs
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal abstract class UnityWebRequesterBase
|
||||||
|
{
|
||||||
|
protected UnityWebRequest _webRequest;
|
||||||
|
protected UnityWebRequestAsyncOperation _operationHandle;
|
||||||
|
|
||||||
|
// 超时相关
|
||||||
|
private float _timeout;
|
||||||
|
private bool _isAbort = false;
|
||||||
|
private ulong _latestDownloadBytes;
|
||||||
|
private float _latestDownloadRealtime;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求URL地址
|
||||||
|
/// </summary>
|
||||||
|
public string URL { protected set; get; }
|
||||||
|
|
||||||
|
|
||||||
|
protected void ResetTimeout(float timeout)
|
||||||
|
{
|
||||||
|
_timeout = timeout;
|
||||||
|
_latestDownloadBytes = 0;
|
||||||
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 释放下载器
|
||||||
|
/// </summary>
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (_webRequest != null)
|
||||||
|
{
|
||||||
|
_webRequest.Dispose();
|
||||||
|
_webRequest = null;
|
||||||
|
_operationHandle = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否完毕(无论成功失败)
|
||||||
|
/// </summary>
|
||||||
|
public bool IsDone()
|
||||||
|
{
|
||||||
|
if (_operationHandle == null)
|
||||||
|
return false;
|
||||||
|
return _operationHandle.isDone;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下载进度
|
||||||
|
/// </summary>
|
||||||
|
public float Progress()
|
||||||
|
{
|
||||||
|
if (_operationHandle == null)
|
||||||
|
return 0;
|
||||||
|
return _operationHandle.progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下载是否发生错误
|
||||||
|
/// </summary>
|
||||||
|
public bool HasError()
|
||||||
|
{
|
||||||
|
#if UNITY_2020_3_OR_NEWER
|
||||||
|
return _webRequest.result != UnityWebRequest.Result.Success;
|
||||||
|
#else
|
||||||
|
if (_webRequest.isNetworkError || _webRequest.isHttpError)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取错误信息
|
||||||
|
/// </summary>
|
||||||
|
public string GetError()
|
||||||
|
{
|
||||||
|
if (_webRequest != null)
|
||||||
|
{
|
||||||
|
return $"URL : {URL} Error : {_webRequest.error}";
|
||||||
|
}
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检测超时
|
||||||
|
/// </summary>
|
||||||
|
public void CheckTimeout()
|
||||||
|
{
|
||||||
|
// 注意:在连续时间段内无新增下载数据及判定为超时
|
||||||
|
if (_isAbort == false)
|
||||||
|
{
|
||||||
|
if (_latestDownloadBytes != _webRequest.downloadedBytes)
|
||||||
|
{
|
||||||
|
_latestDownloadBytes = _webRequest.downloadedBytes;
|
||||||
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||||
|
}
|
||||||
|
|
||||||
|
float offset = Time.realtimeSinceStartup - _latestDownloadRealtime;
|
||||||
|
if (offset > _timeout)
|
||||||
|
{
|
||||||
|
_webRequest.Abort();
|
||||||
|
_isAbort = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4e5c3c1a1655a8b41b585c6811201583
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -20,6 +20,11 @@ namespace YooAsset
|
|||||||
/// 联机运行模式
|
/// 联机运行模式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
HostPlayMode,
|
HostPlayMode,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WebGL运行模式
|
||||||
|
/// </summary>
|
||||||
|
WebPlayMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -32,6 +37,18 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IDecryptionServices DecryptionServices = null;
|
public IDecryptionServices DecryptionServices = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 内置文件的根路径
|
||||||
|
/// 注意:当参数为空的时候会使用默认的根目录。
|
||||||
|
/// </summary>
|
||||||
|
public string BuildinRootDirectory = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 沙盒文件的根路径
|
||||||
|
/// 注意:当参数为空的时候会使用默认的根目录。
|
||||||
|
/// </summary>
|
||||||
|
public string SandboxRootDirectory = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源加载每帧处理的最大时间片段
|
/// 资源加载每帧处理的最大时间片段
|
||||||
/// 注意:默认值为MaxValue
|
/// 注意:默认值为MaxValue
|
||||||
@@ -69,18 +86,29 @@ namespace YooAsset
|
|||||||
public class HostPlayModeParameters : InitializeParameters
|
public class HostPlayModeParameters : InitializeParameters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 默认的资源服务器下载地址
|
/// 内置资源查询服务接口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string DefaultHostServer = string.Empty;
|
public IQueryServices QueryServices = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 备用的资源服务器下载地址
|
/// 远端资源地址查询服务类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string FallbackHostServer = string.Empty;
|
public IRemoteServices RemoteServices = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WebGL运行模式的初始化参数
|
||||||
|
/// </summary>
|
||||||
|
public class WebPlayModeParameters : InitializeParameters
|
||||||
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 内置资源查询服务接口
|
/// 内置资源查询服务接口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IQueryServices QueryServices = null;
|
public IQueryServices QueryServices = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 远端资源地址查询服务类
|
||||||
|
/// </summary>
|
||||||
|
public IRemoteServices RemoteServices = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,6 +61,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
var packageBundle = manifest.BundleList[i];
|
var packageBundle = manifest.BundleList[i];
|
||||||
buffer.WriteUTF8(packageBundle.BundleName);
|
buffer.WriteUTF8(packageBundle.BundleName);
|
||||||
|
buffer.WriteUInt32(packageBundle.UnityCRC);
|
||||||
buffer.WriteUTF8(packageBundle.FileHash);
|
buffer.WriteUTF8(packageBundle.FileHash);
|
||||||
buffer.WriteUTF8(packageBundle.FileCRC);
|
buffer.WriteUTF8(packageBundle.FileCRC);
|
||||||
buffer.WriteInt64(packageBundle.FileSize);
|
buffer.WriteInt64(packageBundle.FileSize);
|
||||||
@@ -139,6 +140,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
var packageBundle = new PackageBundle();
|
var packageBundle = new PackageBundle();
|
||||||
packageBundle.BundleName = buffer.ReadUTF8();
|
packageBundle.BundleName = buffer.ReadUTF8();
|
||||||
|
packageBundle.UnityCRC = buffer.ReadUInt32();
|
||||||
packageBundle.FileHash = buffer.ReadUTF8();
|
packageBundle.FileHash = buffer.ReadUTF8();
|
||||||
packageBundle.FileCRC = buffer.ReadUTF8();
|
packageBundle.FileCRC = buffer.ReadUTF8();
|
||||||
packageBundle.FileSize = buffer.ReadInt64();
|
packageBundle.FileSize = buffer.ReadInt64();
|
||||||
@@ -208,7 +210,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 批量转换解压为BundleInfo
|
/// 批量转换为解压BundleInfo
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<BundleInfo> ConvertToUnpackInfos(List<PackageBundle> unpackList)
|
public static List<BundleInfo> ConvertToUnpackInfos(List<PackageBundle> unpackList)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -135,8 +135,6 @@ namespace YooAsset
|
|||||||
if (downloader.IsDone() == false)
|
if (downloader.IsDone() == false)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
BundleInfo bundleInfo = downloader.GetBundleInfo();
|
|
||||||
|
|
||||||
// 检测是否下载失败
|
// 检测是否下载失败
|
||||||
if (downloader.HasError())
|
if (downloader.HasError())
|
||||||
{
|
{
|
||||||
@@ -148,7 +146,7 @@ namespace YooAsset
|
|||||||
// 下载成功
|
// 下载成功
|
||||||
_removeList.Add(downloader);
|
_removeList.Add(downloader);
|
||||||
_cachedDownloadCount++;
|
_cachedDownloadCount++;
|
||||||
_cachedDownloadBytes += bundleInfo.Bundle.FileSize;
|
_cachedDownloadBytes += downloader.GetDownloadFileSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 移除已经完成的下载器(无论成功或失败)
|
// 移除已经完成的下载器(无论成功或失败)
|
||||||
@@ -177,8 +175,9 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
int index = _downloadList.Count - 1;
|
int index = _downloadList.Count - 1;
|
||||||
var bundleInfo = _downloadList[index];
|
var bundleInfo = _downloadList[index];
|
||||||
var operation = DownloadSystem.BeginDownload(bundleInfo, _failedTryAgain, _timeout);
|
var downloader = DownloadSystem.CreateDownload(bundleInfo, _failedTryAgain, _timeout);
|
||||||
_downloaders.Add(operation);
|
downloader.SendRequest();
|
||||||
|
_downloaders.Add(downloader);
|
||||||
_downloadList.RemoveAt(index);
|
_downloadList.RemoveAt(index);
|
||||||
OnStartDownloadFileCallback?.Invoke(bundleInfo.Bundle.BundleName, bundleInfo.Bundle.FileSize);
|
OnStartDownloadFileCallback?.Invoke(bundleInfo.Bundle.BundleName, bundleInfo.Bundle.FileSize);
|
||||||
}
|
}
|
||||||
@@ -190,7 +189,7 @@ namespace YooAsset
|
|||||||
if (_failedList.Count > 0)
|
if (_failedList.Count > 0)
|
||||||
{
|
{
|
||||||
var failedDownloader = _failedList[0];
|
var failedDownloader = _failedList[0];
|
||||||
string fileName = failedDownloader.GetBundleInfo().Bundle.BundleName;
|
string fileName = failedDownloader.GetDownloadBundleName();
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = $"Failed to download file : {fileName}";
|
Error = $"Failed to download file : {fileName}";
|
||||||
|
|||||||
@@ -217,13 +217,13 @@ namespace YooAsset
|
|||||||
if (_steps == ESteps.CheckAppFootPrint)
|
if (_steps == ESteps.CheckAppFootPrint)
|
||||||
{
|
{
|
||||||
var appFootPrint = new AppFootPrint();
|
var appFootPrint = new AppFootPrint();
|
||||||
appFootPrint.Load();
|
appFootPrint.Load(_packageName);
|
||||||
|
|
||||||
// 如果水印发生变化,则说明覆盖安装后首次打开游戏
|
// 如果水印发生变化,则说明覆盖安装后首次打开游戏
|
||||||
if (appFootPrint.IsDirty())
|
if (appFootPrint.IsDirty())
|
||||||
{
|
{
|
||||||
PersistentTools.DeleteManifestFolder();
|
PersistentTools.GetPersistent(_packageName).DeleteSandboxManifestFilesFolder();
|
||||||
appFootPrint.Coverage();
|
appFootPrint.Coverage(_packageName);
|
||||||
YooLogger.Log("Delete manifest files when application foot print dirty !");
|
YooLogger.Log("Delete manifest files when application foot print dirty !");
|
||||||
}
|
}
|
||||||
_steps = ESteps.QueryCachePackageVersion;
|
_steps = ESteps.QueryCachePackageVersion;
|
||||||
@@ -364,6 +364,93 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WebGL运行模式的初始化操作
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class WebPlayModeInitializationOperation : InitializationOperation
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
QueryWebPackageVersion,
|
||||||
|
LoadWebManifest,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly WebPlayModeImpl _impl;
|
||||||
|
private readonly string _packageName;
|
||||||
|
private QueryBuildinPackageVersionOperation _queryWebPackageVersionOp;
|
||||||
|
private LoadBuildinManifestOperation _loadWebManifestOp;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
internal WebPlayModeInitializationOperation(WebPlayModeImpl impl, string packageName)
|
||||||
|
{
|
||||||
|
_impl = impl;
|
||||||
|
_packageName = packageName;
|
||||||
|
}
|
||||||
|
internal override void Start()
|
||||||
|
{
|
||||||
|
_steps = ESteps.QueryWebPackageVersion;
|
||||||
|
}
|
||||||
|
internal override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_steps == ESteps.QueryWebPackageVersion)
|
||||||
|
{
|
||||||
|
if (_queryWebPackageVersionOp == null)
|
||||||
|
{
|
||||||
|
_queryWebPackageVersionOp = new QueryBuildinPackageVersionOperation(_packageName);
|
||||||
|
OperationSystem.StartOperation(_queryWebPackageVersionOp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_queryWebPackageVersionOp.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_queryWebPackageVersionOp.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
_steps = ESteps.LoadWebManifest;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 注意:WebGL平台可能因为网络的原因会导致请求失败。如果内置清单不存在或者超时也不需要报错!
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
string error = _queryWebPackageVersionOp.Error;
|
||||||
|
YooLogger.Log($"Failed to load web package version file : {error}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.LoadWebManifest)
|
||||||
|
{
|
||||||
|
if (_loadWebManifestOp == null)
|
||||||
|
{
|
||||||
|
_loadWebManifestOp = new LoadBuildinManifestOperation(_packageName, _queryWebPackageVersionOp.PackageVersion);
|
||||||
|
OperationSystem.StartOperation(_loadWebManifestOp);
|
||||||
|
}
|
||||||
|
|
||||||
|
Progress = _loadWebManifestOp.Progress;
|
||||||
|
if (_loadWebManifestOp.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_loadWebManifestOp.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
PackageVersion = _loadWebManifestOp.Manifest.PackageVersion;
|
||||||
|
_impl.ActiveManifest = _loadWebManifestOp.Manifest;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _loadWebManifestOp.Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用程序水印
|
/// 应用程序水印
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -374,16 +461,16 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 读取应用程序水印
|
/// 读取应用程序水印
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Load()
|
public void Load(string packageName)
|
||||||
{
|
{
|
||||||
string footPrintFilePath = PersistentTools.GetAppFootPrintFilePath();
|
string footPrintFilePath = PersistentTools.GetPersistent(packageName).SandboxAppFootPrintFilePath;
|
||||||
if (File.Exists(footPrintFilePath))
|
if (File.Exists(footPrintFilePath))
|
||||||
{
|
{
|
||||||
_footPrint = FileUtility.ReadAllText(footPrintFilePath);
|
_footPrint = FileUtility.ReadAllText(footPrintFilePath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Coverage();
|
Coverage(packageName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,14 +489,14 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 覆盖掉水印
|
/// 覆盖掉水印
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Coverage()
|
public void Coverage(string packageName)
|
||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
_footPrint = Application.version;
|
_footPrint = Application.version;
|
||||||
#else
|
#else
|
||||||
_footPrint = Application.buildGUID;
|
_footPrint = Application.buildGUID;
|
||||||
#endif
|
#endif
|
||||||
string footPrintFilePath = PersistentTools.GetAppFootPrintFilePath();
|
string footPrintFilePath = PersistentTools.GetPersistent(packageName).SandboxAppFootPrintFilePath;
|
||||||
FileUtility.WriteAllText(footPrintFilePath, _footPrint);
|
FileUtility.WriteAllText(footPrintFilePath, _footPrint);
|
||||||
YooLogger.Log($"Save application foot print : {_footPrint}");
|
YooLogger.Log($"Save application foot print : {_footPrint}");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -196,6 +196,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
var packageBundle = new PackageBundle();
|
var packageBundle = new PackageBundle();
|
||||||
packageBundle.BundleName = _buffer.ReadUTF8();
|
packageBundle.BundleName = _buffer.ReadUTF8();
|
||||||
|
packageBundle.UnityCRC = _buffer.ReadUInt32();
|
||||||
packageBundle.FileHash = _buffer.ReadUTF8();
|
packageBundle.FileHash = _buffer.ReadUTF8();
|
||||||
packageBundle.FileCRC = _buffer.ReadUTF8();
|
packageBundle.FileCRC = _buffer.ReadUTF8();
|
||||||
packageBundle.FileSize = _buffer.ReadInt64();
|
packageBundle.FileSize = _buffer.ReadInt64();
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloader1 == null)
|
if (_downloader1 == null)
|
||||||
{
|
{
|
||||||
string savePath = PersistentTools.GetCachePackageHashFilePath(_packageName, _packageVersion);
|
string savePath = PersistentTools.GetPersistent(_packageName).GetSandboxPackageHashFilePath(_packageVersion);
|
||||||
string fileName = YooAssetSettingsData.GetPackageHashFileName(_packageName, _packageVersion);
|
string fileName = YooAssetSettingsData.GetPackageHashFileName(_packageName, _packageVersion);
|
||||||
string webURL = GetDownloadRequestURL(fileName);
|
string webURL = GetDownloadRequestURL(fileName);
|
||||||
YooLogger.Log($"Beginning to download package hash file : {webURL}");
|
YooLogger.Log($"Beginning to download package hash file : {webURL}");
|
||||||
@@ -71,7 +71,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloader2 == null)
|
if (_downloader2 == null)
|
||||||
{
|
{
|
||||||
string savePath = PersistentTools.GetCacheManifestFilePath(_packageName, _packageVersion);
|
string savePath = PersistentTools.GetPersistent(_packageName).GetSandboxPackageManifestFilePath(_packageVersion);
|
||||||
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_packageName, _packageVersion);
|
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_packageName, _packageVersion);
|
||||||
string webURL = GetDownloadRequestURL(fileName);
|
string webURL = GetDownloadRequestURL(fileName);
|
||||||
YooLogger.Log($"Beginning to download manifest file : {webURL}");
|
YooLogger.Log($"Beginning to download manifest file : {webURL}");
|
||||||
|
|||||||
@@ -41,8 +41,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloader == null)
|
if (_downloader == null)
|
||||||
{
|
{
|
||||||
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_buildinPackageName, _buildinPackageVersion);
|
string filePath = PersistentTools.GetPersistent(_buildinPackageName).GetBuildinPackageManifestFilePath(_buildinPackageVersion);
|
||||||
string filePath = PersistentTools.MakeStreamingLoadPath(fileName);
|
|
||||||
string url = PersistentTools.ConvertToWWWPath(filePath);
|
string url = PersistentTools.ConvertToWWWPath(filePath);
|
||||||
_downloader = new UnityWebDataRequester();
|
_downloader = new UnityWebDataRequester();
|
||||||
_downloader.SendRequest(url);
|
_downloader.SendRequest(url);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_steps == ESteps.VerifyFileHash)
|
if (_steps == ESteps.VerifyFileHash)
|
||||||
{
|
{
|
||||||
_manifestFilePath = PersistentTools.GetCacheManifestFilePath(_packageName, _packageVersion);
|
_manifestFilePath = PersistentTools.GetPersistent(_packageName).GetSandboxPackageManifestFilePath(_packageVersion);
|
||||||
if (File.Exists(_manifestFilePath) == false)
|
if (File.Exists(_manifestFilePath) == false)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
@@ -131,7 +131,7 @@ namespace YooAsset
|
|||||||
File.Delete(_manifestFilePath);
|
File.Delete(_manifestFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
string hashFilePath = PersistentTools.GetCachePackageHashFilePath(_packageName, _packageVersion);
|
string hashFilePath = PersistentTools.GetPersistent(_packageName).GetSandboxPackageHashFilePath(_packageVersion);
|
||||||
if (File.Exists(hashFilePath))
|
if (File.Exists(hashFilePath))
|
||||||
{
|
{
|
||||||
File.Delete(hashFilePath);
|
File.Delete(hashFilePath);
|
||||||
|
|||||||
@@ -0,0 +1,150 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal class LoadRemoteManifestOperation : AsyncOperationBase
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
DownloadPackageHashFile,
|
||||||
|
DownloadManifestFile,
|
||||||
|
VerifyFileHash,
|
||||||
|
CheckDeserializeManifest,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int RequestCount = 0;
|
||||||
|
private readonly IRemoteServices _remoteServices;
|
||||||
|
private readonly string _packageName;
|
||||||
|
private readonly string _packageVersion;
|
||||||
|
private readonly int _timeout;
|
||||||
|
private QueryRemotePackageHashOperation _queryRemotePackageHashOp;
|
||||||
|
private UnityWebDataRequester _downloader;
|
||||||
|
private DeserializeManifestOperation _deserializer;
|
||||||
|
private byte[] _fileData;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载的清单实例
|
||||||
|
/// </summary>
|
||||||
|
public PackageManifest Manifest { private set; get; }
|
||||||
|
|
||||||
|
|
||||||
|
internal LoadRemoteManifestOperation(IRemoteServices remoteServices, string packageName, string packageVersion, int timeout)
|
||||||
|
{
|
||||||
|
_remoteServices = remoteServices;
|
||||||
|
_packageName = packageName;
|
||||||
|
_packageVersion = packageVersion;
|
||||||
|
_timeout = timeout;
|
||||||
|
}
|
||||||
|
internal override void Start()
|
||||||
|
{
|
||||||
|
RequestCount++;
|
||||||
|
_steps = ESteps.DownloadPackageHashFile;
|
||||||
|
}
|
||||||
|
internal override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_steps == ESteps.DownloadPackageHashFile)
|
||||||
|
{
|
||||||
|
if (_queryRemotePackageHashOp == null)
|
||||||
|
{
|
||||||
|
_queryRemotePackageHashOp = new QueryRemotePackageHashOperation(_remoteServices, _packageName, _packageVersion, _timeout);
|
||||||
|
OperationSystem.StartOperation(_queryRemotePackageHashOp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_queryRemotePackageHashOp.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_queryRemotePackageHashOp.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
_steps = ESteps.DownloadManifestFile;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _queryRemotePackageHashOp.Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.DownloadManifestFile)
|
||||||
|
{
|
||||||
|
if (_downloader == null)
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_packageName, _packageVersion);
|
||||||
|
string webURL = GetDownloadRequestURL(fileName);
|
||||||
|
YooLogger.Log($"Beginning to download manifest file : {webURL}");
|
||||||
|
_downloader = new UnityWebDataRequester();
|
||||||
|
_downloader.SendRequest(webURL, _timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
_downloader.CheckTimeout();
|
||||||
|
if (_downloader.IsDone() == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_downloader.HasError())
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _downloader.GetError();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_fileData = _downloader.GetData();
|
||||||
|
_steps = ESteps.VerifyFileHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
_downloader.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.VerifyFileHash)
|
||||||
|
{
|
||||||
|
string fileHash = HashUtility.BytesMD5(_fileData);
|
||||||
|
if (fileHash != _queryRemotePackageHashOp.PackageHash)
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = "Failed to verify remote manifest file hash !";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_deserializer = new DeserializeManifestOperation(_fileData);
|
||||||
|
OperationSystem.StartOperation(_deserializer);
|
||||||
|
_steps = ESteps.CheckDeserializeManifest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.CheckDeserializeManifest)
|
||||||
|
{
|
||||||
|
Progress = _deserializer.Progress;
|
||||||
|
if (_deserializer.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_deserializer.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
Manifest = _deserializer.Manifest;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _deserializer.Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetDownloadRequestURL(string fileName)
|
||||||
|
{
|
||||||
|
// 轮流返回请求地址
|
||||||
|
if (RequestCount % 2 == 0)
|
||||||
|
return _remoteServices.GetRemoteFallbackURL(fileName);
|
||||||
|
else
|
||||||
|
return _remoteServices.GetRemoteMainURL(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 486ce3e7ad16f2948a36d49ecabd76b2
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -37,8 +37,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloader == null)
|
if (_downloader == null)
|
||||||
{
|
{
|
||||||
string fileName = YooAssetSettingsData.GetPackageVersionFileName(_packageName);
|
string filePath = PersistentTools.GetPersistent(_packageName).GetBuildinPackageVersionFilePath();
|
||||||
string filePath = PersistentTools.MakeStreamingLoadPath(fileName);
|
|
||||||
string url = PersistentTools.ConvertToWWWPath(filePath);
|
string url = PersistentTools.ConvertToWWWPath(filePath);
|
||||||
_downloader = new UnityWebDataRequester();
|
_downloader = new UnityWebDataRequester();
|
||||||
_downloader.SendRequest(url);
|
_downloader.SendRequest(url);
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_steps == ESteps.LoadCachePackageHashFile)
|
if (_steps == ESteps.LoadCachePackageHashFile)
|
||||||
{
|
{
|
||||||
string filePath = PersistentTools.GetCachePackageHashFilePath(_packageName, _packageVersion);
|
string filePath = PersistentTools.GetPersistent(_packageName).GetSandboxPackageHashFilePath(_packageVersion);
|
||||||
if (File.Exists(filePath) == false)
|
if (File.Exists(filePath) == false)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_steps == ESteps.LoadCachePackageVersionFile)
|
if (_steps == ESteps.LoadCachePackageVersionFile)
|
||||||
{
|
{
|
||||||
string filePath = PersistentTools.GetCachePackageVersionFilePath(_packageName);
|
string filePath = PersistentTools.GetPersistent(_packageName).GetSandboxPackageVersionFilePath();
|
||||||
if (File.Exists(filePath) == false)
|
if (File.Exists(filePath) == false)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal class QueryRemotePackageHashOperation : AsyncOperationBase
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
DownloadPackageHash,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int RequestCount = 0;
|
||||||
|
private readonly IRemoteServices _remoteServices;
|
||||||
|
private readonly string _packageName;
|
||||||
|
private readonly string _packageVersion;
|
||||||
|
private readonly int _timeout;
|
||||||
|
private UnityWebDataRequester _downloader;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 包裹哈希值
|
||||||
|
/// </summary>
|
||||||
|
public string PackageHash { private set; get; }
|
||||||
|
|
||||||
|
|
||||||
|
public QueryRemotePackageHashOperation(IRemoteServices remoteServices, string packageName, string packageVersion, int timeout)
|
||||||
|
{
|
||||||
|
_remoteServices = remoteServices;
|
||||||
|
_packageName = packageName;
|
||||||
|
_packageVersion = packageVersion;
|
||||||
|
_timeout = timeout;
|
||||||
|
}
|
||||||
|
internal override void Start()
|
||||||
|
{
|
||||||
|
RequestCount++;
|
||||||
|
_steps = ESteps.DownloadPackageHash;
|
||||||
|
}
|
||||||
|
internal override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_steps == ESteps.DownloadPackageHash)
|
||||||
|
{
|
||||||
|
if (_downloader == null)
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageHashFileName(_packageName, _packageVersion);
|
||||||
|
string webURL = GetPackageHashRequestURL(fileName);
|
||||||
|
YooLogger.Log($"Beginning to request package hash : {webURL}");
|
||||||
|
_downloader = new UnityWebDataRequester();
|
||||||
|
_downloader.SendRequest(webURL, _timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
Progress = _downloader.Progress();
|
||||||
|
_downloader.CheckTimeout();
|
||||||
|
if (_downloader.IsDone() == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_downloader.HasError())
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _downloader.GetError();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PackageHash = _downloader.GetText();
|
||||||
|
if (string.IsNullOrEmpty(PackageHash))
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Remote package hash is empty : {_downloader.URL}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_downloader.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetPackageHashRequestURL(string fileName)
|
||||||
|
{
|
||||||
|
string url;
|
||||||
|
|
||||||
|
// 轮流返回请求地址
|
||||||
|
if (RequestCount % 2 == 0)
|
||||||
|
url = _remoteServices.GetRemoteFallbackURL(fileName);
|
||||||
|
else
|
||||||
|
url = _remoteServices.GetRemoteMainURL(fileName);
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ef77260f58172dd42ad10cfb862b78ec
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.IO;
|
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class QueryRemotePackageVersionOperation : AsyncOperationBase
|
internal class QueryRemotePackageVersionOperation : AsyncOperationBase
|
||||||
@@ -54,6 +53,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
Progress = _downloader.Progress();
|
Progress = _downloader.Progress();
|
||||||
|
_downloader.CheckTimeout();
|
||||||
if (_downloader.IsDone() == false)
|
if (_downloader.IsDone() == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -31,13 +31,13 @@ namespace YooAsset
|
|||||||
if (_steps == ESteps.None || _steps == ESteps.Done)
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(_steps == ESteps.UnpackManifestHashFile)
|
if (_steps == ESteps.UnpackManifestHashFile)
|
||||||
{
|
{
|
||||||
if (_downloader1 == null)
|
if (_downloader1 == null)
|
||||||
{
|
{
|
||||||
string savePath = PersistentTools.GetCachePackageHashFilePath(_buildinPackageName, _buildinPackageVersion);
|
var persistent = PersistentTools.GetPersistent(_buildinPackageName);
|
||||||
string fileName = YooAssetSettingsData.GetPackageHashFileName(_buildinPackageName, _buildinPackageVersion);
|
string savePath = persistent.GetSandboxPackageHashFilePath(_buildinPackageVersion);
|
||||||
string filePath = PersistentTools.MakeStreamingLoadPath(fileName);
|
string filePath = persistent.GetBuildinPackageHashFilePath(_buildinPackageVersion);
|
||||||
string url = PersistentTools.ConvertToWWWPath(filePath);
|
string url = PersistentTools.ConvertToWWWPath(filePath);
|
||||||
_downloader1 = new UnityWebFileRequester();
|
_downloader1 = new UnityWebFileRequester();
|
||||||
_downloader1.SendRequest(url, savePath);
|
_downloader1.SendRequest(url, savePath);
|
||||||
@@ -64,9 +64,9 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloader2 == null)
|
if (_downloader2 == null)
|
||||||
{
|
{
|
||||||
string savePath = PersistentTools.GetCacheManifestFilePath(_buildinPackageName, _buildinPackageVersion);
|
var persistent = PersistentTools.GetPersistent(_buildinPackageName);
|
||||||
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(_buildinPackageName, _buildinPackageVersion);
|
string savePath = persistent.GetSandboxPackageManifestFilePath(_buildinPackageVersion);
|
||||||
string filePath = PersistentTools.MakeStreamingLoadPath(fileName);
|
string filePath = persistent.GetBuildinPackageManifestFilePath(_buildinPackageVersion);
|
||||||
string url = PersistentTools.ConvertToWWWPath(filePath);
|
string url = PersistentTools.ConvertToWWWPath(filePath);
|
||||||
_downloader2 = new UnityWebFileRequester();
|
_downloader2 = new UnityWebFileRequester();
|
||||||
_downloader2.SendRequest(url, savePath);
|
_downloader2.SendRequest(url, savePath);
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloadManifestOp == null)
|
if (_downloadManifestOp == null)
|
||||||
{
|
{
|
||||||
_downloadManifestOp = new DownloadManifestOperation(_impl, _packageName, _packageVersion, _timeout);
|
_downloadManifestOp = new DownloadManifestOperation(_impl.RemoteServices, _packageName, _packageVersion, _timeout);
|
||||||
OperationSystem.StartOperation(_downloadManifestOp);
|
OperationSystem.StartOperation(_downloadManifestOp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,4 +286,14 @@ namespace YooAsset
|
|||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
internal class WebPlayModePreDownloadContentOperation : PreDownloadContentOperation
|
||||||
|
{
|
||||||
|
internal override void Start()
|
||||||
|
{
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
internal override void Update()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -137,7 +137,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_downloadManifestOp == null)
|
if (_downloadManifestOp == null)
|
||||||
{
|
{
|
||||||
_downloadManifestOp = new DownloadManifestOperation(_impl, _packageName, _packageVersion, _timeout);
|
_downloadManifestOp = new DownloadManifestOperation(_impl.RemoteServices, _packageName, _packageVersion, _timeout);
|
||||||
OperationSystem.StartOperation(_downloadManifestOp);
|
OperationSystem.StartOperation(_downloadManifestOp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,4 +189,82 @@ namespace YooAsset
|
|||||||
_impl.FlushManifestVersionFile();
|
_impl.FlushManifestVersionFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WebGL模式的更新清单操作
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class WebPlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
CheckActiveManifest,
|
||||||
|
LoadRemoteManifest,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly WebPlayModeImpl _impl;
|
||||||
|
private readonly string _packageName;
|
||||||
|
private readonly string _packageVersion;
|
||||||
|
private readonly int _timeout;
|
||||||
|
private LoadRemoteManifestOperation _loadCacheManifestOp;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
|
||||||
|
internal WebPlayModeUpdatePackageManifestOperation(WebPlayModeImpl impl, string packageName, string packageVersion, int timeout)
|
||||||
|
{
|
||||||
|
_impl = impl;
|
||||||
|
_packageName = packageName;
|
||||||
|
_packageVersion = packageVersion;
|
||||||
|
_timeout = timeout;
|
||||||
|
}
|
||||||
|
internal override void Start()
|
||||||
|
{
|
||||||
|
_steps = ESteps.CheckActiveManifest;
|
||||||
|
}
|
||||||
|
internal override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_steps == ESteps.CheckActiveManifest)
|
||||||
|
{
|
||||||
|
// 检测当前激活的清单对象
|
||||||
|
if (_impl.ActiveManifest != null && _impl.ActiveManifest.PackageVersion == _packageVersion)
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.LoadRemoteManifest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.LoadRemoteManifest)
|
||||||
|
{
|
||||||
|
if (_loadCacheManifestOp == null)
|
||||||
|
{
|
||||||
|
_loadCacheManifestOp = new LoadRemoteManifestOperation(_impl.RemoteServices, _packageName, _packageVersion, _timeout);
|
||||||
|
OperationSystem.StartOperation(_loadCacheManifestOp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_loadCacheManifestOp.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_loadCacheManifestOp.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
_impl.ActiveManifest = _loadCacheManifestOp.Manifest;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _loadCacheManifestOp.Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,69 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_queryRemotePackageVersionOp == null)
|
if (_queryRemotePackageVersionOp == null)
|
||||||
{
|
{
|
||||||
_queryRemotePackageVersionOp = new QueryRemotePackageVersionOperation(_impl, _packageName, _appendTimeTicks, _timeout);
|
_queryRemotePackageVersionOp = new QueryRemotePackageVersionOperation(_impl.RemoteServices, _packageName, _appendTimeTicks, _timeout);
|
||||||
|
OperationSystem.StartOperation(_queryRemotePackageVersionOp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_queryRemotePackageVersionOp.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_queryRemotePackageVersionOp.Status == EOperationStatus.Succeed)
|
||||||
|
{
|
||||||
|
PackageVersion = _queryRemotePackageVersionOp.PackageVersion;
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = _queryRemotePackageVersionOp.Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WebGL模式的请求远端包裹的最新版本
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class WebPlayModeUpdatePackageVersionOperation : UpdatePackageVersionOperation
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
QueryRemotePackageVersion,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly WebPlayModeImpl _impl;
|
||||||
|
private readonly string _packageName;
|
||||||
|
private readonly bool _appendTimeTicks;
|
||||||
|
private readonly int _timeout;
|
||||||
|
private QueryRemotePackageVersionOperation _queryRemotePackageVersionOp;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
internal WebPlayModeUpdatePackageVersionOperation(WebPlayModeImpl impl, string packageName, bool appendTimeTicks, int timeout)
|
||||||
|
{
|
||||||
|
_impl = impl;
|
||||||
|
_packageName = packageName;
|
||||||
|
_appendTimeTicks = appendTimeTicks;
|
||||||
|
_timeout = timeout;
|
||||||
|
}
|
||||||
|
internal override void Start()
|
||||||
|
{
|
||||||
|
_steps = ESteps.QueryRemotePackageVersion;
|
||||||
|
}
|
||||||
|
internal override void Update()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_steps == ESteps.QueryRemotePackageVersion)
|
||||||
|
{
|
||||||
|
if (_queryRemotePackageVersionOp == null)
|
||||||
|
{
|
||||||
|
_queryRemotePackageVersionOp = new QueryRemotePackageVersionOperation(_impl.RemoteServices, _packageName, _appendTimeTicks, _timeout);
|
||||||
OperationSystem.StartOperation(_queryRemotePackageVersionOp);
|
OperationSystem.StartOperation(_queryRemotePackageVersionOp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,11 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string BundleName;
|
public string BundleName;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unity引擎生成的CRC
|
||||||
|
/// </summary>
|
||||||
|
public uint UnityCRC;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件哈希值
|
/// 文件哈希值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -74,13 +79,13 @@ namespace YooAsset
|
|||||||
string folderName = FileHash.Substring(0, 2);
|
string folderName = FileHash.Substring(0, 2);
|
||||||
if (IsRawFile)
|
if (IsRawFile)
|
||||||
{
|
{
|
||||||
string cacheRoot = PersistentTools.GetCachedRawFileFolderPath(PackageName);
|
string cacheRoot = PersistentTools.GetPersistent(PackageName).SandboxCacheRawFilesRoot;
|
||||||
_cachedDataFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleDataFileName);
|
_cachedDataFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleDataFileName);
|
||||||
_cachedDataFilePath += _fileExtension;
|
_cachedDataFilePath += _fileExtension;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string cacheRoot = PersistentTools.GetCachedBundleFileFolderPath(PackageName);
|
string cacheRoot = PersistentTools.GetPersistent(PackageName).SandboxCacheBundleFilesRoot;
|
||||||
_cachedDataFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleDataFileName);
|
_cachedDataFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleDataFileName);
|
||||||
}
|
}
|
||||||
return _cachedDataFilePath;
|
return _cachedDataFilePath;
|
||||||
@@ -101,12 +106,12 @@ namespace YooAsset
|
|||||||
string folderName = FileHash.Substring(0, 2);
|
string folderName = FileHash.Substring(0, 2);
|
||||||
if (IsRawFile)
|
if (IsRawFile)
|
||||||
{
|
{
|
||||||
string cacheRoot = PersistentTools.GetCachedRawFileFolderPath(PackageName);
|
string cacheRoot = PersistentTools.GetPersistent(PackageName).SandboxCacheRawFilesRoot;
|
||||||
_cachedInfoFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleInfoFileName);
|
_cachedInfoFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleInfoFileName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string cacheRoot = PersistentTools.GetCachedBundleFileFolderPath(PackageName);
|
string cacheRoot = PersistentTools.GetPersistent(PackageName).SandboxCacheBundleFilesRoot;
|
||||||
_cachedInfoFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleInfoFileName);
|
_cachedInfoFilePath = PathUtility.Combine(cacheRoot, folderName, CacheGUID, YooAssetSettings.CacheBundleInfoFileName);
|
||||||
}
|
}
|
||||||
return _cachedInfoFilePath;
|
return _cachedInfoFilePath;
|
||||||
@@ -140,7 +145,8 @@ namespace YooAsset
|
|||||||
if (string.IsNullOrEmpty(_streamingFilePath) == false)
|
if (string.IsNullOrEmpty(_streamingFilePath) == false)
|
||||||
return _streamingFilePath;
|
return _streamingFilePath;
|
||||||
|
|
||||||
_streamingFilePath = PersistentTools.MakeStreamingLoadPath(FileName);
|
string root = PersistentTools.GetPersistent(PackageName).BuildinPackageRoot;
|
||||||
|
_streamingFilePath = PathUtility.Combine(root, FileName);
|
||||||
return _streamingFilePath;
|
return _streamingFilePath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,25 +4,28 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class HostPlayModeImpl : IPlayModeServices, IBundleServices, IRemoteServices
|
internal class HostPlayModeImpl : IPlayModeServices, IBundleServices
|
||||||
{
|
{
|
||||||
private PackageManifest _activeManifest;
|
private PackageManifest _activeManifest;
|
||||||
|
|
||||||
// 参数相关
|
// 参数相关
|
||||||
private string _packageName;
|
private string _packageName;
|
||||||
private string _defaultHostServer;
|
|
||||||
private string _fallbackHostServer;
|
|
||||||
private IQueryServices _queryServices;
|
private IQueryServices _queryServices;
|
||||||
|
private IRemoteServices _remoteServices;
|
||||||
|
|
||||||
|
public IRemoteServices RemoteServices
|
||||||
|
{
|
||||||
|
get { return _remoteServices; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 异步初始化
|
/// 异步初始化
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public InitializationOperation InitializeAsync(string packageName, string defaultHostServer, string fallbackHostServer, IQueryServices queryServices)
|
public InitializationOperation InitializeAsync(string packageName, IQueryServices queryServices, IRemoteServices remoteServices)
|
||||||
{
|
{
|
||||||
_packageName = packageName;
|
_packageName = packageName;
|
||||||
_defaultHostServer = defaultHostServer;
|
|
||||||
_fallbackHostServer = fallbackHostServer;
|
|
||||||
_queryServices = queryServices;
|
_queryServices = queryServices;
|
||||||
|
_remoteServices = remoteServices;
|
||||||
|
|
||||||
var operation = new HostPlayModeInitializationOperation(this, packageName);
|
var operation = new HostPlayModeInitializationOperation(this, packageName);
|
||||||
OperationSystem.StartOperation(operation);
|
OperationSystem.StartOperation(operation);
|
||||||
@@ -42,23 +45,12 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
private BundleInfo ConvertToDownloadInfo(PackageBundle packageBundle)
|
private BundleInfo ConvertToDownloadInfo(PackageBundle packageBundle)
|
||||||
{
|
{
|
||||||
string remoteMainURL = GetRemoteMainURL(packageBundle.FileName);
|
string remoteMainURL = _remoteServices.GetRemoteMainURL(packageBundle.FileName);
|
||||||
string remoteFallbackURL = GetRemoteFallbackURL(packageBundle.FileName);
|
string remoteFallbackURL = _remoteServices.GetRemoteFallbackURL(packageBundle.FileName);
|
||||||
BundleInfo bundleInfo = new BundleInfo(packageBundle, BundleInfo.ELoadMode.LoadFromRemote, remoteMainURL, remoteFallbackURL);
|
BundleInfo bundleInfo = new BundleInfo(packageBundle, BundleInfo.ELoadMode.LoadFromRemote, remoteMainURL, remoteFallbackURL);
|
||||||
return bundleInfo;
|
return bundleInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IRemoteServices接口
|
|
||||||
public string GetRemoteMainURL(string fileName)
|
|
||||||
{
|
|
||||||
return $"{_defaultHostServer}/{fileName}";
|
|
||||||
}
|
|
||||||
public string GetRemoteFallbackURL(string fileName)
|
|
||||||
{
|
|
||||||
return $"{_fallbackHostServer}/{fileName}";
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IPlayModeServices接口
|
#region IPlayModeServices接口
|
||||||
public PackageManifest ActiveManifest
|
public PackageManifest ActiveManifest
|
||||||
{
|
{
|
||||||
@@ -74,12 +66,14 @@ namespace YooAsset
|
|||||||
public void FlushManifestVersionFile()
|
public void FlushManifestVersionFile()
|
||||||
{
|
{
|
||||||
if (_activeManifest != null)
|
if (_activeManifest != null)
|
||||||
PersistentTools.SaveCachePackageVersionFile(_packageName, _activeManifest.PackageVersion);
|
{
|
||||||
|
PersistentTools.GetPersistent(_packageName).SaveSandboxPackageVersionFile(_activeManifest.PackageVersion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsBuildinPackageBundle(PackageBundle packageBundle)
|
private bool IsBuildinPackageBundle(PackageBundle packageBundle)
|
||||||
{
|
{
|
||||||
return _queryServices.QueryStreamingAssets(packageBundle.FileName);
|
return _queryServices.QueryStreamingAssets(_packageName, packageBundle.FileName);
|
||||||
}
|
}
|
||||||
private bool IsCachedPackageBundle(PackageBundle packageBundle)
|
private bool IsCachedPackageBundle(PackageBundle packageBundle)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,157 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
internal class WebPlayModeImpl : IPlayModeServices, IBundleServices
|
||||||
|
{
|
||||||
|
private PackageManifest _activeManifest;
|
||||||
|
|
||||||
|
// 参数相关
|
||||||
|
private string _packageName;
|
||||||
|
private IQueryServices _queryServices;
|
||||||
|
private IRemoteServices _remoteServices;
|
||||||
|
|
||||||
|
public IRemoteServices RemoteServices
|
||||||
|
{
|
||||||
|
get { return _remoteServices; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步初始化
|
||||||
|
/// </summary>
|
||||||
|
public InitializationOperation InitializeAsync(string packageName, IQueryServices queryServices, IRemoteServices remoteServices)
|
||||||
|
{
|
||||||
|
_packageName = packageName;
|
||||||
|
_queryServices = queryServices;
|
||||||
|
_remoteServices = remoteServices;
|
||||||
|
|
||||||
|
var operation = new WebPlayModeInitializationOperation(this, packageName);
|
||||||
|
OperationSystem.StartOperation(operation);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下载相关
|
||||||
|
private BundleInfo ConvertToDownloadInfo(PackageBundle packageBundle)
|
||||||
|
{
|
||||||
|
string remoteMainURL = _remoteServices.GetRemoteMainURL(packageBundle.FileName);
|
||||||
|
string remoteFallbackURL = _remoteServices.GetRemoteFallbackURL(packageBundle.FileName);
|
||||||
|
BundleInfo bundleInfo = new BundleInfo(packageBundle, BundleInfo.ELoadMode.LoadFromRemote, remoteMainURL, remoteFallbackURL);
|
||||||
|
return bundleInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IPlayModeServices接口
|
||||||
|
public PackageManifest ActiveManifest
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_activeManifest = value;
|
||||||
|
}
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _activeManifest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void FlushManifestVersionFile()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsBuildinPackageBundle(PackageBundle packageBundle)
|
||||||
|
{
|
||||||
|
return _queryServices.QueryStreamingAssets(_packageName, packageBundle.FileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdatePackageVersionOperation IPlayModeServices.UpdatePackageVersionAsync(bool appendTimeTicks, int timeout)
|
||||||
|
{
|
||||||
|
var operation = new WebPlayModeUpdatePackageVersionOperation(this, _packageName, appendTimeTicks, timeout);
|
||||||
|
OperationSystem.StartOperation(operation);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
UpdatePackageManifestOperation IPlayModeServices.UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion, int timeout)
|
||||||
|
{
|
||||||
|
var operation = new WebPlayModeUpdatePackageManifestOperation(this, _packageName, packageVersion, timeout);
|
||||||
|
OperationSystem.StartOperation(operation);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
PreDownloadContentOperation IPlayModeServices.PreDownloadContentAsync(string packageVersion, int timeout)
|
||||||
|
{
|
||||||
|
var operation = new WebPlayModePreDownloadContentOperation();
|
||||||
|
OperationSystem.StartOperation(operation);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceDownloaderOperation IPlayModeServices.CreateResourceDownloaderByAll(int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||||
|
{
|
||||||
|
return ResourceDownloaderOperation.CreateEmptyDownloader(downloadingMaxNumber, failedTryAgain, timeout);
|
||||||
|
}
|
||||||
|
ResourceDownloaderOperation IPlayModeServices.CreateResourceDownloaderByTags(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||||
|
{
|
||||||
|
return ResourceDownloaderOperation.CreateEmptyDownloader(downloadingMaxNumber, failedTryAgain, timeout);
|
||||||
|
}
|
||||||
|
ResourceDownloaderOperation IPlayModeServices.CreateResourceDownloaderByPaths(AssetInfo[] assetInfos, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||||
|
{
|
||||||
|
return ResourceDownloaderOperation.CreateEmptyDownloader(downloadingMaxNumber, failedTryAgain, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceUnpackerOperation IPlayModeServices.CreateResourceUnpackerByAll(int upackingMaxNumber, int failedTryAgain, int timeout)
|
||||||
|
{
|
||||||
|
return ResourceUnpackerOperation.CreateEmptyUnpacker(upackingMaxNumber, failedTryAgain, timeout);
|
||||||
|
}
|
||||||
|
ResourceUnpackerOperation IPlayModeServices.CreateResourceUnpackerByTags(string[] tags, int upackingMaxNumber, int failedTryAgain, int timeout)
|
||||||
|
{
|
||||||
|
return ResourceUnpackerOperation.CreateEmptyUnpacker(upackingMaxNumber, failedTryAgain, timeout);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IBundleServices接口
|
||||||
|
private BundleInfo CreateBundleInfo(PackageBundle packageBundle)
|
||||||
|
{
|
||||||
|
if (packageBundle == null)
|
||||||
|
throw new Exception("Should never get here !");
|
||||||
|
|
||||||
|
// 查询APP资源
|
||||||
|
if (IsBuildinPackageBundle(packageBundle))
|
||||||
|
{
|
||||||
|
BundleInfo bundleInfo = new BundleInfo(packageBundle, BundleInfo.ELoadMode.LoadFromStreaming);
|
||||||
|
return bundleInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从服务端下载
|
||||||
|
return ConvertToDownloadInfo(packageBundle);
|
||||||
|
}
|
||||||
|
BundleInfo IBundleServices.GetBundleInfo(AssetInfo assetInfo)
|
||||||
|
{
|
||||||
|
if (assetInfo.IsInvalid)
|
||||||
|
throw new Exception("Should never get here !");
|
||||||
|
|
||||||
|
// 注意:如果清单里未找到资源包会抛出异常!
|
||||||
|
var packageBundle = _activeManifest.GetMainPackageBundle(assetInfo.AssetPath);
|
||||||
|
return CreateBundleInfo(packageBundle);
|
||||||
|
}
|
||||||
|
BundleInfo[] IBundleServices.GetAllDependBundleInfos(AssetInfo assetInfo)
|
||||||
|
{
|
||||||
|
if (assetInfo.IsInvalid)
|
||||||
|
throw new Exception("Should never get here !");
|
||||||
|
|
||||||
|
// 注意:如果清单里未找到资源包会抛出异常!
|
||||||
|
var depends = _activeManifest.GetAllDependencies(assetInfo.AssetPath);
|
||||||
|
List<BundleInfo> result = new List<BundleInfo>(depends.Length);
|
||||||
|
foreach (var packageBundle in depends)
|
||||||
|
{
|
||||||
|
BundleInfo bundleInfo = CreateBundleInfo(packageBundle);
|
||||||
|
result.Add(bundleInfo);
|
||||||
|
}
|
||||||
|
return result.ToArray();
|
||||||
|
}
|
||||||
|
string IBundleServices.GetBundleName(int bundleID)
|
||||||
|
{
|
||||||
|
return _activeManifest.GetBundleName(bundleID);
|
||||||
|
}
|
||||||
|
bool IBundleServices.IsServicesValid()
|
||||||
|
{
|
||||||
|
return _activeManifest != null;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fa7d8823ee040534db067e6e2c254267
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -62,7 +62,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_assetSystemImpl != null)
|
if (_assetSystemImpl != null)
|
||||||
{
|
{
|
||||||
_assetSystemImpl.DestroyAll();
|
_assetSystemImpl.ForceUnloadAllAssets();
|
||||||
_assetSystemImpl = null;
|
_assetSystemImpl = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,6 +79,10 @@ namespace YooAsset
|
|||||||
// 检测初始化参数合法性
|
// 检测初始化参数合法性
|
||||||
CheckInitializeParameters(parameters);
|
CheckInitializeParameters(parameters);
|
||||||
|
|
||||||
|
// 重写持久化根目录
|
||||||
|
var persistent = PersistentTools.GetOrCreatePersistent(PackageName);
|
||||||
|
persistent.OverwriteRootDirectory(parameters.BuildinRootDirectory, parameters.SandboxRootDirectory);
|
||||||
|
|
||||||
// 初始化资源系统
|
// 初始化资源系统
|
||||||
InitializationOperation initializeOperation;
|
InitializationOperation initializeOperation;
|
||||||
_assetSystemImpl = new AssetSystemImpl();
|
_assetSystemImpl = new AssetSystemImpl();
|
||||||
@@ -118,9 +122,24 @@ namespace YooAsset
|
|||||||
var initializeParameters = parameters as HostPlayModeParameters;
|
var initializeParameters = parameters as HostPlayModeParameters;
|
||||||
initializeOperation = hostPlayModeImpl.InitializeAsync(
|
initializeOperation = hostPlayModeImpl.InitializeAsync(
|
||||||
PackageName,
|
PackageName,
|
||||||
initializeParameters.DefaultHostServer,
|
initializeParameters.QueryServices,
|
||||||
initializeParameters.FallbackHostServer,
|
initializeParameters.RemoteServices
|
||||||
initializeParameters.QueryServices
|
);
|
||||||
|
}
|
||||||
|
else if (_playMode == EPlayMode.WebPlayMode)
|
||||||
|
{
|
||||||
|
var webPlayModeImpl = new WebPlayModeImpl();
|
||||||
|
_bundleServices = webPlayModeImpl;
|
||||||
|
_playModeServices = webPlayModeImpl;
|
||||||
|
_assetSystemImpl.Initialize(PackageName, false,
|
||||||
|
parameters.LoadingMaxTimeSlice, parameters.DownloadFailedTryAgain,
|
||||||
|
parameters.DecryptionServices, _bundleServices);
|
||||||
|
|
||||||
|
var initializeParameters = parameters as WebPlayModeParameters;
|
||||||
|
initializeOperation = webPlayModeImpl.InitializeAsync(
|
||||||
|
PackageName,
|
||||||
|
initializeParameters.QueryServices,
|
||||||
|
initializeParameters.RemoteServices
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -168,12 +187,10 @@ namespace YooAsset
|
|||||||
if (parameters is HostPlayModeParameters)
|
if (parameters is HostPlayModeParameters)
|
||||||
{
|
{
|
||||||
var hostPlayModeParameters = parameters as HostPlayModeParameters;
|
var hostPlayModeParameters = parameters as HostPlayModeParameters;
|
||||||
if (string.IsNullOrEmpty(hostPlayModeParameters.DefaultHostServer))
|
|
||||||
throw new Exception($"${hostPlayModeParameters.DefaultHostServer} is null or empty.");
|
|
||||||
if (string.IsNullOrEmpty(hostPlayModeParameters.FallbackHostServer))
|
|
||||||
throw new Exception($"${hostPlayModeParameters.FallbackHostServer} is null or empty.");
|
|
||||||
if (hostPlayModeParameters.QueryServices == null)
|
if (hostPlayModeParameters.QueryServices == null)
|
||||||
throw new Exception($"{nameof(IQueryServices)} is null.");
|
throw new Exception($"{nameof(IQueryServices)} is null.");
|
||||||
|
if (hostPlayModeParameters.RemoteServices == null)
|
||||||
|
throw new Exception($"{nameof(IRemoteServices)} is null.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 鉴定运行模式
|
// 鉴定运行模式
|
||||||
@@ -183,9 +200,19 @@ namespace YooAsset
|
|||||||
_playMode = EPlayMode.OfflinePlayMode;
|
_playMode = EPlayMode.OfflinePlayMode;
|
||||||
else if (parameters is HostPlayModeParameters)
|
else if (parameters is HostPlayModeParameters)
|
||||||
_playMode = EPlayMode.HostPlayMode;
|
_playMode = EPlayMode.HostPlayMode;
|
||||||
|
else if (parameters is WebPlayModeParameters)
|
||||||
|
_playMode = EPlayMode.WebPlayMode;
|
||||||
else
|
else
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
|
||||||
|
// 检测运行平台
|
||||||
|
if (_playMode == EPlayMode.HostPlayMode || _playMode == EPlayMode.OfflinePlayMode)
|
||||||
|
{
|
||||||
|
#if UNITY_WEBGL
|
||||||
|
throw new Exception($"WebGL plateform not support : {_playMode} ! Please use {nameof(EPlayMode.WebPlayMode)}");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// 检测参数范围
|
// 检测参数范围
|
||||||
if (parameters.LoadingMaxTimeSlice < 10)
|
if (parameters.LoadingMaxTimeSlice < 10)
|
||||||
{
|
{
|
||||||
@@ -291,6 +318,37 @@ namespace YooAsset
|
|||||||
_assetSystemImpl.ForceUnloadAllAssets();
|
_assetSystemImpl.ForceUnloadAllAssets();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region 沙盒相关
|
||||||
|
/// <summary>
|
||||||
|
/// 获取包裹的内置文件根路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetPackageBuildinRootDirectory()
|
||||||
|
{
|
||||||
|
DebugCheckInitialize();
|
||||||
|
var persistent = PersistentTools.GetPersistent(PackageName);
|
||||||
|
return persistent.BuildinRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取包裹的沙盒文件根路径
|
||||||
|
/// </summary>
|
||||||
|
public string GetPackageSandboxRootDirectory()
|
||||||
|
{
|
||||||
|
DebugCheckInitialize();
|
||||||
|
var persistent = PersistentTools.GetPersistent(PackageName);
|
||||||
|
return persistent.SandboxRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清空包裹的沙盒目录
|
||||||
|
/// </summary>
|
||||||
|
public void ClearPackageSandbox()
|
||||||
|
{
|
||||||
|
DebugCheckInitialize();
|
||||||
|
var persistent = PersistentTools.GetPersistent(PackageName);
|
||||||
|
persistent.DeleteSandboxPackageFolder();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 资源信息
|
#region 资源信息
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询内置资源
|
/// 查询内置资源
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool QueryStreamingAssets(string fileName);
|
bool QueryStreamingAssets(string packageName, string fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,18 @@
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal interface IRemoteServices
|
public interface IRemoteServices
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取主资源站的资源地址
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fileName">请求的文件名称</param>
|
||||||
string GetRemoteMainURL(string fileName);
|
string GetRemoteMainURL(string fileName);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取备用资源站的资源地址
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fileName">请求的文件名称</param>
|
||||||
string GetRemoteFallbackURL(string fileName);
|
string GetRemoteFallbackURL(string fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 清单文件格式版本
|
/// 清单文件格式版本
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string ManifestFileVersion = "1.4.17";
|
public const string ManifestFileVersion = "1.5.2";
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -37,6 +37,31 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const string CacheBundleInfoFileName = "__info";
|
public const string CacheBundleInfoFileName = "__info";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 默认的YooAsset文件夹名称
|
||||||
|
/// </summary>
|
||||||
|
public const string DefaultYooFolderName = "yoo";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存的资源文件的文件夹名称
|
||||||
|
/// </summary>
|
||||||
|
public const string CachedBundleFileFolder = "CacheBundleFiles";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存的原生文件的文件夹名称
|
||||||
|
/// </summary>
|
||||||
|
public const string CachedRawFileFolder = "CacheRawFiles";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缓存的清单文件的文件夹名称
|
||||||
|
/// </summary>
|
||||||
|
public const string ManifestFolderName = "ManifestFiles";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 记录应用程序版本的文件名称
|
||||||
|
/// </summary>
|
||||||
|
public const string AppFootPrintFileName = "ApplicationFootPrint.bytes";
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建输出文件夹名称
|
/// 构建输出文件夹名称
|
||||||
@@ -47,10 +72,5 @@ namespace YooAsset
|
|||||||
/// 构建输出的报告文件
|
/// 构建输出的报告文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string ReportFileName = "BuildReport";
|
public const string ReportFileName = "BuildReport";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 内置资源目录名称
|
|
||||||
/// </summary>
|
|
||||||
public const string StreamingAssetsBuildinFolder = "BuildinFiles";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -217,6 +217,21 @@ namespace YooAsset
|
|||||||
DownloadSystem.RequestDelegate = 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>
|
||||||
/// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)
|
/// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -239,51 +254,11 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置缓存系统参数,沙盒目录的存储路径
|
/// 设置缓存系统参数,禁用缓存在WebGL平台
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void SetCacheSystemSandboxPath(string sandboxPath)
|
public static void SetCacheSystemDisableCacheOnWebGL()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(sandboxPath))
|
CacheSystem.DisableUnityCacheOnWebGL = true;
|
||||||
{
|
|
||||||
YooLogger.Error($"Sandbox path is null or empty !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注意:需要确保没有任何资源系统起效之前才可以设置沙盒目录!
|
|
||||||
if (_packages.Count > 0)
|
|
||||||
{
|
|
||||||
YooLogger.Error($"Please call this method {nameof(SetCacheSystemSandboxPath)} before the package is created !");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PersistentTools.OverwriteSandboxPath(sandboxPath);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 沙盒相关
|
|
||||||
/// <summary>
|
|
||||||
/// 获取内置文件夹名称
|
|
||||||
/// </summary>
|
|
||||||
public static string GetStreamingAssetBuildinFolderName()
|
|
||||||
{
|
|
||||||
return YooAssetSettings.StreamingAssetsBuildinFolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取沙盒的根路径
|
|
||||||
/// </summary>
|
|
||||||
public static string GetSandboxRoot()
|
|
||||||
{
|
|
||||||
return PersistentTools.GetPersistentRootPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清空沙盒目录(需要重启APP)
|
|
||||||
/// </summary>
|
|
||||||
public static void ClearSandbox()
|
|
||||||
{
|
|
||||||
YooLogger.Warning("Clear sandbox folder files, Finally, restart the application !");
|
|
||||||
PersistentTools.DeleteSandbox();
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
static PackageCompareWindow _thisInstance;
|
static PackageCompareWindow _thisInstance;
|
||||||
|
|
||||||
[MenuItem("YooAsset/补丁包比对工具", false, 302)]
|
[MenuItem("Tools/补丁包比对工具", false, 102)]
|
||||||
static void ShowWindow()
|
static void ShowWindow()
|
||||||
{
|
{
|
||||||
if (_thisInstance == null)
|
if (_thisInstance == null)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
static PackageImportWindow _thisInstance;
|
static PackageImportWindow _thisInstance;
|
||||||
|
|
||||||
[MenuItem("YooAsset/补丁包导入工具", false, 301)]
|
[MenuItem("Tools/补丁包导入工具", false, 101)]
|
||||||
static void ShowWindow()
|
static void ShowWindow()
|
||||||
{
|
{
|
||||||
if (_thisInstance == null)
|
if (_thisInstance == null)
|
||||||
@@ -20,6 +20,7 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
|
|
||||||
private string _manifestPath = string.Empty;
|
private string _manifestPath = string.Empty;
|
||||||
|
private string _packageName = "DefaultPackage";
|
||||||
|
|
||||||
private void OnGUI()
|
private void OnGUI()
|
||||||
{
|
{
|
||||||
@@ -39,7 +40,8 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
if (GUILayout.Button("导入补丁包(全部文件)", GUILayout.MaxWidth(150)))
|
if (GUILayout.Button("导入补丁包(全部文件)", GUILayout.MaxWidth(150)))
|
||||||
{
|
{
|
||||||
AssetBundleBuilderHelper.ClearStreamingAssetsFolder();
|
string streamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
||||||
|
EditorTools.ClearFolder(streamingAssetsRoot);
|
||||||
CopyPackageFiles(_manifestPath);
|
CopyPackageFiles(_manifestPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,18 +59,18 @@ namespace YooAsset.Editor
|
|||||||
// 拷贝核心文件
|
// 拷贝核心文件
|
||||||
{
|
{
|
||||||
string sourcePath = $"{outputDirectory}/{manifestFileName}.bytes";
|
string sourcePath = $"{outputDirectory}/{manifestFileName}.bytes";
|
||||||
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{manifestFileName}.bytes";
|
string destPath = $"{AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot()}/{_packageName}/{manifestFileName}.bytes";
|
||||||
EditorTools.CopyFile(sourcePath, destPath, true);
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
string sourcePath = $"{outputDirectory}/{manifestFileName}.hash";
|
string sourcePath = $"{outputDirectory}/{manifestFileName}.hash";
|
||||||
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{manifestFileName}.hash";
|
string destPath = $"{AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot()}/{_packageName}/{manifestFileName}.hash";
|
||||||
EditorTools.CopyFile(sourcePath, destPath, true);
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
string fileName = YooAssetSettingsData.GetPackageVersionFileName(manifest.PackageName);
|
string fileName = YooAssetSettingsData.GetPackageVersionFileName(manifest.PackageName);
|
||||||
string sourcePath = $"{outputDirectory}/{fileName}";
|
string sourcePath = $"{outputDirectory}/{fileName}";
|
||||||
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{fileName}";
|
string destPath = $"{AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot()}/{_packageName}/{fileName}";
|
||||||
EditorTools.CopyFile(sourcePath, destPath, true);
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +80,7 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
fileCount++;
|
fileCount++;
|
||||||
string sourcePath = $"{outputDirectory}/{packageBundle.FileName}";
|
string sourcePath = $"{outputDirectory}/{packageBundle.FileName}";
|
||||||
string destPath = $"{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}/{packageBundle.FileName}";
|
string destPath = $"{AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot()}/{_packageName}/{packageBundle.FileName}";
|
||||||
EditorTools.CopyFile(sourcePath, destPath, true);
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 10823e059e253a04083b6122027db930
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 6
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: prop_asteroid_01_mat
|
|
||||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
|
||||||
m_ShaderKeywords: _NORMALMAP
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap: {}
|
|
||||||
disabledShaderPasses: []
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Floats:
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _GlossMapScale: 1
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 1
|
|
||||||
- _Metallic: 0
|
|
||||||
- _Mode: 0
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.02
|
|
||||||
- _SmoothnessTextureChannel: 0
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _UVSec: 0
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 2028e985f7c2d9740858bcf7b567af05
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -8,7 +8,7 @@ Material:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: prop_asteroid_01_mat
|
m_Name: prop_asteroid_01_mat
|
||||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
m_Shader: {fileID: 4800000, guid: ba67c8b1d5e59dc428ad9fc9270f8353, type: 3}
|
||||||
m_ShaderKeywords: _EMISSION _NORMALMAP
|
m_ShaderKeywords: _EMISSION _NORMALMAP
|
||||||
m_LightmapFlags: 1
|
m_LightmapFlags: 1
|
||||||
m_EnableInstancingVariants: 0
|
m_EnableInstancingVariants: 0
|
||||||
@@ -27,6 +27,10 @@ Material:
|
|||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
- _DetailMask:
|
- _DetailMask:
|
||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
@@ -47,6 +51,10 @@ Material:
|
|||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _NormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
- _OcclusionMap:
|
- _OcclusionMap:
|
||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
@@ -56,24 +64,40 @@ Material:
|
|||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
m_Floats:
|
m_Floats:
|
||||||
|
- _AmbiencePower: 1
|
||||||
|
- _Brightness: 0
|
||||||
- _BumpScale: 1
|
- _BumpScale: 1
|
||||||
|
- _ColorToggle: 0
|
||||||
|
- _Contrast: 1
|
||||||
- _Cutoff: 0.5
|
- _Cutoff: 0.5
|
||||||
|
- _Detail: 0
|
||||||
- _DetailNormalMapScale: 1
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DetailStrength: 1
|
||||||
|
- _DiffusePower: 1
|
||||||
- _DstBlend: 0
|
- _DstBlend: 0
|
||||||
|
- _Emission: 0
|
||||||
|
- _EmissionStrength: 1
|
||||||
- _GlossMapScale: 1
|
- _GlossMapScale: 1
|
||||||
- _Glossiness: 0.316
|
- _Glossiness: 0.316
|
||||||
- _GlossyReflections: 1
|
- _GlossyReflections: 1
|
||||||
|
- _Mask: 0
|
||||||
- _Metallic: 0
|
- _Metallic: 0
|
||||||
- _Mode: 0
|
- _Mode: 0
|
||||||
|
- _Normal: 0
|
||||||
- _OcclusionStrength: 1
|
- _OcclusionStrength: 1
|
||||||
- _Parallax: 0.02
|
- _Parallax: 0.02
|
||||||
|
- _Phong: 0
|
||||||
- _Shininess: 0.112127006
|
- _Shininess: 0.112127006
|
||||||
- _SmoothnessTextureChannel: 0
|
- _SmoothnessTextureChannel: 0
|
||||||
- _SpecularHighlights: 1
|
- _SpecularHighlights: 1
|
||||||
|
- _SpecularPower: 1
|
||||||
- _SrcBlend: 1
|
- _SrcBlend: 1
|
||||||
- _UVSec: 0
|
- _UVSec: 0
|
||||||
- _ZWrite: 1
|
- _ZWrite: 1
|
||||||
m_Colors:
|
m_Colors:
|
||||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _PointLightColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _PointLightPosition: {r: 0, g: 0, b: 0, a: 1}
|
||||||
- _SpecColor: {r: 0.41911763, g: 0.39786422, b: 0.34207395, a: 1}
|
- _SpecColor: {r: 0.41911763, g: 0.39786422, b: 0.34207395, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 11bb85ea268af24479830c45b3b21962
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 6
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: prop_asteroid_02_mat
|
|
||||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
|
||||||
m_ShaderKeywords: _NORMALMAP
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap: {}
|
|
||||||
disabledShaderPasses: []
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Floats:
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _GlossMapScale: 1
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 1
|
|
||||||
- _Metallic: 0
|
|
||||||
- _Mode: 0
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.02
|
|
||||||
- _SmoothnessTextureChannel: 0
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _UVSec: 0
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: ec1ef84828f4b1e478c51c1c468a3fb6
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -8,7 +8,7 @@ Material:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: prop_asteroid_02_mat
|
m_Name: prop_asteroid_02_mat
|
||||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
m_Shader: {fileID: 4800000, guid: ba67c8b1d5e59dc428ad9fc9270f8353, type: 3}
|
||||||
m_ShaderKeywords: _EMISSION _NORMALMAP
|
m_ShaderKeywords: _EMISSION _NORMALMAP
|
||||||
m_LightmapFlags: 1
|
m_LightmapFlags: 1
|
||||||
m_EnableInstancingVariants: 0
|
m_EnableInstancingVariants: 0
|
||||||
@@ -27,6 +27,10 @@ Material:
|
|||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _DetailMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
- _DetailMask:
|
- _DetailMask:
|
||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
@@ -47,6 +51,10 @@ Material:
|
|||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _NormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
- _OcclusionMap:
|
- _OcclusionMap:
|
||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
@@ -56,24 +64,40 @@ Material:
|
|||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
m_Floats:
|
m_Floats:
|
||||||
|
- _AmbiencePower: 1
|
||||||
|
- _Brightness: 0
|
||||||
- _BumpScale: 1
|
- _BumpScale: 1
|
||||||
|
- _ColorToggle: 0
|
||||||
|
- _Contrast: 1
|
||||||
- _Cutoff: 0.5
|
- _Cutoff: 0.5
|
||||||
|
- _Detail: 0
|
||||||
- _DetailNormalMapScale: 1
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DetailStrength: 1
|
||||||
|
- _DiffusePower: 1
|
||||||
- _DstBlend: 0
|
- _DstBlend: 0
|
||||||
|
- _Emission: 0
|
||||||
|
- _EmissionStrength: 1
|
||||||
- _GlossMapScale: 1
|
- _GlossMapScale: 1
|
||||||
- _Glossiness: 0.385
|
- _Glossiness: 0.385
|
||||||
- _GlossyReflections: 1
|
- _GlossyReflections: 1
|
||||||
|
- _Mask: 0
|
||||||
- _Metallic: 0
|
- _Metallic: 0
|
||||||
- _Mode: 0
|
- _Mode: 0
|
||||||
|
- _Normal: 0
|
||||||
- _OcclusionStrength: 1
|
- _OcclusionStrength: 1
|
||||||
- _Parallax: 0.02
|
- _Parallax: 0.02
|
||||||
|
- _Phong: 0
|
||||||
- _Shininess: 0.044885967
|
- _Shininess: 0.044885967
|
||||||
- _SmoothnessTextureChannel: 0
|
- _SmoothnessTextureChannel: 0
|
||||||
- _SpecularHighlights: 1
|
- _SpecularHighlights: 1
|
||||||
|
- _SpecularPower: 1
|
||||||
- _SrcBlend: 1
|
- _SrcBlend: 1
|
||||||
- _UVSec: 0
|
- _UVSec: 0
|
||||||
- _ZWrite: 1
|
- _ZWrite: 1
|
||||||
m_Colors:
|
m_Colors:
|
||||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _PointLightColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _PointLightPosition: {r: 0, g: 0, b: 0, a: 1}
|
||||||
- _SpecColor: {r: 0.3897059, g: 0.3606163, b: 0.29801038, a: 1}
|
- _SpecColor: {r: 0.3897059, g: 0.3606163, b: 0.29801038, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 341ae2d28a0e18a40907cf38d7113825
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
%YAML 1.1
|
|
||||||
%TAG !u! tag:unity3d.com,2011:
|
|
||||||
--- !u!21 &2100000
|
|
||||||
Material:
|
|
||||||
serializedVersion: 6
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_Name: prop_asteroid_03_mat
|
|
||||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
|
||||||
m_ShaderKeywords: _NORMALMAP
|
|
||||||
m_LightmapFlags: 4
|
|
||||||
m_EnableInstancingVariants: 0
|
|
||||||
m_DoubleSidedGI: 0
|
|
||||||
m_CustomRenderQueue: -1
|
|
||||||
stringTagMap: {}
|
|
||||||
disabledShaderPasses: []
|
|
||||||
m_SavedProperties:
|
|
||||||
serializedVersion: 3
|
|
||||||
m_TexEnvs:
|
|
||||||
- _BumpMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailAlbedoMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailMask:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _DetailNormalMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _EmissionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MainTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _MetallicGlossMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _OcclusionMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _ParallaxMap:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
m_Floats:
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _GlossMapScale: 1
|
|
||||||
- _Glossiness: 0
|
|
||||||
- _GlossyReflections: 1
|
|
||||||
- _Metallic: 0
|
|
||||||
- _Mode: 0
|
|
||||||
- _OcclusionStrength: 1
|
|
||||||
- _Parallax: 0.02
|
|
||||||
- _SmoothnessTextureChannel: 0
|
|
||||||
- _SpecularHighlights: 1
|
|
||||||
- _SrcBlend: 1
|
|
||||||
- _UVSec: 0
|
|
||||||
- _ZWrite: 1
|
|
||||||
m_Colors:
|
|
||||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: bb585fc32e8ff0d4ca301d5ace6cb531
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,53 +1,145 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 836be25be3e1e8c41ae5545bc8a9a4d7
|
guid: 836be25be3e1e8c41ae5545bc8a9a4d7
|
||||||
TextureImporter:
|
TextureImporter:
|
||||||
fileIDToRecycleName: {}
|
internalIDToNameTable: []
|
||||||
serializedVersion: 2
|
externalObjects: {}
|
||||||
|
serializedVersion: 12
|
||||||
mipmaps:
|
mipmaps:
|
||||||
mipMapMode: 0
|
mipMapMode: 0
|
||||||
enableMipMap: 1
|
enableMipMap: 1
|
||||||
|
sRGBTexture: 1
|
||||||
linearTexture: 0
|
linearTexture: 0
|
||||||
correctGamma: 0
|
|
||||||
fadeOut: 0
|
fadeOut: 0
|
||||||
borderMipMap: 0
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
mipMapFadeDistanceStart: 1
|
mipMapFadeDistanceStart: 1
|
||||||
mipMapFadeDistanceEnd: 3
|
mipMapFadeDistanceEnd: 3
|
||||||
bumpmap:
|
bumpmap:
|
||||||
convertToNormalMap: 0
|
convertToNormalMap: 0
|
||||||
externalNormalMap: 0
|
externalNormalMap: 0
|
||||||
heightScale: .25
|
heightScale: 0.25
|
||||||
normalMapFilter: 0
|
normalMapFilter: 0
|
||||||
isReadable: 0
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
grayScaleToAlpha: 0
|
grayScaleToAlpha: 0
|
||||||
generateCubemap: 0
|
generateCubemap: 6
|
||||||
cubemapConvolution: 0
|
cubemapConvolution: 0
|
||||||
cubemapConvolutionSteps: 8
|
|
||||||
cubemapConvolutionExponent: 1.5
|
|
||||||
seamlessCubemap: 0
|
seamlessCubemap: 0
|
||||||
textureFormat: -1
|
textureFormat: -1
|
||||||
maxTextureSize: 512
|
maxTextureSize: 512
|
||||||
textureSettings:
|
textureSettings:
|
||||||
filterMode: -1
|
serializedVersion: 2
|
||||||
aniso: -1
|
filterMode: 1
|
||||||
mipBias: -1
|
aniso: 1
|
||||||
wrapMode: 1
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 1
|
||||||
nPOTScale: 1
|
nPOTScale: 1
|
||||||
lightmap: 0
|
lightmap: 0
|
||||||
rGBM: 0
|
|
||||||
compressionQuality: 50
|
compressionQuality: 50
|
||||||
spriteMode: 0
|
spriteMode: 0
|
||||||
spriteExtrude: 1
|
spriteExtrude: 1
|
||||||
spriteMeshType: 1
|
spriteMeshType: 1
|
||||||
alignment: 0
|
alignment: 0
|
||||||
spritePivot: {x: .5, y: .5}
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
|
||||||
spritePixelsToUnits: 100
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
alphaIsTransparency: 0
|
alphaIsTransparency: 0
|
||||||
textureType: -1
|
spriteTessellationDetail: -1
|
||||||
buildTargetSettings: []
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 1
|
||||||
|
cookieLightType: 1
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 512
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 512
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 512
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Android
|
||||||
|
maxTextureSize: 512
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: WebGL
|
||||||
|
maxTextureSize: 512
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
spriteSheet:
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
sprites: []
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
spritePackingTag:
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
userData:
|
userData:
|
||||||
assetBundleName:
|
assetBundleName:
|
||||||
assetBundleVariant:
|
assetBundleVariant:
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user