Compare commits
47 Commits
main
...
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 | |
|
3ca300d956 | |
|
d1087aa74c | |
|
43c40e4bbe | |
|
d9c4e5336b | |
|
772198255a | |
|
19c46a2f60 | |
|
f54c8d6da4 | |
|
84f9d1985e | |
|
0b2a2bf97d | |
|
561cf411ef | |
|
f24ae6eb2a | |
|
3bb3d4382c | |
|
43db19c257 | |
|
1d5663d93a | |
|
b98d4cb091 | |
|
14ee95615f | |
|
8ccddce0f8 | |
|
9dde15ac41 | |
|
95111ef1e1 |
|
@ -2,6 +2,221 @@
|
|||
|
||||
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
|
||||
|
||||
### Changed
|
||||
|
||||
- 优化了缓存的信息文件写入方式
|
||||
|
||||
- 离线模式支持内置资源解压到沙盒
|
||||
|
||||
- 资源包构建流程任务节点支持可扩展
|
||||
|
||||
```c#
|
||||
using YooAsset.Editor
|
||||
|
||||
[TaskAttribute(ETaskPipeline.AllPipeline, 100, "自定义任务节点")]
|
||||
public class CustomTask : IBuildTask
|
||||
```
|
||||
|
||||
- 资源收集界面增加了LocationToLower选项
|
||||
|
||||
- 资源收集界面增加了IncludeAssetGUID选项
|
||||
|
||||
- IShareAssetPackRule 重命名为 ISharedPackRule
|
||||
|
||||
### Added
|
||||
|
||||
- 新增了ResourcePackage.LoadAllAssetsAsync方法
|
||||
|
||||
```c#
|
||||
/// <summary>
|
||||
/// 异步加载资源包内所有资源对象
|
||||
/// </summary>
|
||||
/// <param name="assetInfo">资源信息</param>
|
||||
public AllAssetsOperationHandle LoadAllAssetsAsync(AssetInfo assetInfo)
|
||||
```
|
||||
|
||||
- 新增了ResourcePackage.GetAssetInfoByGUID()方法
|
||||
|
||||
```c#
|
||||
/// <summary>
|
||||
/// 获取资源信息
|
||||
/// </summary>
|
||||
/// <param name="assetGUID">资源GUID</param>
|
||||
public AssetInfo GetAssetInfoByGUID(string assetGUID)
|
||||
```
|
||||
|
||||
- 新增了场景加载参数suspendLoad
|
||||
|
||||
```c#
|
||||
/// <summary>
|
||||
/// 异步加载场景
|
||||
/// </summary>
|
||||
/// <param name="location">场景的定位地址</param>
|
||||
/// <param name="sceneMode">场景加载模式</param>
|
||||
/// <param name="suspendLoad">场景加载到90%自动挂起</param>
|
||||
/// <param name="priority">优先级</param>
|
||||
public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100)
|
||||
```
|
||||
|
||||
- Extension Sample 增加了GameObjectAssetReference示例脚本
|
||||
|
||||
- 新增加了ZeroRedundancySharedPackRule类(零冗余的共享资源打包规则)
|
||||
|
||||
- 新增加了FullRedundancySharedPackRule类(全部冗余的共享资源打包规则)
|
||||
|
||||
### Removed
|
||||
|
||||
- 移除了InitializeParameters.LocationToLower成员字段
|
||||
- 移除了LoadSceneAsync方法里的activateOnLoad形参参数
|
||||
- 移除了BuildParameters.AutoAnalyzeRedundancy成员字段
|
||||
- 移除了DefaultShareAssetPackRule编辑器类
|
||||
|
||||
## [1.4.16] - 2023-06-14
|
||||
|
||||
### Changed
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
|
@ -11,80 +13,30 @@ namespace YooAsset.Editor
|
|||
private readonly BuildContext _buildContext = new BuildContext();
|
||||
|
||||
/// <summary>
|
||||
/// 开始构建
|
||||
/// 构建资源包
|
||||
/// </summary>
|
||||
public BuildResult Run(BuildParameters buildParameters)
|
||||
public BuildResult Run(BuildParameters buildParameters, List<IBuildTask> buildPipeline)
|
||||
{
|
||||
// 清空旧数据
|
||||
_buildContext.ClearAllContext();
|
||||
|
||||
// 检测构建参数是否为空
|
||||
if (buildParameters == null)
|
||||
throw new Exception($"{nameof(buildParameters)} is null !");
|
||||
|
||||
// 检测可编程构建管线参数
|
||||
if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||
{
|
||||
if (buildParameters.SBPParameters == null)
|
||||
throw new Exception($"{nameof(BuildParameters.SBPParameters)} is null !");
|
||||
// 检测构建参数是否为空
|
||||
if (buildPipeline.Count == 0)
|
||||
throw new Exception($"Build pipeline is empty !");
|
||||
|
||||
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 !");
|
||||
}
|
||||
// 清空旧数据
|
||||
_buildContext.ClearAllContext();
|
||||
|
||||
// 构建参数
|
||||
var buildParametersContext = new BuildParametersContext(buildParameters);
|
||||
_buildContext.SetContextObject(buildParametersContext);
|
||||
|
||||
// 创建构建节点
|
||||
List<IBuildTask> pipeline;
|
||||
if (buildParameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
||||
{
|
||||
pipeline = new List<IBuildTask>
|
||||
{
|
||||
new TaskPrepare(), //前期准备工作
|
||||
new TaskGetBuildMap(), //获取构建列表
|
||||
new TaskBuilding(), //开始执行构建
|
||||
new TaskCopyRawFile(), //拷贝原生文件
|
||||
new TaskVerifyBuildResult(), //验证构建结果
|
||||
new TaskEncryption(), //加密资源文件
|
||||
new TaskUpdateBundleInfo(), //更新资源包信息
|
||||
new TaskCreateManifest(), //创建清单文件
|
||||
new TaskCreateReport(), //创建报告文件
|
||||
new TaskCreatePackage(), //制作包裹
|
||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||
};
|
||||
}
|
||||
else if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||
{
|
||||
pipeline = new List<IBuildTask>
|
||||
{
|
||||
new TaskPrepare(), //前期准备工作
|
||||
new TaskGetBuildMap(), //获取构建列表
|
||||
new TaskBuilding_SBP(), //开始执行构建
|
||||
new TaskCopyRawFile(), //拷贝原生文件
|
||||
new TaskVerifyBuildResult_SBP(), //验证构建结果
|
||||
new TaskEncryption(), //加密资源文件
|
||||
new TaskUpdateBundleInfo(), //更新补丁信息
|
||||
new TaskCreateManifest(), //创建清单文件
|
||||
new TaskCreateReport(), //创建报告文件
|
||||
new TaskCreatePackage(), //制作补丁包
|
||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
// 初始化日志
|
||||
BuildLogger.InitLogger(buildParameters.EnableLog);
|
||||
|
||||
// 执行构建流程
|
||||
var buildResult = BuildRunner.Run(pipeline, _buildContext);
|
||||
var buildResult = BuildRunner.Run(buildPipeline, _buildContext);
|
||||
if (buildResult.Success)
|
||||
{
|
||||
buildResult.OutputPackageDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||
|
@ -99,5 +51,62 @@ namespace YooAsset.Editor
|
|||
|
||||
return buildResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构建资源包
|
||||
/// </summary>
|
||||
public BuildResult Run(BuildParameters buildParameters)
|
||||
{
|
||||
var buildPipeline = GetDefaultBuildPipeline(buildParameters.BuildPipeline);
|
||||
return Run(buildParameters, buildPipeline);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取默认的构建流程
|
||||
/// </summary>
|
||||
private List<IBuildTask> GetDefaultBuildPipeline(EBuildPipeline buildPipeline)
|
||||
{
|
||||
// 获取任务节点的属性集合
|
||||
if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
||||
{
|
||||
List<IBuildTask> pipeline = new List<IBuildTask>
|
||||
{
|
||||
new TaskPrepare(), //前期准备工作
|
||||
new TaskGetBuildMap(), //获取构建列表
|
||||
new TaskBuilding(), //开始执行构建
|
||||
new TaskCopyRawFile(), //拷贝原生文件
|
||||
new TaskVerifyBuildResult(), //验证构建结果
|
||||
new TaskEncryption(), //加密资源文件
|
||||
new TaskUpdateBundleInfo(), //更新资源包信息
|
||||
new TaskCreateManifest(), //创建清单文件
|
||||
new TaskCreateReport(), //创建报告文件
|
||||
new TaskCreatePackage(), //制作包裹
|
||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||
};
|
||||
return pipeline;
|
||||
}
|
||||
else if (buildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||
{
|
||||
List<IBuildTask> pipeline = new List<IBuildTask>
|
||||
{
|
||||
new TaskPrepare(), //前期准备工作
|
||||
new TaskGetBuildMap(), //获取构建列表
|
||||
new TaskBuilding_SBP(), //开始执行构建
|
||||
new TaskCopyRawFile(), //拷贝原生文件
|
||||
new TaskVerifyBuildResult_SBP(), //验证构建结果
|
||||
new TaskEncryption(), //加密资源文件
|
||||
new TaskUpdateBundleInfo(), //更新补丁信息
|
||||
new TaskCreateManifest(), //创建清单文件
|
||||
new TaskCreateReport(), //创建报告文件
|
||||
new TaskCreatePackage(), //制作补丁包
|
||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||
};
|
||||
return pipeline;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,7 +11,7 @@ namespace YooAsset.Editor
|
|||
/// <summary>
|
||||
/// 获取默认的输出根路录
|
||||
/// </summary>
|
||||
public static string GetDefaultOutputRoot()
|
||||
public static string GetDefaultBuildOutputRoot()
|
||||
{
|
||||
string projectPath = EditorTools.GetProjectPath();
|
||||
return $"{projectPath}/Bundles";
|
||||
|
@ -20,43 +20,9 @@ namespace YooAsset.Editor
|
|||
/// <summary>
|
||||
/// 获取流文件夹路径
|
||||
/// </summary>
|
||||
public static string GetStreamingAssetsFolderPath()
|
||||
public static string GetDefaultStreamingAssetsRoot()
|
||||
{
|
||||
return $"{Application.dataPath}/StreamingAssets/{YooAssetSettings.StreamingAssetsBuildinFolder}/";
|
||||
}
|
||||
|
||||
/// <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();
|
||||
}
|
||||
}
|
||||
return $"{Application.dataPath}/StreamingAssets/{YooAssetSettings.DefaultYooFolderName}/";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -63,7 +63,7 @@ namespace YooAsset.Editor
|
|||
_encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.Name).ToList();
|
||||
|
||||
// 输出目录
|
||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||
_buildOutputField = root.Q<TextField>("BuildOutput");
|
||||
_buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
|
||||
_buildOutputField.SetEnabled(false);
|
||||
|
@ -266,17 +266,16 @@ namespace YooAsset.Editor
|
|||
/// </summary>
|
||||
private void ExecuteBuild()
|
||||
{
|
||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
||||
BuildParameters buildParameters = new BuildParameters();
|
||||
buildParameters.OutputRoot = defaultOutputRoot;
|
||||
buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||
buildParameters.BuildTarget = _buildTarget;
|
||||
buildParameters.BuildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
|
||||
buildParameters.BuildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
|
||||
buildParameters.PackageName = AssetBundleBuilderSettingData.Setting.BuildPackage;
|
||||
buildParameters.PackageVersion = _buildVersionField.value;
|
||||
buildParameters.VerifyBuildingResult = true;
|
||||
buildParameters.AutoAnalyzeRedundancy = true;
|
||||
buildParameters.ShareAssetPackRule = new DefaultShareAssetPackRule();
|
||||
buildParameters.SharedPackRule = new ZeroRedundancySharedPackRule();
|
||||
buildParameters.EncryptionServices = CreateEncryptionServicesInstance();
|
||||
buildParameters.CompressOption = AssetBundleBuilderSettingData.Setting.CompressOption;
|
||||
buildParameters.OutputNameStyle = AssetBundleBuilderSettingData.Setting.OutputNameStyle;
|
||||
|
|
|
@ -11,9 +11,9 @@ namespace YooAsset.Editor
|
|||
public static string SimulateBuild(string packageName)
|
||||
{
|
||||
Debug.Log($"Begin to create simulate package : {packageName}");
|
||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
||||
BuildParameters buildParameters = new BuildParameters();
|
||||
buildParameters.OutputRoot = defaultOutputRoot;
|
||||
buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
||||
buildParameters.PackageName = packageName;
|
||||
|
|
|
@ -30,6 +30,11 @@ namespace YooAsset.Editor
|
|||
/// </summary>
|
||||
public string AssetPath { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 资源GUID
|
||||
/// </summary>
|
||||
public string AssetGUID { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为原生资源
|
||||
/// </summary>
|
||||
|
@ -65,6 +70,7 @@ namespace YooAsset.Editor
|
|||
AssetPath = assetPath;
|
||||
IsRawAsset = isRawAsset;
|
||||
|
||||
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
||||
System.Type assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||||
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
|
||||
IsShaderAsset = true;
|
||||
|
@ -78,6 +84,7 @@ namespace YooAsset.Editor
|
|||
AssetPath = assetPath;
|
||||
IsRawAsset = false;
|
||||
|
||||
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
||||
System.Type assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||||
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
|
||||
IsShaderAsset = true;
|
||||
|
@ -157,7 +164,7 @@ namespace YooAsset.Editor
|
|||
/// <summary>
|
||||
/// 计算共享资源包的完整包名
|
||||
/// </summary>
|
||||
public void CalculateShareBundleName(IShareAssetPackRule packRule, bool uniqueBundleName, string packageName, string shadersBundleName)
|
||||
public void CalculateShareBundleName(ISharedPackRule sharedPackRule, bool uniqueBundleName, string packageName, string shadersBundleName)
|
||||
{
|
||||
if (CollectorType != ECollectorType.None)
|
||||
return;
|
||||
|
@ -173,7 +180,7 @@ namespace YooAsset.Editor
|
|||
{
|
||||
if (_referenceBundleNames.Count > 1)
|
||||
{
|
||||
PackRuleResult packRuleResult = packRule.GetPackRuleResult(AssetPath);
|
||||
PackRuleResult packRuleResult = sharedPackRule.GetPackRuleResult(AssetPath);
|
||||
BundleName = packRuleResult.GetShareBundleName(packageName, uniqueBundleName);
|
||||
}
|
||||
else
|
||||
|
@ -189,12 +196,9 @@ namespace YooAsset.Editor
|
|||
/// </summary>
|
||||
public bool IsRedundancyAsset()
|
||||
{
|
||||
if (CollectorType != ECollectorType.None)
|
||||
if (HasBundleName())
|
||||
return false;
|
||||
|
||||
if (IsRawAsset)
|
||||
throw new Exception("Should never get here !");
|
||||
|
||||
return _referenceBundleNames.Count > 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,39 +8,54 @@ namespace YooAsset.Editor
|
|||
{
|
||||
public class BuildBundleInfo
|
||||
{
|
||||
public class InfoWrapper
|
||||
{
|
||||
/// <summary>
|
||||
/// 构建内容的哈希值
|
||||
/// </summary>
|
||||
public string ContentHash { set; get; }
|
||||
#region 补丁文件的关键信息
|
||||
/// <summary>
|
||||
/// Unity引擎生成的哈希值(构建内容的哈希值)
|
||||
/// </summary>
|
||||
public string PackageUnityHash { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public string FileHash { set; get; }
|
||||
/// <summary>
|
||||
/// Unity引擎生成的CRC
|
||||
/// </summary>
|
||||
public uint PackageUnityCRC { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public string FileCRC { set; get; }
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public string PackageFileHash { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public long FileSize { set; get; }
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public string PackageFileCRC { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public long PackageFileSize { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 构建输出的文件路径
|
||||
/// </summary>
|
||||
public string BuildOutputFilePath { set; get; }
|
||||
/// <summary>
|
||||
/// 构建输出的文件路径
|
||||
/// </summary>
|
||||
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>
|
||||
/// 资源包名称
|
||||
|
@ -49,26 +64,15 @@ namespace YooAsset.Editor
|
|||
|
||||
/// <summary>
|
||||
/// 参与构建的资源列表
|
||||
/// 注意:不包含零依赖资源
|
||||
/// 注意:不包含零依赖资源和冗余资源
|
||||
/// </summary>
|
||||
public readonly List<BuildAssetInfo> AllMainAssets = new List<BuildAssetInfo>();
|
||||
|
||||
/// <summary>
|
||||
/// 补丁文件信息
|
||||
/// </summary>
|
||||
public readonly InfoWrapper BundleInfo = new InfoWrapper();
|
||||
|
||||
/// <summary>
|
||||
/// Bundle文件的加载方法
|
||||
/// </summary>
|
||||
public EBundleLoadMethod LoadMethod { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 加密生成文件的路径
|
||||
/// 注意:如果未加密该路径为空
|
||||
/// </summary>
|
||||
public string EncryptedFilePath { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否为原生文件
|
||||
/// </summary>
|
||||
|
@ -149,7 +153,15 @@ namespace YooAsset.Editor
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取该资源包内的所有资源(包括零依赖资源)
|
||||
/// 获取构建的资源路径列表
|
||||
/// </summary>
|
||||
public string[] GetAllMainAssetPaths()
|
||||
{
|
||||
return AllMainAssets.Select(t => t.AssetPath).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取该资源包内的所有资源(包括零依赖资源和冗余资源)
|
||||
/// </summary>
|
||||
public List<string> GetAllBuiltinAssetPaths()
|
||||
{
|
||||
|
@ -161,6 +173,7 @@ namespace YooAsset.Editor
|
|||
continue;
|
||||
foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
|
||||
{
|
||||
// 注意:依赖资源里只添加零依赖资源和冗余资源
|
||||
if (dependAssetInfo.HasBundleName() == false)
|
||||
{
|
||||
if (result.Contains(dependAssetInfo.AssetPath) == false)
|
||||
|
@ -171,22 +184,6 @@ namespace YooAsset.Editor
|
|||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取构建的资源路径列表
|
||||
/// </summary>
|
||||
public string[] GetAllMainAssetPaths()
|
||||
{
|
||||
return AllMainAssets.Select(t => t.AssetPath).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有写入补丁清单的资源
|
||||
/// </summary>
|
||||
public BuildAssetInfo[] GetAllMainAssetInfos()
|
||||
{
|
||||
return AllMainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建AssetBundleBuild类
|
||||
/// </summary>
|
||||
|
@ -200,6 +197,14 @@ namespace YooAsset.Editor
|
|||
return build;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有写入补丁清单的资源
|
||||
/// </summary>
|
||||
public BuildAssetInfo[] GetAllManifestAssetInfos()
|
||||
{
|
||||
return AllMainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建PackageBundle类
|
||||
/// </summary>
|
||||
|
@ -207,9 +212,10 @@ namespace YooAsset.Editor
|
|||
{
|
||||
PackageBundle packageBundle = new PackageBundle();
|
||||
packageBundle.BundleName = BundleName;
|
||||
packageBundle.FileHash = BundleInfo.FileHash;
|
||||
packageBundle.FileCRC = BundleInfo.FileCRC;
|
||||
packageBundle.FileSize = BundleInfo.FileSize;
|
||||
packageBundle.FileHash = PackageFileHash;
|
||||
packageBundle.FileCRC = PackageFileCRC;
|
||||
packageBundle.FileSize = PackageFileSize;
|
||||
packageBundle.UnityCRC = PackageUnityCRC;
|
||||
packageBundle.IsRawFile = IsRawFile;
|
||||
packageBundle.LoadMethod = (byte)LoadMethod;
|
||||
packageBundle.Tags = GetBundleTags();
|
||||
|
|
|
@ -22,19 +22,9 @@ namespace YooAsset.Editor
|
|||
public int AssetFileCount;
|
||||
|
||||
/// <summary>
|
||||
/// 是否启用可寻址资源定位
|
||||
/// 收集命令
|
||||
/// </summary>
|
||||
public bool EnableAddressable;
|
||||
|
||||
/// <summary>
|
||||
/// 资源包名唯一化
|
||||
/// </summary>
|
||||
public bool UniqueBundleName;
|
||||
|
||||
/// <summary>
|
||||
/// 着色器统一的全名称
|
||||
/// </summary>
|
||||
public string ShadersBundleName;
|
||||
public CollectCommand Command { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 资源包信息列表
|
||||
|
|
|
@ -37,9 +37,14 @@ namespace YooAsset.Editor
|
|||
|
||||
|
||||
/// <summary>
|
||||
/// 输出的根目录
|
||||
/// 内置资源的根目录
|
||||
/// </summary>
|
||||
public string OutputRoot;
|
||||
public string StreamingAssetsRoot;
|
||||
|
||||
/// <summary>
|
||||
/// 构建输出的根目录
|
||||
/// </summary>
|
||||
public string BuildOutputRoot;
|
||||
|
||||
/// <summary>
|
||||
/// 构建的平台
|
||||
|
@ -76,16 +81,11 @@ namespace YooAsset.Editor
|
|||
/// 验证构建结果
|
||||
/// </summary>
|
||||
public bool VerifyBuildingResult = false;
|
||||
|
||||
/// <summary>
|
||||
/// 自动分析冗余资源
|
||||
/// </summary>
|
||||
public bool AutoAnalyzeRedundancy = true;
|
||||
|
||||
/// <summary>
|
||||
/// 共享资源的打包规则
|
||||
/// </summary>
|
||||
public IShareAssetPackRule ShareAssetPackRule = null;
|
||||
public ISharedPackRule SharedPackRule = null;
|
||||
|
||||
/// <summary>
|
||||
/// 资源的加密接口
|
||||
|
|
|
@ -9,6 +9,8 @@ namespace YooAsset.Editor
|
|||
{
|
||||
private string _pipelineOutputDirectory = string.Empty;
|
||||
private string _packageOutputDirectory = string.Empty;
|
||||
private string _packageRootDirectory = string.Empty;
|
||||
private string _streamingAssetsDirectory = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 构建参数
|
||||
|
@ -29,23 +31,47 @@ namespace YooAsset.Editor
|
|||
{
|
||||
if (string.IsNullOrEmpty(_pipelineOutputDirectory))
|
||||
{
|
||||
_pipelineOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{YooAssetSettings.OutputFolderName}";
|
||||
_pipelineOutputDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{YooAssetSettings.OutputFolderName}";
|
||||
}
|
||||
return _pipelineOutputDirectory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本次构建的补丁目录
|
||||
/// 获取本次构建的补丁输出目录
|
||||
/// </summary>
|
||||
public string GetPackageOutputDirectory()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_packageOutputDirectory))
|
||||
{
|
||||
_packageOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{Parameters.PackageVersion}";
|
||||
_packageOutputDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{Parameters.PackageVersion}";
|
||||
}
|
||||
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>
|
||||
|
|
|
@ -58,20 +58,25 @@ namespace YooAsset.Editor
|
|||
/// </summary>
|
||||
public bool EnableAddressable;
|
||||
|
||||
/// <summary>
|
||||
/// 资源定位地址大小写不敏感
|
||||
/// </summary>
|
||||
public bool LocationToLower;
|
||||
|
||||
/// <summary>
|
||||
/// 包含资源GUID数据
|
||||
/// </summary>
|
||||
public bool IncludeAssetGUID;
|
||||
|
||||
/// <summary>
|
||||
/// 资源包名唯一化
|
||||
/// </summary>
|
||||
public bool UniqueBundleName;
|
||||
|
||||
/// <summary>
|
||||
/// 自动分析冗余
|
||||
/// 共享资源的打包规则类名
|
||||
/// </summary>
|
||||
public bool AutoAnalyzeRedundancy;
|
||||
|
||||
/// <summary>
|
||||
/// 共享资源的打包类名称
|
||||
/// </summary>
|
||||
public string ShareAssetPackRuleClassName;
|
||||
public string SharedPackRuleClassName;
|
||||
|
||||
/// <summary>
|
||||
/// 加密服务类名称
|
||||
|
|
|
@ -38,7 +38,7 @@ namespace YooAsset.Editor
|
|||
_buildWatch = Stopwatch.StartNew();
|
||||
var taskAttribute = task.GetType().GetCustomAttribute<TaskAttribute>();
|
||||
if (taskAttribute != null)
|
||||
BuildLogger.Log($"---------------------------------------->{taskAttribute.Desc}<---------------------------------------");
|
||||
BuildLogger.Log($"---------------------------------------->{taskAttribute.TaskDesc}<---------------------------------------");
|
||||
task.Run(context);
|
||||
_buildWatch.Stop();
|
||||
|
||||
|
@ -46,7 +46,7 @@ namespace YooAsset.Editor
|
|||
int seconds = GetBuildSeconds();
|
||||
TotalSeconds += seconds;
|
||||
if (taskAttribute != null)
|
||||
BuildLogger.Log($"{taskAttribute.Desc}耗时:{seconds}秒");
|
||||
BuildLogger.Log($"{taskAttribute.TaskDesc}耗时:{seconds}秒");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
@ -5,10 +5,14 @@ namespace YooAsset.Editor
|
|||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public class TaskAttribute : Attribute
|
||||
{
|
||||
public string Desc;
|
||||
public TaskAttribute(string desc)
|
||||
/// <summary>
|
||||
/// 任务说明
|
||||
/// </summary>
|
||||
public string TaskDesc;
|
||||
|
||||
public TaskAttribute(string taskDesc)
|
||||
{
|
||||
Desc = desc;
|
||||
TaskDesc = taskDesc;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -33,7 +33,7 @@ namespace YooAsset.Editor
|
|||
// 开始构建
|
||||
IBundleBuildResults buildResults;
|
||||
var buildParameters = buildParametersContext.GetSBPBuildParameters();
|
||||
var taskList = SBPBuildTasks.Create(buildMapContext.ShadersBundleName);
|
||||
var taskList = SBPBuildTasks.Create(buildMapContext.Command.ShadersBundleName);
|
||||
ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
|
||||
if (exitCode < 0)
|
||||
{
|
||||
|
@ -43,7 +43,7 @@ namespace YooAsset.Editor
|
|||
// 创建着色器信息
|
||||
// 说明:解决因为着色器资源包导致验证失败。
|
||||
// 例如:当项目里没有着色器,如果有依赖内置着色器就会验证失败。
|
||||
string shadersBundleName = buildMapContext.ShadersBundleName;
|
||||
string shadersBundleName = buildMapContext.Command.ShadersBundleName;
|
||||
if (buildResults.BundleInfos.ContainsKey(shadersBundleName))
|
||||
{
|
||||
buildMapContext.CreateShadersBundleInfo(shadersBundleName);
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace YooAsset.Editor
|
|||
{
|
||||
ECopyBuildinFileOption option = buildParametersContext.Parameters.CopyBuildinFileOption;
|
||||
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||
string streamingAssetsDirectory = AssetBundleBuilderHelper.GetStreamingAssetsFolderPath();
|
||||
string streamingAssetsDirectory = buildParametersContext.GetStreamingAssetsDirectory();
|
||||
string buildPackageName = buildParametersContext.Parameters.PackageName;
|
||||
string buildPackageVersion = buildParametersContext.Parameters.PackageVersion;
|
||||
|
||||
|
@ -40,7 +40,7 @@ namespace YooAsset.Editor
|
|||
// 清空流目录
|
||||
if (option == ECopyBuildinFileOption.ClearAndCopyAll || option == ECopyBuildinFileOption.ClearAndCopyByTags)
|
||||
{
|
||||
AssetBundleBuilderHelper.ClearStreamingAssetsFolder();
|
||||
EditorTools.ClearFolder(streamingAssetsDirectory);
|
||||
}
|
||||
|
||||
// 拷贝补丁清单文件
|
||||
|
@ -69,7 +69,7 @@ namespace YooAsset.Editor
|
|||
|
||||
// 拷贝文件列表(所有文件)
|
||||
if (option == ECopyBuildinFileOption.ClearAndCopyAll || option == ECopyBuildinFileOption.OnlyCopyAll)
|
||||
{
|
||||
{
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
string sourcePath = $"{packageOutputDirectory}/{packageBundle.FileName}";
|
||||
|
|
|
@ -34,7 +34,9 @@ namespace YooAsset.Editor
|
|||
// 创建新补丁清单
|
||||
PackageManifest manifest = new PackageManifest();
|
||||
manifest.FileVersion = YooAssetSettings.ManifestFileVersion;
|
||||
manifest.EnableAddressable = buildMapContext.EnableAddressable;
|
||||
manifest.EnableAddressable = buildMapContext.Command.EnableAddressable;
|
||||
manifest.LocationToLower = buildMapContext.Command.LocationToLower;
|
||||
manifest.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
|
||||
manifest.OutputNameStyle = (int)buildParameters.OutputNameStyle;
|
||||
manifest.PackageName = buildParameters.PackageName;
|
||||
manifest.PackageVersion = buildParameters.PackageVersion;
|
||||
|
@ -47,7 +49,7 @@ namespace YooAsset.Editor
|
|||
if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
|
||||
{
|
||||
var buildResultContext = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||
UpdateBuiltInBundleReference(manifest, buildResultContext, buildMapContext.ShadersBundleName);
|
||||
UpdateBuiltInBundleReference(manifest, buildResultContext, buildMapContext.Command.ShadersBundleName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -137,15 +139,13 @@ namespace YooAsset.Editor
|
|||
List<PackageAsset> result = new List<PackageAsset>(1000);
|
||||
foreach (var bundleInfo in buildMapContext.Collection)
|
||||
{
|
||||
var assetInfos = bundleInfo.GetAllMainAssetInfos();
|
||||
var assetInfos = bundleInfo.GetAllManifestAssetInfos();
|
||||
foreach (var assetInfo in assetInfos)
|
||||
{
|
||||
PackageAsset packageAsset = new PackageAsset();
|
||||
if (buildMapContext.EnableAddressable)
|
||||
packageAsset.Address = assetInfo.Address;
|
||||
else
|
||||
packageAsset.Address = string.Empty;
|
||||
packageAsset.Address = buildMapContext.Command.EnableAddressable ? assetInfo.Address : string.Empty;
|
||||
packageAsset.AssetPath = assetInfo.AssetPath;
|
||||
packageAsset.AssetGUID = buildMapContext.Command.IncludeAssetGUID ? assetInfo.AssetGUID : string.Empty;
|
||||
packageAsset.AssetTags = assetInfo.AssetTags.ToArray();
|
||||
packageAsset.BundleID = GetAssetBundleID(assetInfo.BundleName, manifest);
|
||||
packageAsset.DependIDs = GetAssetBundleDependIDs(packageAsset.BundleID, assetInfo, manifest);
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace YooAsset.Editor
|
|||
int fileTotalCount = buildMapContext.Collection.Count;
|
||||
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.ClearProgressBar();
|
||||
|
|
|
@ -45,11 +45,12 @@ namespace YooAsset.Editor
|
|||
buildReport.Summary.BuildMode = buildParameters.BuildMode;
|
||||
buildReport.Summary.BuildPackageName = buildParameters.PackageName;
|
||||
buildReport.Summary.BuildPackageVersion = buildParameters.PackageVersion;
|
||||
buildReport.Summary.EnableAddressable = buildMapContext.EnableAddressable;
|
||||
buildReport.Summary.UniqueBundleName = buildMapContext.UniqueBundleName;
|
||||
buildReport.Summary.AutoAnalyzeRedundancy = buildParameters.AutoAnalyzeRedundancy;
|
||||
buildReport.Summary.ShareAssetPackRuleClassName = buildParameters.ShareAssetPackRule == null ?
|
||||
"null" : buildParameters.ShareAssetPackRule.GetType().FullName;
|
||||
buildReport.Summary.EnableAddressable = buildMapContext.Command.EnableAddressable;
|
||||
buildReport.Summary.LocationToLower = buildMapContext.Command.LocationToLower;
|
||||
buildReport.Summary.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
|
||||
buildReport.Summary.UniqueBundleName = buildMapContext.Command.UniqueBundleName;
|
||||
buildReport.Summary.SharedPackRuleClassName = buildParameters.SharedPackRule == null ?
|
||||
"null" : buildParameters.SharedPackRule.GetType().FullName;
|
||||
buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ?
|
||||
"null" : buildParameters.EncryptionServices.GetType().FullName;
|
||||
|
||||
|
@ -159,7 +160,7 @@ namespace YooAsset.Editor
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取该资源包内的所有资源(包括零依赖资源)
|
||||
/// 获取该资源包内的所有资源
|
||||
/// </summary>
|
||||
private List<string> GetAllBuiltinAssets(BuildMapContext buildMapContext, string bundleName)
|
||||
{
|
||||
|
|
|
@ -26,10 +26,9 @@ namespace YooAsset.Editor
|
|||
/// </summary>
|
||||
public BuildMapContext CreateBuildMap(BuildParameters buildParameters)
|
||||
{
|
||||
EBuildMode buildMode = buildParameters.BuildMode;
|
||||
string packageName = buildParameters.PackageName;
|
||||
IShareAssetPackRule sharePackRule = buildParameters.ShareAssetPackRule;
|
||||
bool autoAnalyzeRedundancy = buildParameters.AutoAnalyzeRedundancy;
|
||||
var buildMode = buildParameters.BuildMode;
|
||||
var packageName = buildParameters.PackageName;
|
||||
var sharedPackRule = buildParameters.SharedPackRule;
|
||||
|
||||
Dictionary<string, BuildAssetInfo> allBuildAssetInfoDic = new Dictionary<string, BuildAssetInfo>(1000);
|
||||
|
||||
|
@ -98,38 +97,31 @@ namespace YooAsset.Editor
|
|||
// 7. 记录关键信息
|
||||
BuildMapContext context = new BuildMapContext();
|
||||
context.AssetFileCount = allBuildAssetInfoDic.Count;
|
||||
context.EnableAddressable = collectResult.Command.EnableAddressable;
|
||||
context.UniqueBundleName = collectResult.Command.UniqueBundleName;
|
||||
context.ShadersBundleName = collectResult.Command.ShadersBundleName;
|
||||
context.Command = collectResult.Command;
|
||||
|
||||
// 8. 计算共享的资源包名
|
||||
if (autoAnalyzeRedundancy)
|
||||
// 8. 计算共享资源的包名
|
||||
var command = collectResult.Command;
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
{
|
||||
var command = collectResult.Command;
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
{
|
||||
buildAssetInfo.CalculateShareBundleName(sharePackRule, command.UniqueBundleName, command.PackageName, command.ShadersBundleName);
|
||||
}
|
||||
buildAssetInfo.CalculateShareBundleName(sharedPackRule, command.UniqueBundleName, command.PackageName, command.ShadersBundleName);
|
||||
}
|
||||
else
|
||||
|
||||
// 9. 记录冗余资源
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
{
|
||||
// 记录冗余资源
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
if (buildAssetInfo.IsRedundancyAsset())
|
||||
{
|
||||
if (buildAssetInfo.IsRedundancyAsset())
|
||||
{
|
||||
var redundancyInfo = new ReportRedundancyInfo();
|
||||
redundancyInfo.AssetPath = buildAssetInfo.AssetPath;
|
||||
redundancyInfo.AssetType = AssetDatabase.GetMainAssetTypeAtPath(buildAssetInfo.AssetPath).Name;
|
||||
redundancyInfo.AssetGUID = AssetDatabase.AssetPathToGUID(buildAssetInfo.AssetPath);
|
||||
redundancyInfo.FileSize = FileUtility.GetFileSize(buildAssetInfo.AssetPath);
|
||||
redundancyInfo.Number = buildAssetInfo.GetReferenceBundleCount();
|
||||
context.RedundancyInfos.Add(redundancyInfo);
|
||||
}
|
||||
var redundancyInfo = new ReportRedundancyInfo();
|
||||
redundancyInfo.AssetPath = buildAssetInfo.AssetPath;
|
||||
redundancyInfo.AssetType = AssetDatabase.GetMainAssetTypeAtPath(buildAssetInfo.AssetPath).Name;
|
||||
redundancyInfo.AssetGUID = AssetDatabase.AssetPathToGUID(buildAssetInfo.AssetPath);
|
||||
redundancyInfo.FileSize = FileUtility.GetFileSize(buildAssetInfo.AssetPath);
|
||||
redundancyInfo.Number = buildAssetInfo.GetReferenceBundleCount();
|
||||
context.RedundancyInfos.Add(redundancyInfo);
|
||||
}
|
||||
}
|
||||
|
||||
// 9. 移除不参与构建的资源
|
||||
// 10. 移除不参与构建的资源
|
||||
List<BuildAssetInfo> removeBuildList = new List<BuildAssetInfo>();
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
{
|
||||
|
@ -141,7 +133,7 @@ namespace YooAsset.Editor
|
|||
allBuildAssetInfoDic.Remove(removeValue.AssetPath);
|
||||
}
|
||||
|
||||
// 10. 构建资源包
|
||||
// 11. 构建资源列表
|
||||
var allPackAssets = allBuildAssetInfoDic.Values.ToList();
|
||||
if (allPackAssets.Count == 0)
|
||||
throw new Exception("构建的资源列表不能为空");
|
||||
|
@ -149,22 +141,23 @@ namespace YooAsset.Editor
|
|||
{
|
||||
context.PackAsset(assetInfo);
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
private void RemoveZeroReferenceAssets(List<CollectAssetInfo> allCollectAssetInfos)
|
||||
{
|
||||
// 1. 检测是否任何存在依赖资源
|
||||
bool hasAnyDependAsset = false;
|
||||
bool hasAnyDependCollector = false;
|
||||
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||
{
|
||||
var collectorType = collectAssetInfo.CollectorType;
|
||||
if (collectorType == ECollectorType.DependAssetCollector)
|
||||
{
|
||||
hasAnyDependAsset = true;
|
||||
hasAnyDependCollector = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasAnyDependAsset == false)
|
||||
if (hasAnyDependCollector == false)
|
||||
return;
|
||||
|
||||
// 2. 获取所有主资源的依赖资源集合
|
||||
|
|
|
@ -16,11 +16,27 @@ namespace YooAsset.Editor
|
|||
|
||||
// 检测构建参数合法性
|
||||
if (buildParameters.BuildTarget == BuildTarget.NoTarget)
|
||||
throw new Exception("请选择目标平台");
|
||||
throw new Exception("请选择目标平台!");
|
||||
if (string.IsNullOrEmpty(buildParameters.PackageName))
|
||||
throw new Exception("包裹名称不能为空");
|
||||
throw new Exception("包裹名称不能为空!");
|
||||
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)
|
||||
{
|
||||
|
@ -48,7 +64,7 @@ namespace YooAsset.Editor
|
|||
}
|
||||
|
||||
// 检测共享资源打包规则
|
||||
if (buildParameters.ShareAssetPackRule == null)
|
||||
if (buildParameters.SharedPackRule == null)
|
||||
throw new Exception("共享资源打包规则不能为空!");
|
||||
|
||||
#if UNITY_WEBGL
|
||||
|
@ -72,11 +88,10 @@ namespace YooAsset.Editor
|
|||
|
||||
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
|
||||
{
|
||||
// 删除总目录
|
||||
string platformDirectory = $"{buildParameters.OutputRoot}/{buildParameters.BuildTarget}/{buildParameters.PackageName}";
|
||||
if (EditorTools.DeleteDirectory(platformDirectory))
|
||||
string packageRootDirectory = buildParametersContext.GetPackageRootDirectory();
|
||||
if (EditorTools.DeleteDirectory(packageRootDirectory))
|
||||
{
|
||||
BuildLogger.Log($"删除平台总目录:{platformDirectory}");
|
||||
BuildLogger.Log($"删除包裹目录:{packageRootDirectory}");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,32 +29,35 @@ namespace YooAsset.Editor
|
|||
// 2.更新构建输出的文件路径
|
||||
foreach (var bundleInfo in buildMapContext.Collection)
|
||||
{
|
||||
bundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||
if (bundleInfo.IsEncryptedFile)
|
||||
bundleInfo.BundleInfo.BuildOutputFilePath = bundleInfo.EncryptedFilePath;
|
||||
bundleInfo.PackageSourceFilePath = bundleInfo.EncryptedFilePath;
|
||||
else
|
||||
bundleInfo.BundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||
bundleInfo.PackageSourceFilePath = bundleInfo.BuildOutputFilePath;
|
||||
}
|
||||
|
||||
// 3.更新文件其它信息
|
||||
foreach (var bundleInfo in buildMapContext.Collection)
|
||||
{
|
||||
string buildOutputFilePath = bundleInfo.BundleInfo.BuildOutputFilePath;
|
||||
bundleInfo.BundleInfo.ContentHash = GetBundleContentHash(bundleInfo, context);
|
||||
bundleInfo.BundleInfo.FileHash = GetBundleFileHash(buildOutputFilePath, buildParametersContext);
|
||||
bundleInfo.BundleInfo.FileCRC = GetBundleFileCRC(buildOutputFilePath, buildParametersContext);
|
||||
bundleInfo.BundleInfo.FileSize = GetBundleFileSize(buildOutputFilePath, buildParametersContext);
|
||||
bundleInfo.PackageUnityHash = GetUnityHash(bundleInfo, context);
|
||||
bundleInfo.PackageUnityCRC = GetUnityCRC(bundleInfo, context);
|
||||
bundleInfo.PackageFileHash = GetBundleFileHash(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||
bundleInfo.PackageFileCRC = GetBundleFileCRC(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||
bundleInfo.PackageFileSize = GetBundleFileSize(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||
}
|
||||
|
||||
// 4.更新补丁包输出的文件路径
|
||||
foreach (var bundleInfo in buildMapContext.Collection)
|
||||
{
|
||||
string fileExtension = ManifestTools.GetRemoteBundleFileExtension(bundleInfo.BundleName);
|
||||
string fileName = ManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleInfo.BundleName, fileExtension, bundleInfo.BundleInfo.FileHash);
|
||||
bundleInfo.BundleInfo.PackageOutputFilePath = $"{packageOutputDirectory}/{fileName}";
|
||||
string bundleName = bundleInfo.BundleName;
|
||||
string fileHash = bundleInfo.PackageFileHash;
|
||||
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 parameters = buildParametersContext.Parameters;
|
||||
|
@ -64,7 +67,7 @@ namespace YooAsset.Editor
|
|||
|
||||
if (bundleInfo.IsRawFile)
|
||||
{
|
||||
string filePath = bundleInfo.BundleInfo.BuildOutputFilePath;
|
||||
string filePath = bundleInfo.PackageSourceFilePath;
|
||||
return HashUtility.FileMD5(filePath);
|
||||
}
|
||||
|
||||
|
@ -75,7 +78,7 @@ namespace YooAsset.Editor
|
|||
if (hash.isValid)
|
||||
return hash.ToString();
|
||||
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)
|
||||
{
|
||||
|
@ -84,7 +87,39 @@ namespace YooAsset.Editor
|
|||
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
||||
return value.Hash.ToString();
|
||||
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
|
||||
{
|
||||
|
|
|
@ -15,6 +15,8 @@ namespace YooAsset.Editor
|
|||
public const string XmlVersion = "Version";
|
||||
public const string XmlCommon = "Common";
|
||||
public const string XmlEnableAddressable = "AutoAddressable";
|
||||
public const string XmlLocationToLower = "LocationToLower";
|
||||
public const string XmlIncludeAssetGUID = "IncludeAssetGUID";
|
||||
public const string XmlUniqueBundleName = "UniqueBundleName";
|
||||
public const string XmlShowPackageView = "ShowPackageView";
|
||||
public const string XmlShowEditorAlias = "ShowEditorAlias";
|
||||
|
@ -66,6 +68,8 @@ namespace YooAsset.Editor
|
|||
|
||||
// 读取公共配置
|
||||
bool enableAddressable = false;
|
||||
bool locationToLower = false;
|
||||
bool includeAssetGUID = false;
|
||||
bool uniqueBundleName = false;
|
||||
bool showPackageView = false;
|
||||
bool showEditorAlias = false;
|
||||
|
@ -73,19 +77,18 @@ namespace YooAsset.Editor
|
|||
if (commonNodeList.Count > 0)
|
||||
{
|
||||
XmlElement commonElement = commonNodeList[0] as XmlElement;
|
||||
if (commonElement.HasAttribute(XmlEnableAddressable) == false)
|
||||
throw new Exception($"Not found attribute {XmlEnableAddressable} in {XmlCommon}");
|
||||
if (commonElement.HasAttribute(XmlUniqueBundleName) == false)
|
||||
throw new Exception($"Not found attribute {XmlUniqueBundleName} in {XmlCommon}");
|
||||
if (commonElement.HasAttribute(XmlShowPackageView) == false)
|
||||
throw new Exception($"Not found attribute {XmlShowPackageView} in {XmlCommon}");
|
||||
if (commonElement.HasAttribute(XmlShowEditorAlias) == false)
|
||||
throw new Exception($"Not found attribute {XmlShowEditorAlias} in {XmlCommon}");
|
||||
|
||||
enableAddressable = commonElement.GetAttribute(XmlEnableAddressable) == "True" ? true : false;
|
||||
uniqueBundleName = commonElement.GetAttribute(XmlUniqueBundleName) == "True" ? true : false;
|
||||
showPackageView = commonElement.GetAttribute(XmlShowPackageView) == "True" ? true : false;
|
||||
showEditorAlias = commonElement.GetAttribute(XmlShowEditorAlias) == "True" ? true : false;
|
||||
if (commonElement.HasAttribute(XmlEnableAddressable))
|
||||
enableAddressable = commonElement.GetAttribute(XmlEnableAddressable) == "True" ? true : false;
|
||||
if (commonElement.HasAttribute(XmlLocationToLower))
|
||||
locationToLower = commonElement.GetAttribute(XmlLocationToLower) == "True" ? true : false;
|
||||
if (commonElement.HasAttribute(XmlIncludeAssetGUID))
|
||||
includeAssetGUID = commonElement.GetAttribute(XmlIncludeAssetGUID) == "True" ? true : false;
|
||||
if (commonElement.HasAttribute(XmlUniqueBundleName))
|
||||
uniqueBundleName = commonElement.GetAttribute(XmlUniqueBundleName) == "True" ? true : false;
|
||||
if (commonElement.HasAttribute(XmlShowPackageView))
|
||||
showPackageView = commonElement.GetAttribute(XmlShowPackageView) == "True" ? true : false;
|
||||
if (commonElement.HasAttribute(XmlShowEditorAlias))
|
||||
showEditorAlias = commonElement.GetAttribute(XmlShowEditorAlias) == "True" ? true : false;
|
||||
}
|
||||
|
||||
// 读取包裹配置
|
||||
|
@ -162,7 +165,7 @@ namespace YooAsset.Editor
|
|||
}
|
||||
|
||||
// 检测配置错误
|
||||
foreach(var package in packages)
|
||||
foreach (var package in packages)
|
||||
{
|
||||
package.CheckConfigError();
|
||||
}
|
||||
|
@ -170,6 +173,8 @@ namespace YooAsset.Editor
|
|||
// 保存配置数据
|
||||
AssetBundleCollectorSettingData.ClearAll();
|
||||
AssetBundleCollectorSettingData.Setting.EnableAddressable = enableAddressable;
|
||||
AssetBundleCollectorSettingData.Setting.LocationToLower = locationToLower;
|
||||
AssetBundleCollectorSettingData.Setting.IncludeAssetGUID = includeAssetGUID;
|
||||
AssetBundleCollectorSettingData.Setting.UniqueBundleName = uniqueBundleName;
|
||||
AssetBundleCollectorSettingData.Setting.ShowPackageView = showPackageView;
|
||||
AssetBundleCollectorSettingData.Setting.ShowEditorAlias = showEditorAlias;
|
||||
|
@ -201,6 +206,8 @@ namespace YooAsset.Editor
|
|||
// 设置公共配置
|
||||
var commonElement = xmlDoc.CreateElement(XmlCommon);
|
||||
commonElement.SetAttribute(XmlEnableAddressable, AssetBundleCollectorSettingData.Setting.EnableAddressable.ToString());
|
||||
commonElement.SetAttribute(XmlLocationToLower, AssetBundleCollectorSettingData.Setting.LocationToLower.ToString());
|
||||
commonElement.SetAttribute(XmlIncludeAssetGUID, AssetBundleCollectorSettingData.Setting.IncludeAssetGUID.ToString());
|
||||
commonElement.SetAttribute(XmlUniqueBundleName, AssetBundleCollectorSettingData.Setting.UniqueBundleName.ToString());
|
||||
commonElement.SetAttribute(XmlShowPackageView, AssetBundleCollectorSettingData.Setting.ShowPackageView.ToString());
|
||||
commonElement.SetAttribute(XmlShowEditorAlias, AssetBundleCollectorSettingData.Setting.ShowEditorAlias.ToString());
|
||||
|
@ -359,14 +366,14 @@ namespace YooAsset.Editor
|
|||
}
|
||||
|
||||
// 2.3 -> 2.4
|
||||
if(configVersion == "2.3")
|
||||
if (configVersion == "2.3")
|
||||
{
|
||||
// 获取所有分组元素
|
||||
var groupNodeList = root.GetElementsByTagName(XmlGroup);
|
||||
foreach (var groupNode in groupNodeList)
|
||||
{
|
||||
XmlElement groupElement = groupNode as XmlElement;
|
||||
if(groupElement.HasAttribute(XmlGroupActiveRule) == false)
|
||||
if (groupElement.HasAttribute(XmlGroupActiveRule) == false)
|
||||
groupElement.SetAttribute(XmlGroupActiveRule, $"{nameof(EnableGroup)}");
|
||||
}
|
||||
|
||||
|
|
|
@ -10,15 +10,25 @@ namespace YooAsset.Editor
|
|||
public class AssetBundleCollectorSetting : ScriptableObject
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否显示包裹列表视图
|
||||
/// 显示包裹列表视图
|
||||
/// </summary>
|
||||
public bool ShowPackageView = false;
|
||||
|
||||
/// <summary>
|
||||
/// 是否启用可寻址资源定位
|
||||
/// 启用可寻址资源定位
|
||||
/// </summary>
|
||||
public bool EnableAddressable = false;
|
||||
|
||||
/// <summary>
|
||||
/// 资源定位地址大小写不敏感
|
||||
/// </summary>
|
||||
public bool LocationToLower = false;
|
||||
|
||||
/// <summary>
|
||||
/// 包含资源GUID数据
|
||||
/// </summary>
|
||||
public bool IncludeAssetGUID = false;
|
||||
|
||||
/// <summary>
|
||||
/// 资源包名唯一化
|
||||
/// </summary>
|
||||
|
@ -41,7 +51,12 @@ namespace YooAsset.Editor
|
|||
/// </summary>
|
||||
public void ClearAll()
|
||||
{
|
||||
ShowPackageView = false;
|
||||
EnableAddressable = false;
|
||||
LocationToLower = false;
|
||||
IncludeAssetGUID = false;
|
||||
UniqueBundleName = false;
|
||||
ShowEditorAlias = false;
|
||||
Packages.Clear();
|
||||
}
|
||||
|
||||
|
@ -101,7 +116,8 @@ namespace YooAsset.Editor
|
|||
{
|
||||
if (package.PackageName == packageName)
|
||||
{
|
||||
CollectCommand command = new CollectCommand(buildMode, packageName, EnableAddressable, UniqueBundleName);
|
||||
CollectCommand command = new CollectCommand(buildMode, packageName,
|
||||
EnableAddressable, LocationToLower, IncludeAssetGUID, UniqueBundleName);
|
||||
CollectResult collectResult = new CollectResult(command);
|
||||
collectResult.SetCollectAssets(package.GetAllCollectAssets(command));
|
||||
return collectResult;
|
||||
|
|
|
@ -331,6 +331,16 @@ namespace YooAsset.Editor
|
|||
Setting.EnableAddressable = enableAddressable;
|
||||
IsDirty = true;
|
||||
}
|
||||
public static void ModifyLocationToLower(bool locationToLower)
|
||||
{
|
||||
Setting.LocationToLower = locationToLower;
|
||||
IsDirty = true;
|
||||
}
|
||||
public static void ModifyIncludeAssetGUID(bool includeAssetGUID)
|
||||
{
|
||||
Setting.IncludeAssetGUID = includeAssetGUID;
|
||||
IsDirty = true;
|
||||
}
|
||||
public static void ModifyUniqueBundleName(bool uniqueBundleName)
|
||||
{
|
||||
Setting.UniqueBundleName = uniqueBundleName;
|
||||
|
|
|
@ -25,8 +25,13 @@ namespace YooAsset.Editor
|
|||
private List<RuleDisplayName> _packRuleList;
|
||||
private List<RuleDisplayName> _filterRuleList;
|
||||
|
||||
private Button _settingsButton;
|
||||
private VisualElement _setting1Container;
|
||||
private VisualElement _setting2Container;
|
||||
private Toggle _showPackageToogle;
|
||||
private Toggle _enableAddressableToogle;
|
||||
private Toggle _locationToLowerToogle;
|
||||
private Toggle _includeAssetGUIDToogle;
|
||||
private Toggle _uniqueBundleNameToogle;
|
||||
private Toggle _showEditorAliasToggle;
|
||||
|
||||
|
@ -47,6 +52,7 @@ namespace YooAsset.Editor
|
|||
|
||||
private int _lastModifyPackageIndex = 0;
|
||||
private int _lastModifyGroupIndex = 0;
|
||||
private bool _showSettings = false;
|
||||
|
||||
|
||||
public void CreateGUI()
|
||||
|
@ -77,6 +83,10 @@ namespace YooAsset.Editor
|
|||
visualAsset.CloneTree(root);
|
||||
|
||||
// 公共设置相关
|
||||
_settingsButton = root.Q<Button>("SettingsButton");
|
||||
_settingsButton.clicked += SettingsBtn_clicked;
|
||||
_setting1Container = root.Q("PublicContainer1");
|
||||
_setting2Container = root.Q("PublicContainer2");
|
||||
_showPackageToogle = root.Q<Toggle>("ShowPackages");
|
||||
_showPackageToogle.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
|
@ -89,13 +99,24 @@ namespace YooAsset.Editor
|
|||
AssetBundleCollectorSettingData.ModifyAddressable(evt.newValue);
|
||||
RefreshWindow();
|
||||
});
|
||||
_locationToLowerToogle = root.Q<Toggle>("LocationToLower");
|
||||
_locationToLowerToogle.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
AssetBundleCollectorSettingData.ModifyLocationToLower(evt.newValue);
|
||||
RefreshWindow();
|
||||
});
|
||||
_includeAssetGUIDToogle = root.Q<Toggle>("IncludeAssetGUID");
|
||||
_includeAssetGUIDToogle.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
AssetBundleCollectorSettingData.ModifyIncludeAssetGUID(evt.newValue);
|
||||
RefreshWindow();
|
||||
});
|
||||
_uniqueBundleNameToogle = root.Q<Toggle>("UniqueBundleName");
|
||||
_uniqueBundleNameToogle.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
AssetBundleCollectorSettingData.ModifyUniqueBundleName(evt.newValue);
|
||||
RefreshWindow();
|
||||
});
|
||||
|
||||
_showEditorAliasToggle = root.Q<Toggle>("ShowEditorAlias");
|
||||
_showEditorAliasToggle.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
|
@ -302,9 +323,22 @@ namespace YooAsset.Editor
|
|||
{
|
||||
_showPackageToogle.SetValueWithoutNotify(AssetBundleCollectorSettingData.Setting.ShowPackageView);
|
||||
_enableAddressableToogle.SetValueWithoutNotify(AssetBundleCollectorSettingData.Setting.EnableAddressable);
|
||||
_locationToLowerToogle.SetValueWithoutNotify(AssetBundleCollectorSettingData.Setting.LocationToLower);
|
||||
_includeAssetGUIDToogle.SetValueWithoutNotify(AssetBundleCollectorSettingData.Setting.IncludeAssetGUID);
|
||||
_uniqueBundleNameToogle.SetValueWithoutNotify(AssetBundleCollectorSettingData.Setting.UniqueBundleName);
|
||||
_showEditorAliasToggle.SetValueWithoutNotify(AssetBundleCollectorSettingData.Setting.ShowEditorAlias);
|
||||
|
||||
if (_showSettings)
|
||||
{
|
||||
_setting1Container.style.display = DisplayStyle.Flex;
|
||||
_setting2Container.style.display = DisplayStyle.Flex;
|
||||
}
|
||||
else
|
||||
{
|
||||
_setting1Container.style.display = DisplayStyle.None;
|
||||
_setting2Container.style.display = DisplayStyle.None;
|
||||
}
|
||||
|
||||
_groupContainer.visible = false;
|
||||
_collectorContainer.visible = false;
|
||||
|
||||
|
@ -336,6 +370,11 @@ namespace YooAsset.Editor
|
|||
{
|
||||
AssetBundleCollectorSettingData.SaveFile();
|
||||
}
|
||||
private void SettingsBtn_clicked()
|
||||
{
|
||||
_showSettings = !_showSettings;
|
||||
RefreshWindow();
|
||||
}
|
||||
private string FormatListItemCallback(RuleDisplayName ruleDisplayName)
|
||||
{
|
||||
if (_showEditorAliasToggle.value)
|
||||
|
@ -796,7 +835,8 @@ namespace YooAsset.Editor
|
|||
|
||||
try
|
||||
{
|
||||
CollectCommand command = new CollectCommand(EBuildMode.SimulateBuild, _packageNameTxt.value, _enableAddressableToogle.value, _uniqueBundleNameToogle.value);
|
||||
CollectCommand command = new CollectCommand(EBuildMode.SimulateBuild, _packageNameTxt.value,
|
||||
_enableAddressableToogle.value, _locationToLowerToogle.value, _includeAssetGUIDToogle.value, _uniqueBundleNameToogle.value);
|
||||
collectAssetInfos = collector.GetAllCollectAssets(command, group);
|
||||
}
|
||||
catch (System.Exception e)
|
||||
|
|
|
@ -1,15 +1,22 @@
|
|||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
|
||||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" editor-extension-mode="False">
|
||||
<uie:Toolbar name="Toolbar" style="display: flex; flex-direction: row-reverse;">
|
||||
<ui:Button text="Save" display-tooltip-when-elided="true" name="SaveButton" style="width: 50px; background-color: rgb(56, 147, 58);" />
|
||||
<ui:Button text="导出" display-tooltip-when-elided="true" name="ExportButton" style="width: 50px; background-color: rgb(56, 147, 58);" />
|
||||
<ui:Button text="导入" display-tooltip-when-elided="true" name="ImportButton" style="width: 50px; background-color: rgb(56, 147, 58);" />
|
||||
<ui:Button text="修复" display-tooltip-when-elided="true" name="FixButton" style="width: 50px; background-color: rgb(56, 147, 58);" />
|
||||
</uie:Toolbar>
|
||||
<ui:VisualElement name="PublicContainer" style="height: 30px; background-color: rgb(67, 67, 67); flex-direction: row; border-left-width: 5px; border-right-width: 5px; border-top-width: 5px; border-bottom-width: 5px;">
|
||||
<ui:Toggle label="Show Packages" name="ShowPackages" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Show Editor Alias" name="ShowEditorAlias" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Enable Addressable" name="EnableAddressable" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Unique Bundle Name" name="UniqueBundleName" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:VisualElement name="PublicContainer" style="background-color: rgb(79, 79, 79); flex-direction: column; border-left-width: 5px; border-right-width: 5px; border-top-width: 5px; border-bottom-width: 5px;">
|
||||
<ui:Button text="Settings" display-tooltip-when-elided="true" name="SettingsButton" />
|
||||
<ui:VisualElement name="PublicContainer1" style="flex-direction: row; flex-wrap: nowrap; height: 28px;">
|
||||
<ui:Toggle label="Show Packages" name="ShowPackages" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Show Editor Alias" name="ShowEditorAlias" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Enable Addressable" name="EnableAddressable" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Unique Bundle Name" name="UniqueBundleName" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement name="PublicContainer2" style="flex-direction: row; flex-wrap: nowrap; height: 28px;">
|
||||
<ui:Toggle label="Location To Lower" name="LocationToLower" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
<ui:Toggle label="Include Asset GUID" name="IncludeAssetGUID" style="width: 196px; -unity-text-align: middle-left;" />
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement name="ContentContainer" style="flex-grow: 1; flex-direction: row;">
|
||||
<ui:VisualElement name="PackageContainer" style="width: 200px; flex-grow: 0; background-color: rgb(67, 67, 67); border-left-width: 5px; border-right-width: 5px; border-top-width: 5px; border-bottom-width: 5px;">
|
||||
|
|
|
@ -14,10 +14,20 @@ namespace YooAsset.Editor
|
|||
public string PackageName { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否启用可寻址资源定位
|
||||
/// 启用可寻址资源定位
|
||||
/// </summary>
|
||||
public bool EnableAddressable { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 资源定位地址大小写不敏感
|
||||
/// </summary>
|
||||
public bool LocationToLower { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 包含资源GUID数据
|
||||
/// </summary>
|
||||
public bool IncludeAssetGUID { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 资源包名唯一化
|
||||
/// </summary>
|
||||
|
@ -29,11 +39,13 @@ namespace YooAsset.Editor
|
|||
public string ShadersBundleName { private set; get; }
|
||||
|
||||
|
||||
public CollectCommand(EBuildMode buildMode, string packageName, bool enableAddressable, bool uniqueBundleName)
|
||||
public CollectCommand(EBuildMode buildMode, string packageName, bool enableAddressable, bool locationToLower, bool includeAssetGUID, bool uniqueBundleName)
|
||||
{
|
||||
BuildMode = buildMode;
|
||||
PackageName = packageName;
|
||||
EnableAddressable = enableAddressable;
|
||||
LocationToLower = locationToLower;
|
||||
IncludeAssetGUID = includeAssetGUID;
|
||||
UniqueBundleName = uniqueBundleName;
|
||||
|
||||
// 着色器统一全名称
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 10823e059e253a04083b6122027db930
|
||||
guid: 28c5def11c9035443b6251933ffa6a30
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
|
@ -48,12 +48,16 @@ namespace YooAsset.Editor
|
|||
fullName = $"{bundleName}.{_bundleExtension}";
|
||||
return fullName.ToLower();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取共享资源包全名称
|
||||
/// </summary>
|
||||
public string GetShareBundleName(string packageName, bool uniqueBundleName)
|
||||
{
|
||||
// 注意:冗余的共享资源包名返回空
|
||||
if (string.IsNullOrEmpty(_bundleName) && string.IsNullOrEmpty(_bundleExtension))
|
||||
return string.Empty;
|
||||
|
||||
string fullName;
|
||||
string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower();
|
||||
if (uniqueBundleName)
|
|
@ -4,7 +4,7 @@ namespace YooAsset.Editor
|
|||
/// <summary>
|
||||
/// 共享资源的打包规则
|
||||
/// </summary>
|
||||
public interface IShareAssetPackRule
|
||||
public interface ISharedPackRule
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取打包规则结果
|
|
@ -1,5 +1,5 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 341ae2d28a0e18a40907cf38d7113825
|
||||
guid: a44aabee880cce943b52fe806464be0d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
|
@ -20,7 +20,7 @@ namespace YooAsset.Editor
|
|||
}
|
||||
}
|
||||
|
||||
[DisplayName("定位地址: 分组名+文件名")]
|
||||
[DisplayName("定位地址: 分组名_文件名")]
|
||||
public class AddressByGroupAndFileName : IAddressRule
|
||||
{
|
||||
string IAddressRule.GetAssetAddress(AddressRuleData data)
|
||||
|
@ -30,7 +30,7 @@ namespace YooAsset.Editor
|
|||
}
|
||||
}
|
||||
|
||||
[DisplayName("定位地址: 文件夹名+文件名")]
|
||||
[DisplayName("定位地址: 文件夹名_文件名")]
|
||||
public class AddressByFolderAndFileName : IAddressRule
|
||||
{
|
||||
string IAddressRule.GetAssetAddress(AddressRuleData data)
|
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using UnityEditor;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
/// <summary>
|
||||
/// 零冗余的共享资源打包规则
|
||||
/// </summary>
|
||||
public class ZeroRedundancySharedPackRule : ISharedPackRule
|
||||
{
|
||||
public PackRuleResult GetPackRuleResult(string assetPath)
|
||||
{
|
||||
string bundleName = Path.GetDirectoryName(assetPath);
|
||||
PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 全部冗余的共享资源打包规则
|
||||
/// </summary>
|
||||
public class FullRedundancySharedPackRule : ISharedPackRule
|
||||
{
|
||||
public PackRuleResult GetPackRuleResult(string assetPath)
|
||||
{
|
||||
PackRuleResult result = new PackRuleResult(string.Empty, string.Empty);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using UnityEditor;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
public class DefaultShareAssetPackRule : IShareAssetPackRule
|
||||
{
|
||||
public PackRuleResult GetPackRuleResult(string assetPath)
|
||||
{
|
||||
string bundleName = Path.GetDirectoryName(assetPath);
|
||||
PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -66,11 +66,13 @@ namespace YooAsset.Editor
|
|||
_items.Add(new ItemWrapper("包裹名称", buildReport.Summary.BuildPackageName));
|
||||
_items.Add(new ItemWrapper("包裹版本", buildReport.Summary.BuildPackageVersion));
|
||||
|
||||
_items.Add(new ItemWrapper(string.Empty, string.Empty));
|
||||
_items.Add(new ItemWrapper("启用可寻址资源定位", $"{buildReport.Summary.EnableAddressable}"));
|
||||
_items.Add(new ItemWrapper("资源定位地址大小写不敏感", $"{buildReport.Summary.LocationToLower}"));
|
||||
_items.Add(new ItemWrapper("包含资源GUID数据", $"{buildReport.Summary.IncludeAssetGUID}"));
|
||||
_items.Add(new ItemWrapper("资源包名唯一化", $"{buildReport.Summary.UniqueBundleName}"));
|
||||
_items.Add(new ItemWrapper("自动分析冗余资源", $"{buildReport.Summary.AutoAnalyzeRedundancy}"));
|
||||
_items.Add(new ItemWrapper("共享资源的打包类名称", buildReport.Summary.ShareAssetPackRuleClassName));
|
||||
_items.Add(new ItemWrapper("加密服务类名称", buildReport.Summary.EncryptionServicesClassName));
|
||||
_items.Add(new ItemWrapper("共享资源打包规则", buildReport.Summary.SharedPackRuleClassName));
|
||||
_items.Add(new ItemWrapper("资源加密服务类", buildReport.Summary.EncryptionServicesClassName));
|
||||
|
||||
_items.Add(new ItemWrapper(string.Empty, string.Empty));
|
||||
_items.Add(new ItemWrapper("构建参数", string.Empty));
|
||||
|
|
|
@ -35,10 +35,20 @@ namespace YooAsset.Editor
|
|||
TypeCache.TypeCollection collection = TypeCache.GetTypesDerivedFrom(parentType);
|
||||
return collection.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取带有指定属性的所有类的类型
|
||||
/// </summary>
|
||||
public static List<Type> GetTypesWithAttribute(System.Type attrType)
|
||||
{
|
||||
TypeCache.TypeCollection collection = TypeCache.GetTypesWithAttribute(attrType);
|
||||
return collection.ToList();
|
||||
}
|
||||
#else
|
||||
private static readonly List<Type> _cacheTypes = new List<Type>(10000);
|
||||
private static void InitAssembly()
|
||||
{
|
||||
_cacheTypes.Clear();
|
||||
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||
foreach (Assembly assembly in assemblies)
|
||||
{
|
||||
|
@ -65,6 +75,23 @@ namespace YooAsset.Editor
|
|||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取带有指定属性的所有类的类型
|
||||
/// </summary>
|
||||
public static List<Type> GetTypesWithAttribute(System.Type attrType)
|
||||
{
|
||||
List<Type> result = new List<Type>();
|
||||
for (int i = 0; i < _cacheTypes.Count; i++)
|
||||
{
|
||||
Type type = _cacheTypes[i];
|
||||
if (type.GetCustomAttribute(attrType) != null)
|
||||
{
|
||||
result.Add(type);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
|
@ -213,11 +240,11 @@ namespace YooAsset.Editor
|
|||
public static void FocusUnitySceneWindow()
|
||||
{
|
||||
EditorWindow.FocusWindowIfItsOpen<SceneView>();
|
||||
}
|
||||
public static void CloseUnityGameWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.GameView");
|
||||
EditorWindow.GetWindow(T, false, "GameView", true).Close();
|
||||
}
|
||||
public static void CloseUnityGameWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.GameView");
|
||||
EditorWindow.GetWindow(T, false, "GameView", true).Close();
|
||||
}
|
||||
public static void FocusUnityGameWindow()
|
||||
{
|
||||
|
@ -399,7 +426,7 @@ namespace YooAsset.Editor
|
|||
FileInfo fileInfo = new FileInfo(filePath);
|
||||
fileInfo.MoveTo(destPath);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 拷贝文件夹
|
||||
/// 注意:包括所有子目录的文件
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
public class AssetReference
|
||||
{
|
||||
}
|
||||
}
|
|
@ -79,30 +79,6 @@ namespace YooAsset
|
|||
_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>
|
||||
|
@ -135,7 +111,7 @@ namespace YooAsset
|
|||
if (loader.CanDestroy())
|
||||
{
|
||||
string bundleName = loader.MainBundleInfo.Bundle.BundleName;
|
||||
loader.Destroy(false);
|
||||
loader.Destroy();
|
||||
_loaderList.RemoveAt(i);
|
||||
_loaderDic.Remove(bundleName);
|
||||
}
|
||||
|
@ -147,13 +123,16 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public void ForceUnloadAllAssets()
|
||||
{
|
||||
#if UNITY_WEBGL
|
||||
throw new Exception($"WebGL not support invoke {nameof(ForceUnloadAllAssets)}");
|
||||
#else
|
||||
foreach (var provider in _providerList)
|
||||
{
|
||||
provider.Destroy();
|
||||
provider.DestroySafely();
|
||||
}
|
||||
foreach (var loader in _loaderList)
|
||||
{
|
||||
loader.Destroy(true);
|
||||
loader.DestroySafely();
|
||||
}
|
||||
|
||||
_providerList.Clear();
|
||||
|
@ -164,12 +143,13 @@ namespace YooAsset
|
|||
|
||||
// 注意:调用底层接口释放所有资源
|
||||
Resources.UnloadUnusedAssets();
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载场景
|
||||
/// </summary>
|
||||
public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority)
|
||||
public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, int priority)
|
||||
{
|
||||
if (assetInfo.IsInvalid)
|
||||
{
|
||||
|
@ -190,9 +170,9 @@ namespace YooAsset
|
|||
ProviderBase provider;
|
||||
{
|
||||
if (_simulationOnEditor)
|
||||
provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode, activateOnLoad, priority);
|
||||
provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode, suspendLoad, priority);
|
||||
else
|
||||
provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode, activateOnLoad, priority);
|
||||
provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode, suspendLoad, priority);
|
||||
provider.InitSpawnDebugInfo();
|
||||
_providerList.Add(provider);
|
||||
_providerDic.Add(providerGUID, provider);
|
||||
|
@ -260,6 +240,34 @@ namespace YooAsset
|
|||
return provider.CreateHandle<SubAssetsOperationHandle>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载所有资源对象
|
||||
/// </summary>
|
||||
public AllAssetsOperationHandle LoadAllAssetsAsync(AssetInfo assetInfo)
|
||||
{
|
||||
if (assetInfo.IsInvalid)
|
||||
{
|
||||
YooLogger.Error($"Failed to load all assets ! {assetInfo.Error}");
|
||||
CompletedProvider completedProvider = new CompletedProvider(assetInfo);
|
||||
completedProvider.SetCompleted(assetInfo.Error);
|
||||
return completedProvider.CreateHandle<AllAssetsOperationHandle>();
|
||||
}
|
||||
|
||||
string providerGUID = assetInfo.GUID;
|
||||
ProviderBase provider = TryGetProvider(providerGUID);
|
||||
if (provider == null)
|
||||
{
|
||||
if (_simulationOnEditor)
|
||||
provider = new DatabaseAllAssetsProvider(this, providerGUID, assetInfo);
|
||||
else
|
||||
provider = new BundledAllAssetsProvider(this, providerGUID, assetInfo);
|
||||
provider.InitSpawnDebugInfo();
|
||||
_providerList.Add(provider);
|
||||
_providerDic.Add(providerGUID, provider);
|
||||
}
|
||||
return provider.CreateHandle<AllAssetsOperationHandle>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载原生文件
|
||||
/// </summary>
|
||||
|
@ -377,10 +385,10 @@ namespace YooAsset
|
|||
else
|
||||
{
|
||||
#if UNITY_WEBGL
|
||||
if (bundleInfo.Bundle.IsRawFile)
|
||||
loader = new RawBundleWebLoader(this, bundleInfo);
|
||||
else
|
||||
loader = new AssetBundleWebLoader(this, bundleInfo);
|
||||
if (bundleInfo.Bundle.IsRawFile)
|
||||
loader = new RawBundleWebLoader(this, bundleInfo);
|
||||
else
|
||||
loader = new AssetBundleWebLoader(this, bundleInfo);
|
||||
#else
|
||||
if (bundleInfo.Bundle.IsRawFile)
|
||||
loader = new RawBundleFileLoader(this, bundleInfo);
|
||||
|
@ -408,7 +416,7 @@ namespace YooAsset
|
|||
return null;
|
||||
}
|
||||
|
||||
#region 调试信息
|
||||
#region 调试信息
|
||||
internal List<DebugProviderInfo> GetDebugReportInfos()
|
||||
{
|
||||
List<DebugProviderInfo> result = new List<DebugProviderInfo>(_providerList.Count);
|
||||
|
@ -436,6 +444,6 @@ namespace YooAsset
|
|||
}
|
||||
return result;
|
||||
}
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
public sealed class AllAssetsOperationHandle : OperationHandleBase, IDisposable
|
||||
{
|
||||
private System.Action<AllAssetsOperationHandle> _callback;
|
||||
|
||||
internal AllAssetsOperationHandle(ProviderBase provider) : base(provider)
|
||||
{
|
||||
}
|
||||
internal override void InvokeCallback()
|
||||
{
|
||||
_callback?.Invoke(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 完成委托
|
||||
/// </summary>
|
||||
public event System.Action<AllAssetsOperationHandle> Completed
|
||||
{
|
||||
add
|
||||
{
|
||||
if (IsValidWithWarning == false)
|
||||
throw new System.Exception($"{nameof(AllAssetsOperationHandle)} is invalid");
|
||||
if (Provider.IsDone)
|
||||
value.Invoke(this);
|
||||
else
|
||||
_callback += value;
|
||||
}
|
||||
remove
|
||||
{
|
||||
if (IsValidWithWarning == false)
|
||||
throw new System.Exception($"{nameof(AllAssetsOperationHandle)} is invalid");
|
||||
_callback -= value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 等待异步执行完毕
|
||||
/// </summary>
|
||||
public void WaitForAsyncComplete()
|
||||
{
|
||||
if (IsValidWithWarning == false)
|
||||
return;
|
||||
Provider.WaitForAsyncComplete();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 释放资源句柄
|
||||
/// </summary>
|
||||
public void Release()
|
||||
{
|
||||
this.ReleaseInternal();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 释放资源句柄
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
this.ReleaseInternal();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 子资源对象集合
|
||||
/// </summary>
|
||||
public UnityEngine.Object[] AllAssetObjects
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsValidWithWarning == false)
|
||||
return null;
|
||||
return Provider.AllAssetObjects;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6de8dc2be5f52704abe6db03818edff2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -73,9 +73,7 @@ namespace YooAsset
|
|||
if (IsValidWithWarning == false)
|
||||
return null;
|
||||
string filePath = Provider.RawFilePath;
|
||||
if (File.Exists(filePath) == false)
|
||||
return null;
|
||||
return File.ReadAllBytes(filePath);
|
||||
return FileUtility.ReadAllBytes(filePath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
namespace YooAsset
|
||||
{
|
||||
public class SceneOperationHandle : OperationHandleBase
|
||||
{
|
||||
{
|
||||
private System.Action<SceneOperationHandle> _callback;
|
||||
internal string PackageName { set; get; }
|
||||
|
||||
|
@ -51,7 +51,7 @@ namespace YooAsset
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 激活场景
|
||||
/// 激活场景(当同时存在多个场景时用于切换激活场景)
|
||||
/// </summary>
|
||||
public bool ActivateScene()
|
||||
{
|
||||
|
@ -69,6 +69,38 @@ namespace YooAsset
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解除场景加载挂起操作
|
||||
/// </summary>
|
||||
public bool UnSuspend()
|
||||
{
|
||||
if (IsValidWithWarning == false)
|
||||
return false;
|
||||
|
||||
if (SceneObject.IsValid())
|
||||
{
|
||||
if (Provider is DatabaseSceneProvider)
|
||||
{
|
||||
var temp = Provider as DatabaseSceneProvider;
|
||||
return temp.UnSuspendLoad();
|
||||
}
|
||||
else if (Provider is BundledSceneProvider)
|
||||
{
|
||||
var temp = Provider as BundledSceneProvider;
|
||||
return temp.UnSuspendLoad();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
YooLogger.Warning($"Scene is invalid : {SceneObject.name}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否为主场景
|
||||
/// </summary>
|
||||
|
|
|
@ -82,7 +82,8 @@ namespace YooAsset
|
|||
if (_steps == ESteps.Download)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
||||
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain);
|
||||
_downloader.SendRequest();
|
||||
_steps = ESteps.CheckDownload;
|
||||
}
|
||||
|
||||
|
@ -111,8 +112,9 @@ namespace YooAsset
|
|||
if (_steps == ESteps.Unpack)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
|
||||
_unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
||||
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||
_unpacker = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain);
|
||||
_unpacker.SendRequest();
|
||||
_steps = ESteps.CheckUnpack;
|
||||
}
|
||||
|
||||
|
@ -262,9 +264,9 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 销毁
|
||||
/// </summary>
|
||||
public override void Destroy(bool forceDestroy)
|
||||
public override void Destroy()
|
||||
{
|
||||
base.Destroy(forceDestroy);
|
||||
base.Destroy();
|
||||
|
||||
if (_stream != null)
|
||||
{
|
||||
|
|
|
@ -15,21 +15,14 @@ namespace YooAsset
|
|||
private enum ESteps
|
||||
{
|
||||
None = 0,
|
||||
Download,
|
||||
CheckDownload,
|
||||
LoadCacheFile,
|
||||
CheckLoadCacheFile,
|
||||
LoadWebFile,
|
||||
CheckLoadWebFile,
|
||||
TryLoadWebFile,
|
||||
LoadWebSiteFile,
|
||||
LoadRemoteFile,
|
||||
CheckLoadFile,
|
||||
Done,
|
||||
}
|
||||
|
||||
private ESteps _steps = ESteps.None;
|
||||
private float _tryTimer = 0;
|
||||
private DownloaderBase _downloader;
|
||||
private UnityWebRequest _webRequest;
|
||||
private AssetBundleCreateRequest _createRequest;
|
||||
private WebDownloader _downloader;
|
||||
|
||||
|
||||
public AssetBundleWebLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
|
||||
|
@ -48,18 +41,13 @@ namespace YooAsset
|
|||
{
|
||||
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
|
||||
{
|
||||
_steps = ESteps.Download;
|
||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
||||
_steps = ESteps.LoadRemoteFile;
|
||||
FileLoadPath = string.Empty;
|
||||
}
|
||||
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
|
||||
{
|
||||
_steps = ESteps.LoadWebFile;
|
||||
FileLoadPath = MainBundleInfo.Bundle.StreamingFilePath;
|
||||
}
|
||||
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
|
||||
{
|
||||
_steps = ESteps.LoadCacheFile;
|
||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
||||
_steps = ESteps.LoadWebSiteFile;
|
||||
FileLoadPath = string.Empty;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -67,159 +55,49 @@ namespace YooAsset
|
|||
}
|
||||
}
|
||||
|
||||
// 1. 从服务器下载
|
||||
if (_steps == ESteps.Download)
|
||||
// 1. 跨域获取资源包
|
||||
if (_steps == ESteps.LoadRemoteFile)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
||||
_steps = ESteps.CheckDownload;
|
||||
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain) as WebDownloader;
|
||||
_downloader.SendRequest(true);
|
||||
_steps = ESteps.CheckLoadFile;
|
||||
}
|
||||
|
||||
// 2. 检测服务器下载结果
|
||||
if (_steps == ESteps.CheckDownload)
|
||||
// 2. 从站点获取资源包
|
||||
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;
|
||||
DownloadedBytes = _downloader.DownloadedBytes;
|
||||
if (_downloader.IsDone() == false)
|
||||
return;
|
||||
|
||||
if (_downloader.HasError())
|
||||
{
|
||||
_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;
|
||||
CacheBundle = _downloader.GetAssetBundle();
|
||||
if (CacheBundle == null)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EStatus.Failed;
|
||||
LastError = $"Failed to load AssetBundle file : {MainBundleInfo.Bundle.BundleName}";
|
||||
LastError = $"AssetBundle file is invalid : {MainBundleInfo.Bundle.BundleName}";
|
||||
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
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EStatus.Succeed;
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 从WEB网站获取AssetBundle文件
|
||||
if (_steps == ESteps.LoadWebFile)
|
||||
{
|
||||
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;
|
||||
}
|
||||
// 注意:释放下载句柄
|
||||
_downloader.DisposeHandler();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -144,6 +144,15 @@ namespace YooAsset
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 销毁资源包(安全模式)
|
||||
/// </summary>
|
||||
public void DestroySafely()
|
||||
{
|
||||
WaitForAsyncComplete();
|
||||
Destroy();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 轮询更新
|
||||
|
@ -153,18 +162,15 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 销毁
|
||||
/// </summary>
|
||||
public virtual void Destroy(bool forceDestroy)
|
||||
public virtual void Destroy()
|
||||
{
|
||||
IsDestroyed = true;
|
||||
|
||||
// Check fatal
|
||||
if (forceDestroy == false)
|
||||
{
|
||||
if (RefCount > 0)
|
||||
throw new Exception($"Bundle file loader ref is not zero : {MainBundleInfo.Bundle.BundleName}");
|
||||
if (IsDone() == false)
|
||||
throw new Exception($"Bundle file loader is not done : {MainBundleInfo.Bundle.BundleName}");
|
||||
}
|
||||
if (RefCount > 0)
|
||||
throw new Exception($"Bundle file loader ref is not zero : {MainBundleInfo.Bundle.BundleName}");
|
||||
if (IsDone() == false)
|
||||
throw new Exception($"Bundle file loader is not done : {MainBundleInfo.Bundle.BundleName}");
|
||||
|
||||
if (CacheBundle != null)
|
||||
{
|
||||
|
|
|
@ -4,17 +4,17 @@ using System.Collections.Generic;
|
|||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal class DependAssetBundleGroup
|
||||
internal class DependAssetBundles
|
||||
{
|
||||
/// <summary>
|
||||
/// 依赖的资源包加载器列表
|
||||
/// </summary>
|
||||
internal readonly List<BundleLoaderBase> DependBundles;
|
||||
internal readonly List<BundleLoaderBase> DependList;
|
||||
|
||||
|
||||
public DependAssetBundleGroup(List<BundleLoaderBase> dpendBundles)
|
||||
public DependAssetBundles(List<BundleLoaderBase> dpendList)
|
||||
{
|
||||
DependBundles = dpendBundles;
|
||||
DependList = dpendList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -22,7 +22,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public bool IsDone()
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
if (loader.IsDone() == false)
|
||||
return false;
|
||||
|
@ -35,7 +35,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public bool IsSucceed()
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
if (loader.Status != BundleLoaderBase.EStatus.Succeed)
|
||||
{
|
||||
|
@ -50,7 +50,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public string GetLastError()
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
if (loader.Status != BundleLoaderBase.EStatus.Succeed)
|
||||
{
|
||||
|
@ -65,7 +65,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public void WaitForAsyncComplete()
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
if (loader.IsDone() == false)
|
||||
loader.WaitForAsyncComplete();
|
||||
|
@ -77,7 +77,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public void Reference()
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
loader.Reference();
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public void Release()
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
loader.Release();
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
internal void GetBundleDebugInfos(List<DebugBundleInfo> output)
|
||||
{
|
||||
foreach (var loader in DependBundles)
|
||||
foreach (var loader in DependList)
|
||||
{
|
||||
var bundleInfo = new DebugBundleInfo();
|
||||
bundleInfo.BundleName = loader.MainBundleInfo.Bundle.BundleName;
|
|
@ -64,7 +64,8 @@ namespace YooAsset
|
|||
if (_steps == ESteps.Download)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
||||
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain);
|
||||
_downloader.SendRequest();
|
||||
_steps = ESteps.CheckDownload;
|
||||
}
|
||||
|
||||
|
@ -92,8 +93,9 @@ namespace YooAsset
|
|||
if (_steps == ESteps.Unpack)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
|
||||
_unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
||||
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||
_unpacker = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain);
|
||||
_unpacker.SendRequest();
|
||||
_steps = ESteps.CheckUnpack;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,11 +47,6 @@ namespace YooAsset
|
|||
_steps = ESteps.Website;
|
||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
||||
}
|
||||
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
|
||||
{
|
||||
_steps = ESteps.CheckFile;
|
||||
FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new System.NotImplementedException(MainBundleInfo.LoadMode.ToString());
|
||||
|
@ -62,7 +57,8 @@ namespace YooAsset
|
|||
if (_steps == ESteps.Download)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
||||
_downloader = DownloadSystem.CreateDownload(MainBundleInfo, failedTryAgain);
|
||||
_downloader.SendRequest();
|
||||
_steps = ESteps.CheckDownload;
|
||||
}
|
||||
|
||||
|
@ -90,8 +86,9 @@ namespace YooAsset
|
|||
if (_steps == ESteps.Website)
|
||||
{
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
|
||||
_website = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
||||
var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
|
||||
_website = DownloadSystem.CreateDownload(bundleInfo, failedTryAgain);
|
||||
_website.SendRequest();
|
||||
_steps = ESteps.CheckWebsite;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal sealed class BundledAllAssetsProvider : ProviderBase
|
||||
{
|
||||
private AssetBundleRequest _cacheRequest;
|
||||
|
||||
public BundledAllAssetsProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo) : base(impl, providerGUID, assetInfo)
|
||||
{
|
||||
}
|
||||
public override void Update()
|
||||
{
|
||||
DebugBeginRecording();
|
||||
|
||||
if (IsDone)
|
||||
return;
|
||||
|
||||
if (Status == EStatus.None)
|
||||
{
|
||||
Status = EStatus.CheckBundle;
|
||||
}
|
||||
|
||||
// 1. 检测资源包
|
||||
if (Status == EStatus.CheckBundle)
|
||||
{
|
||||
if (IsWaitForAsyncComplete)
|
||||
{
|
||||
DependBundles.WaitForAsyncComplete();
|
||||
OwnerBundle.WaitForAsyncComplete();
|
||||
}
|
||||
|
||||
if (DependBundles.IsDone() == false)
|
||||
return;
|
||||
if (OwnerBundle.IsDone() == false)
|
||||
return;
|
||||
|
||||
if (DependBundles.IsSucceed() == false)
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = DependBundles.GetLastError();
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
||||
if (OwnerBundle.Status != BundleLoaderBase.EStatus.Succeed)
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = OwnerBundle.LastError;
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
||||
if (OwnerBundle.CacheBundle == null)
|
||||
{
|
||||
ProcessCacheBundleException();
|
||||
return;
|
||||
}
|
||||
|
||||
Status = EStatus.Loading;
|
||||
}
|
||||
|
||||
// 2. 加载资源对象
|
||||
if (Status == EStatus.Loading)
|
||||
{
|
||||
if (IsWaitForAsyncComplete)
|
||||
{
|
||||
if (MainAssetInfo.AssetType == null)
|
||||
AllAssetObjects = OwnerBundle.CacheBundle.LoadAllAssets();
|
||||
else
|
||||
AllAssetObjects = OwnerBundle.CacheBundle.LoadAllAssets(MainAssetInfo.AssetType);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MainAssetInfo.AssetType == null)
|
||||
_cacheRequest = OwnerBundle.CacheBundle.LoadAllAssetsAsync();
|
||||
else
|
||||
_cacheRequest = OwnerBundle.CacheBundle.LoadAllAssetsAsync(MainAssetInfo.AssetType);
|
||||
}
|
||||
Status = EStatus.Checking;
|
||||
}
|
||||
|
||||
// 3. 检测加载结果
|
||||
if (Status == EStatus.Checking)
|
||||
{
|
||||
if (_cacheRequest != null)
|
||||
{
|
||||
if (IsWaitForAsyncComplete)
|
||||
{
|
||||
// 强制挂起主线程(注意:该操作会很耗时)
|
||||
YooLogger.Warning("Suspend the main thread to load unity asset.");
|
||||
AllAssetObjects = _cacheRequest.allAssets;
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress = _cacheRequest.progress;
|
||||
if (_cacheRequest.isDone == false)
|
||||
return;
|
||||
AllAssetObjects = _cacheRequest.allAssets;
|
||||
}
|
||||
}
|
||||
|
||||
Status = AllAssetObjects == null ? EStatus.Failed : EStatus.Succeed;
|
||||
if (Status == EStatus.Failed)
|
||||
{
|
||||
if (MainAssetInfo.AssetType == null)
|
||||
LastError = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : null AssetBundle : {OwnerBundle.MainBundleInfo.Bundle.BundleName}";
|
||||
else
|
||||
LastError = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType} AssetBundle : {OwnerBundle.MainBundleInfo.Bundle.BundleName}";
|
||||
YooLogger.Error(LastError);
|
||||
}
|
||||
InvokeCompletion();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 9b0e966838827284a9266a9f2237a460
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -28,19 +28,19 @@ namespace YooAsset
|
|||
{
|
||||
if (IsWaitForAsyncComplete)
|
||||
{
|
||||
DependBundleGroup.WaitForAsyncComplete();
|
||||
DependBundles.WaitForAsyncComplete();
|
||||
OwnerBundle.WaitForAsyncComplete();
|
||||
}
|
||||
|
||||
if (DependBundleGroup.IsDone() == false)
|
||||
if (DependBundles.IsDone() == false)
|
||||
return;
|
||||
if (OwnerBundle.IsDone() == false)
|
||||
return;
|
||||
|
||||
if (DependBundleGroup.IsSucceed() == false)
|
||||
if (DependBundles.IsSucceed() == false)
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = DependBundleGroup.GetLastError();
|
||||
LastError = DependBundles.GetLastError();
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
@ -55,12 +55,7 @@ namespace YooAsset
|
|||
|
||||
if (OwnerBundle.CacheBundle == null)
|
||||
{
|
||||
if (OwnerBundle.IsDestroyed)
|
||||
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();
|
||||
ProcessCacheBundleException();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,15 +10,15 @@ namespace YooAsset
|
|||
{
|
||||
public readonly LoadSceneMode SceneMode;
|
||||
private readonly string _sceneName;
|
||||
private readonly bool _activateOnLoad;
|
||||
private readonly bool _suspendLoad;
|
||||
private readonly int _priority;
|
||||
private AsyncOperation _asyncOp;
|
||||
private AsyncOperation _asyncOperation;
|
||||
|
||||
public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(impl, providerGUID, assetInfo)
|
||||
public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, int priority) : base(impl, providerGUID, assetInfo)
|
||||
{
|
||||
SceneMode = sceneMode;
|
||||
_sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath);
|
||||
_activateOnLoad = activateOnLoad;
|
||||
_suspendLoad = suspendLoad;
|
||||
_priority = priority;
|
||||
}
|
||||
public override void Update()
|
||||
|
@ -36,15 +36,15 @@ namespace YooAsset
|
|||
// 1. 检测资源包
|
||||
if (Status == EStatus.CheckBundle)
|
||||
{
|
||||
if (DependBundleGroup.IsDone() == false)
|
||||
if (DependBundles.IsDone() == false)
|
||||
return;
|
||||
if (OwnerBundle.IsDone() == false)
|
||||
return;
|
||||
|
||||
if (DependBundleGroup.IsSucceed() == false)
|
||||
if (DependBundles.IsSucceed() == false)
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = DependBundleGroup.GetLastError();
|
||||
LastError = DependBundles.GetLastError();
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
@ -64,11 +64,11 @@ namespace YooAsset
|
|||
if (Status == EStatus.Loading)
|
||||
{
|
||||
// 注意:如果场景不存在则返回NULL
|
||||
_asyncOp = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode);
|
||||
if (_asyncOp != null)
|
||||
_asyncOperation = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode);
|
||||
if (_asyncOperation != null)
|
||||
{
|
||||
_asyncOp.allowSceneActivation = true;
|
||||
_asyncOp.priority = _priority;
|
||||
_asyncOperation.allowSceneActivation = !_suspendLoad;
|
||||
_asyncOperation.priority = _priority;
|
||||
SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
|
||||
Status = EStatus.Checking;
|
||||
}
|
||||
|
@ -84,12 +84,9 @@ namespace YooAsset
|
|||
// 3. 检测加载结果
|
||||
if (Status == EStatus.Checking)
|
||||
{
|
||||
Progress = _asyncOp.progress;
|
||||
if (_asyncOp.isDone)
|
||||
Progress = _asyncOperation.progress;
|
||||
if (_asyncOperation.isDone)
|
||||
{
|
||||
if (SceneObject.IsValid() && _activateOnLoad)
|
||||
SceneManager.SetActiveScene(SceneObject);
|
||||
|
||||
Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed;
|
||||
if (Status == EStatus.Failed)
|
||||
{
|
||||
|
@ -100,5 +97,17 @@ namespace YooAsset
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解除场景加载挂起操作
|
||||
/// </summary>
|
||||
public bool UnSuspendLoad()
|
||||
{
|
||||
if (_asyncOperation == null)
|
||||
return false;
|
||||
|
||||
_asyncOperation.allowSceneActivation = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,19 +28,19 @@ namespace YooAsset
|
|||
{
|
||||
if (IsWaitForAsyncComplete)
|
||||
{
|
||||
DependBundleGroup.WaitForAsyncComplete();
|
||||
DependBundles.WaitForAsyncComplete();
|
||||
OwnerBundle.WaitForAsyncComplete();
|
||||
}
|
||||
|
||||
if (DependBundleGroup.IsDone() == false)
|
||||
if (DependBundles.IsDone() == false)
|
||||
return;
|
||||
if (OwnerBundle.IsDone() == false)
|
||||
return;
|
||||
|
||||
if (DependBundleGroup.IsSucceed() == false)
|
||||
if (DependBundles.IsSucceed() == false)
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = DependBundleGroup.GetLastError();
|
||||
LastError = DependBundles.GetLastError();
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
@ -53,6 +53,12 @@ namespace YooAsset
|
|||
return;
|
||||
}
|
||||
|
||||
if (OwnerBundle.CacheBundle == null)
|
||||
{
|
||||
ProcessCacheBundleException();
|
||||
return;
|
||||
}
|
||||
|
||||
Status = EStatus.Loading;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal sealed class DatabaseAllAssetsProvider : ProviderBase
|
||||
{
|
||||
public DatabaseAllAssetsProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo) : base(impl, providerGUID, assetInfo)
|
||||
{
|
||||
}
|
||||
public override void Update()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (IsDone)
|
||||
return;
|
||||
|
||||
if (Status == EStatus.None)
|
||||
{
|
||||
// 检测资源文件是否存在
|
||||
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(MainAssetInfo.AssetPath);
|
||||
if (string.IsNullOrEmpty(guid))
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = $"Not found asset : {MainAssetInfo.AssetPath}";
|
||||
YooLogger.Error(LastError);
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
||||
Status = EStatus.CheckBundle;
|
||||
|
||||
// 注意:模拟异步加载效果提前返回
|
||||
if (IsWaitForAsyncComplete == false)
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. 检测资源包
|
||||
if (Status == EStatus.CheckBundle)
|
||||
{
|
||||
if (IsWaitForAsyncComplete)
|
||||
{
|
||||
OwnerBundle.WaitForAsyncComplete();
|
||||
}
|
||||
|
||||
if (OwnerBundle.IsDone() == false)
|
||||
return;
|
||||
|
||||
if (OwnerBundle.Status != BundleLoaderBase.EStatus.Succeed)
|
||||
{
|
||||
Status = EStatus.Failed;
|
||||
LastError = OwnerBundle.LastError;
|
||||
InvokeCompletion();
|
||||
return;
|
||||
}
|
||||
|
||||
Status = EStatus.Loading;
|
||||
}
|
||||
|
||||
// 2. 加载资源对象
|
||||
if (Status == EStatus.Loading)
|
||||
{
|
||||
if (MainAssetInfo.AssetType == null)
|
||||
{
|
||||
List<UnityEngine.Object> result = new List<Object>();
|
||||
foreach (var assetPath in OwnerBundle.MainBundleInfo.IncludeAssets)
|
||||
{
|
||||
UnityEngine.Object mainAsset = UnityEditor.AssetDatabase.LoadMainAssetAtPath(assetPath);
|
||||
if (mainAsset != null)
|
||||
result.Add(mainAsset);
|
||||
}
|
||||
AllAssetObjects = result.ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
List<UnityEngine.Object> result = new List<Object>();
|
||||
foreach (var assetPath in OwnerBundle.MainBundleInfo.IncludeAssets)
|
||||
{
|
||||
UnityEngine.Object mainAsset = UnityEditor.AssetDatabase.LoadAssetAtPath(assetPath, MainAssetInfo.AssetType);
|
||||
if (mainAsset != null)
|
||||
result.Add(mainAsset);
|
||||
}
|
||||
AllAssetObjects = result.ToArray();
|
||||
}
|
||||
Status = EStatus.Checking;
|
||||
}
|
||||
|
||||
// 3. 检测加载结果
|
||||
if (Status == EStatus.Checking)
|
||||
{
|
||||
Status = AllAssetObjects == null ? EStatus.Failed : EStatus.Succeed;
|
||||
if (Status == EStatus.Failed)
|
||||
{
|
||||
if (MainAssetInfo.AssetType == null)
|
||||
LastError = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : null";
|
||||
else
|
||||
LastError = $"Failed to load all assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType}";
|
||||
YooLogger.Error(LastError);
|
||||
}
|
||||
InvokeCompletion();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c72eb6001f903de46bc72dea0d8b39c5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -6,14 +6,14 @@ namespace YooAsset
|
|||
internal sealed class DatabaseSceneProvider : ProviderBase
|
||||
{
|
||||
public readonly LoadSceneMode SceneMode;
|
||||
private readonly bool _activateOnLoad;
|
||||
private readonly bool _suspendLoad;
|
||||
private readonly int _priority;
|
||||
private AsyncOperation _asyncOp;
|
||||
private AsyncOperation _asyncOperation;
|
||||
|
||||
public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad, int priority) : base(impl, providerGUID, assetInfo)
|
||||
public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, int priority) : base(impl, providerGUID, assetInfo)
|
||||
{
|
||||
SceneMode = sceneMode;
|
||||
_activateOnLoad = activateOnLoad;
|
||||
_suspendLoad = suspendLoad;
|
||||
_priority = priority;
|
||||
}
|
||||
public override void Update()
|
||||
|
@ -54,11 +54,11 @@ namespace YooAsset
|
|||
{
|
||||
LoadSceneParameters loadSceneParameters = new LoadSceneParameters();
|
||||
loadSceneParameters.loadSceneMode = SceneMode;
|
||||
_asyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters);
|
||||
if (_asyncOp != null)
|
||||
_asyncOperation = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters);
|
||||
if (_asyncOperation != null)
|
||||
{
|
||||
_asyncOp.allowSceneActivation = true;
|
||||
_asyncOp.priority = _priority;
|
||||
_asyncOperation.allowSceneActivation = !_suspendLoad;
|
||||
_asyncOperation.priority = _priority;
|
||||
SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
|
||||
Status = EStatus.Checking;
|
||||
}
|
||||
|
@ -74,12 +74,9 @@ namespace YooAsset
|
|||
// 3. 检测加载结果
|
||||
if (Status == EStatus.Checking)
|
||||
{
|
||||
Progress = _asyncOp.progress;
|
||||
if (_asyncOp.isDone)
|
||||
{
|
||||
if (SceneObject.IsValid() && _activateOnLoad)
|
||||
SceneManager.SetActiveScene(SceneObject);
|
||||
|
||||
Progress = _asyncOperation.progress;
|
||||
if (_asyncOperation.isDone)
|
||||
{
|
||||
Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed;
|
||||
if (Status == EStatus.Failed)
|
||||
{
|
||||
|
@ -91,5 +88,17 @@ namespace YooAsset
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解除场景加载挂起操作
|
||||
/// </summary>
|
||||
public bool UnSuspendLoad()
|
||||
{
|
||||
if (_asyncOperation == null)
|
||||
return false;
|
||||
|
||||
_asyncOperation.allowSceneActivation = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -91,7 +91,7 @@ namespace YooAsset
|
|||
|
||||
|
||||
protected BundleLoaderBase OwnerBundle { private set; get; }
|
||||
protected DependAssetBundleGroup DependBundleGroup { private set; get; }
|
||||
protected DependAssetBundles DependBundles { private set; get; }
|
||||
protected bool IsWaitForAsyncComplete { private set; get; } = false;
|
||||
private readonly List<OperationHandleBase> _handles = new List<OperationHandleBase>();
|
||||
|
||||
|
@ -109,9 +109,9 @@ namespace YooAsset
|
|||
OwnerBundle.Reference();
|
||||
OwnerBundle.AddProvider(this);
|
||||
|
||||
var dependBundles = impl.CreateDependAssetBundleLoaders(assetInfo);
|
||||
DependBundleGroup = new DependAssetBundleGroup(dependBundles);
|
||||
DependBundleGroup.Reference();
|
||||
var dependList = impl.CreateDependAssetBundleLoaders(assetInfo);
|
||||
DependBundles = new DependAssetBundles(dependList);
|
||||
DependBundles.Reference();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 销毁资源对象
|
||||
/// </summary>
|
||||
public virtual void Destroy()
|
||||
public void Destroy()
|
||||
{
|
||||
IsDestroyed = true;
|
||||
|
||||
|
@ -133,10 +133,26 @@ namespace YooAsset
|
|||
OwnerBundle.Release();
|
||||
OwnerBundle = null;
|
||||
}
|
||||
if (DependBundleGroup != null)
|
||||
if (DependBundles != null)
|
||||
{
|
||||
DependBundleGroup.Release();
|
||||
DependBundleGroup = null;
|
||||
DependBundles.Release();
|
||||
DependBundles = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 销毁资源对象(安全模式)
|
||||
/// </summary>
|
||||
public void DestroySafely()
|
||||
{
|
||||
if (Status == EStatus.Loading || Status == EStatus.Checking)
|
||||
{
|
||||
WaitForAsyncComplete();
|
||||
Destroy();
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,6 +193,8 @@ namespace YooAsset
|
|||
handle = new SceneOperationHandle(this);
|
||||
else if (typeof(T) == typeof(SubAssetsOperationHandle))
|
||||
handle = new SubAssetsOperationHandle(this);
|
||||
else if (typeof(T) == typeof(AllAssetsOperationHandle))
|
||||
handle = new AllAssetsOperationHandle(this);
|
||||
else if (typeof(T) == typeof(RawFileOperationHandle))
|
||||
handle = new RawFileOperationHandle(this);
|
||||
else
|
||||
|
@ -218,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>
|
||||
|
@ -320,7 +362,7 @@ namespace YooAsset
|
|||
DownloadReport result = new DownloadReport();
|
||||
result.TotalSize = (ulong)OwnerBundle.MainBundleInfo.Bundle.FileSize;
|
||||
result.DownloadedBytes = OwnerBundle.DownloadedBytes;
|
||||
foreach (var dependBundle in DependBundleGroup.DependBundles)
|
||||
foreach (var dependBundle in DependBundles.DependList)
|
||||
{
|
||||
result.TotalSize += (ulong)dependBundle.MainBundleInfo.Bundle.FileSize;
|
||||
result.DownloadedBytes += dependBundle.DownloadedBytes;
|
||||
|
@ -340,7 +382,7 @@ namespace YooAsset
|
|||
bundleInfo.Status = OwnerBundle.Status.ToString();
|
||||
output.Add(bundleInfo);
|
||||
|
||||
DependBundleGroup.GetBundleDebugInfos(output);
|
||||
DependBundles.GetBundleDebugInfos(output);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public static void WriteInfoToFile(string filePath, string dataFileCRC, long dataFileSize)
|
||||
{
|
||||
using (FileStream fs = new FileStream(filePath, FileMode.Create))
|
||||
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Read))
|
||||
{
|
||||
SharedBuffer.Clear();
|
||||
SharedBuffer.WriteUTF8(dataFileCRC);
|
||||
|
|
|
@ -10,6 +10,11 @@ namespace YooAsset
|
|||
{
|
||||
private readonly static Dictionary<string, PackageCache> _cachedDic = new Dictionary<string, PackageCache>(1000);
|
||||
|
||||
/// <summary>
|
||||
/// 禁用Unity缓存系统在WebGL平台
|
||||
/// </summary>
|
||||
public static bool DisableUnityCacheOnWebGL = false;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化时的验证级别
|
||||
/// </summary>
|
||||
|
@ -88,7 +93,7 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 验证缓存文件(子线程内操作)
|
||||
/// </summary>
|
||||
public static EVerifyResult VerifyingCacheFile(VerifyCacheElement element)
|
||||
public static EVerifyResult VerifyingCacheFile(VerifyCacheFileElement element)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -120,7 +125,7 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 验证下载文件(子线程内操作)
|
||||
/// </summary>
|
||||
public static EVerifyResult VerifyingTempFile(VerifyTempElement element)
|
||||
public static EVerifyResult VerifyingTempFile(VerifyTempFileElement element)
|
||||
{
|
||||
return VerifyingInternal(element.TempDataFilePath, element.FileSize, element.FileCRC, EVerifyLevel.High);
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 需要验证的元素
|
||||
/// </summary>
|
||||
public readonly List<VerifyCacheElement> VerifyElements = new List<VerifyCacheElement>(5000);
|
||||
public readonly List<VerifyCacheFileElement> VerifyElements = new List<VerifyCacheFileElement>(5000);
|
||||
|
||||
public FindCacheFilesOperation(string packageName)
|
||||
{
|
||||
|
@ -45,7 +45,7 @@ namespace YooAsset
|
|||
{
|
||||
// BundleFiles
|
||||
{
|
||||
string rootPath = PersistentTools.GetCachedBundleFileFolderPath(_packageName);
|
||||
string rootPath = PersistentTools.GetPersistent(_packageName).SandboxCacheBundleFilesRoot;
|
||||
DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
|
||||
if (rootDirectory.Exists)
|
||||
{
|
||||
|
@ -56,7 +56,7 @@ namespace YooAsset
|
|||
|
||||
// RawFiles
|
||||
{
|
||||
string rootPath = PersistentTools.GetCachedRawFileFolderPath(_packageName);
|
||||
string rootPath = PersistentTools.GetPersistent(_packageName).SandboxCacheRawFilesRoot;
|
||||
DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
|
||||
if (rootDirectory.Exists)
|
||||
{
|
||||
|
@ -113,7 +113,7 @@ namespace YooAsset
|
|||
string fileRootPath = chidDirectory.FullName;
|
||||
string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}";
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -161,7 +161,7 @@ namespace YooAsset
|
|||
string fileRootPath = chidDirectory.FullName;
|
||||
string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}{dataFileExtension}";
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace YooAsset
|
|||
{
|
||||
internal abstract class VerifyCacheFilesOperation : AsyncOperationBase
|
||||
{
|
||||
public static VerifyCacheFilesOperation CreateOperation(List<VerifyCacheElement> elements)
|
||||
public static VerifyCacheFilesOperation CreateOperation(List<VerifyCacheFileElement> elements)
|
||||
{
|
||||
#if UNITY_WEBGL
|
||||
var operation = new VerifyCacheFilesWithoutThreadOperation(elements);
|
||||
|
@ -33,8 +33,8 @@ namespace YooAsset
|
|||
}
|
||||
|
||||
private readonly ThreadSyncContext _syncContext = new ThreadSyncContext();
|
||||
private List<VerifyCacheElement> _waitingList;
|
||||
private List<VerifyCacheElement> _verifyingList;
|
||||
private List<VerifyCacheFileElement> _waitingList;
|
||||
private List<VerifyCacheFileElement> _verifyingList;
|
||||
private int _verifyMaxNum;
|
||||
private int _verifyTotalCount;
|
||||
private float _verifyStartTime;
|
||||
|
@ -42,7 +42,7 @@ namespace YooAsset
|
|||
private int _failedCount;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
public VerifyCacheFilesWithThreadOperation(List<VerifyCacheElement> elements)
|
||||
public VerifyCacheFilesWithThreadOperation(List<VerifyCacheFileElement> elements)
|
||||
{
|
||||
_waitingList = elements;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ namespace YooAsset
|
|||
if (_verifyMaxNum < 1)
|
||||
_verifyMaxNum = 1;
|
||||
|
||||
_verifyingList = new List<VerifyCacheElement>(_verifyMaxNum);
|
||||
_verifyingList = new List<VerifyCacheFileElement>(_verifyMaxNum);
|
||||
_steps = ESteps.UpdateVerify;
|
||||
}
|
||||
|
||||
|
@ -114,19 +114,19 @@ namespace YooAsset
|
|||
return 1f;
|
||||
return (float)(_succeedCount + _failedCount) / _verifyTotalCount;
|
||||
}
|
||||
private bool BeginVerifyFileWithThread(VerifyCacheElement element)
|
||||
private bool BeginVerifyFileWithThread(VerifyCacheFileElement element)
|
||||
{
|
||||
return ThreadPool.QueueUserWorkItem(new WaitCallback(VerifyInThread), element);
|
||||
}
|
||||
private void VerifyInThread(object obj)
|
||||
{
|
||||
VerifyCacheElement element = (VerifyCacheElement)obj;
|
||||
VerifyCacheFileElement element = (VerifyCacheFileElement)obj;
|
||||
element.Result = CacheSystem.VerifyingCacheFile(element);
|
||||
_syncContext.Post(VerifyCallback, element);
|
||||
}
|
||||
private void VerifyCallback(object obj)
|
||||
{
|
||||
VerifyCacheElement element = (VerifyCacheElement)obj;
|
||||
VerifyCacheFileElement element = (VerifyCacheFileElement)obj;
|
||||
_verifyingList.Remove(element);
|
||||
|
||||
if (element.Result == EVerifyResult.Succeed)
|
||||
|
@ -158,8 +158,8 @@ namespace YooAsset
|
|||
Done,
|
||||
}
|
||||
|
||||
private List<VerifyCacheElement> _waitingList;
|
||||
private List<VerifyCacheElement> _verifyingList;
|
||||
private List<VerifyCacheFileElement> _waitingList;
|
||||
private List<VerifyCacheFileElement> _verifyingList;
|
||||
private int _verifyMaxNum;
|
||||
private int _verifyTotalCount;
|
||||
private float _verifyStartTime;
|
||||
|
@ -167,7 +167,7 @@ namespace YooAsset
|
|||
private int _failedCount;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
public VerifyCacheFilesWithoutThreadOperation(List<VerifyCacheElement> elements)
|
||||
public VerifyCacheFilesWithoutThreadOperation(List<VerifyCacheFileElement> elements)
|
||||
{
|
||||
_waitingList = elements;
|
||||
}
|
||||
|
@ -189,7 +189,7 @@ namespace YooAsset
|
|||
_verifyMaxNum = fileCount;
|
||||
_verifyTotalCount = fileCount;
|
||||
|
||||
_verifyingList = new List<VerifyCacheElement>(_verifyMaxNum);
|
||||
_verifyingList = new List<VerifyCacheFileElement>(_verifyMaxNum);
|
||||
_steps = ESteps.UpdateVerify;
|
||||
}
|
||||
|
||||
|
@ -229,7 +229,7 @@ namespace YooAsset
|
|||
return 1f;
|
||||
return (float)(_succeedCount + _failedCount) / _verifyTotalCount;
|
||||
}
|
||||
private void BeginVerifyFileWithoutThread(VerifyCacheElement element)
|
||||
private void BeginVerifyFileWithoutThread(VerifyCacheFileElement element)
|
||||
{
|
||||
element.Result = CacheSystem.VerifyingCacheFile(element);
|
||||
if (element.Result == EVerifyResult.Succeed)
|
||||
|
|
|
@ -10,7 +10,7 @@ namespace YooAsset
|
|||
{
|
||||
public EVerifyResult VerifyResult { protected set; get; }
|
||||
|
||||
public static VerifyTempFileOperation CreateOperation(VerifyTempElement element)
|
||||
public static VerifyTempFileOperation CreateOperation(VerifyTempFileElement element)
|
||||
{
|
||||
#if UNITY_WEBGL
|
||||
var operation = new VerifyTempFileWithoutThreadOperation(element);
|
||||
|
@ -34,10 +34,10 @@ namespace YooAsset
|
|||
Done,
|
||||
}
|
||||
|
||||
private readonly VerifyTempElement _element;
|
||||
private readonly VerifyTempFileElement _element;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
public VerifyTempFileWithThreadOperation(VerifyTempElement element)
|
||||
public VerifyTempFileWithThreadOperation(VerifyTempFileElement 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);
|
||||
}
|
||||
private void VerifyInThread(object obj)
|
||||
{
|
||||
VerifyTempElement element = (VerifyTempElement)obj;
|
||||
VerifyTempFileElement element = (VerifyTempFileElement)obj;
|
||||
int result = (int)CacheSystem.VerifyingTempFile(element);
|
||||
element.Result = result;
|
||||
}
|
||||
|
@ -103,10 +103,10 @@ namespace YooAsset
|
|||
Done,
|
||||
}
|
||||
|
||||
private readonly VerifyTempElement _element;
|
||||
private readonly VerifyTempFileElement _element;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
public VerifyTempFileWithoutThreadOperation(VerifyTempElement element)
|
||||
public VerifyTempFileWithoutThreadOperation(VerifyTempFileElement element)
|
||||
{
|
||||
_element = element;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 62ee5fd2821fe85488efff3f8242b703
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -3,84 +3,31 @@ using System.Collections.Generic;
|
|||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal static class PersistentTools
|
||||
internal class PersistentTools
|
||||
{
|
||||
private const string SandboxFolderName = "Sandbox";
|
||||
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;
|
||||
|
||||
private static readonly Dictionary<string, Persistent> _persitentDic = new Dictionary<string, Persistent>(100);
|
||||
|
||||
/// <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>
|
||||
public static string GetPersistentRootPath()
|
||||
public static Persistent GetOrCreatePersistent(string packageName)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
// 注意:为了方便调试查看,编辑器下把存储目录放到项目里
|
||||
if (string.IsNullOrEmpty(_sandboxPath))
|
||||
if (_persitentDic.ContainsKey(packageName) == false)
|
||||
{
|
||||
string projectPath = Path.GetDirectoryName(UnityEngine.Application.dataPath);
|
||||
projectPath = PathUtility.RegularPath(projectPath);
|
||||
_sandboxPath = PathUtility.Combine(projectPath, SandboxFolderName);
|
||||
Persistent persistent = new Persistent(packageName);
|
||||
_persitentDic.Add(packageName, persistent);
|
||||
}
|
||||
#elif UNITY_STANDALONE
|
||||
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);
|
||||
return _persitentDic[packageName];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -100,109 +47,5 @@ namespace YooAsset
|
|||
return path;
|
||||
#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>
|
||||
internal class VerifyCacheElement
|
||||
internal class VerifyCacheFileElement
|
||||
{
|
||||
public string PackageName { private set; get; }
|
||||
public string CacheGUID { private set; get; }
|
||||
|
@ -17,7 +17,7 @@ namespace YooAsset
|
|||
public string DataFileCRC;
|
||||
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;
|
||||
CacheGUID = cacheGUID;
|
||||
|
@ -43,7 +43,7 @@ namespace YooAsset
|
|||
/// <summary>
|
||||
/// 下载文件验证元素
|
||||
/// </summary>
|
||||
internal class VerifyTempElement
|
||||
internal class VerifyTempFileElement
|
||||
{
|
||||
public string TempDataFilePath { private set; get; }
|
||||
public string FileCRC { private set; get; }
|
||||
|
@ -51,7 +51,7 @@ namespace YooAsset
|
|||
|
||||
public int Result = 0; // 注意:原子操作对象
|
||||
|
||||
public VerifyTempElement(string tempDataFilePath, string fileCRC, long fileSize)
|
||||
public VerifyTempFileElement(string tempDataFilePath, string fileCRC, long fileSize)
|
||||
{
|
||||
TempDataFilePath = tempDataFilePath;
|
||||
FileCRC = fileCRC;
|
||||
|
|
|
@ -32,6 +32,11 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public static CertificateHandler CertificateHandlerInstance = null;
|
||||
|
||||
/// <summary>
|
||||
/// 网络重定向次数
|
||||
/// </summary>
|
||||
public static int RedirectLimit { set; get; } = -1;
|
||||
|
||||
/// <summary>
|
||||
/// 启用断点续传功能文件的最小字节数
|
||||
/// </summary>
|
||||
|
@ -93,34 +98,49 @@ namespace YooAsset
|
|||
|
||||
|
||||
/// <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))
|
||||
{
|
||||
return downloader;
|
||||
}
|
||||
|
||||
// 如果资源已经缓存
|
||||
if (CacheSystem.IsCached(bundleInfo.Bundle.PackageName, bundleInfo.Bundle.CacheGUID))
|
||||
{
|
||||
var tempDownloader = new TempDownloader(bundleInfo);
|
||||
return tempDownloader;
|
||||
var completedDownloader = new CompletedDownloader(bundleInfo);
|
||||
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);
|
||||
bool breakDownload = bundleInfo.Bundle.FileSize >= BreakpointResumeFileSize;
|
||||
DownloaderBase newDownloader = new FileDownloader(bundleInfo, breakDownload);
|
||||
newDownloader.SendRequest(failedTryAgain, timeout);
|
||||
DownloaderBase newDownloader = new FileGeneralDownloader(bundleInfo, failedTryAgain, timeout);
|
||||
_downloaderDic.Add(bundleInfo.Bundle.CachedDataFilePath, 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>
|
||||
|
@ -128,11 +148,29 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public static UnityWebRequest NewRequest(string requestURL)
|
||||
{
|
||||
UnityWebRequest webRequest;
|
||||
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);
|
||||
return request;
|
||||
SetUnityWebRequestParam(webRequest);
|
||||
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>
|
||||
|
|
|
@ -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
|
||||
{
|
||||
internal abstract class DownloaderBase
|
||||
{
|
||||
protected enum ESteps
|
||||
public enum EStatus
|
||||
{
|
||||
None,
|
||||
CheckTempFile,
|
||||
WaitingCheckTempFile,
|
||||
PrepareDownload,
|
||||
CreateResumeDownloader,
|
||||
CreateGeneralDownloader,
|
||||
CheckDownload,
|
||||
VerifyTempFile,
|
||||
WaitingVerifyTempFile,
|
||||
CachingFile,
|
||||
TryAgain,
|
||||
None = 0,
|
||||
Succeed,
|
||||
Failed,
|
||||
Failed
|
||||
}
|
||||
|
||||
protected readonly BundleInfo _bundleInfo;
|
||||
|
||||
protected ESteps _steps = ESteps.None;
|
||||
|
||||
protected int _timeout;
|
||||
protected readonly int _timeout;
|
||||
protected int _failedTryAgain;
|
||||
protected int _requestCount;
|
||||
protected string _requestURL;
|
||||
|
||||
protected UnityWebRequest _webRequest;
|
||||
protected EStatus _status = EStatus.None;
|
||||
protected string _lastError = string.Empty;
|
||||
protected long _lastCode = 0;
|
||||
|
||||
// 请求次数
|
||||
protected int _requestCount = 0;
|
||||
protected string _requestURL;
|
||||
|
||||
// 下载进度
|
||||
protected float _downloadProgress = 0f;
|
||||
protected ulong _downloadedBytes = 0;
|
||||
|
||||
// 超时相关
|
||||
protected bool _isAbort = false;
|
||||
protected ulong _latestDownloadBytes;
|
||||
protected float _latestDownloadRealtime;
|
||||
protected float _tryAgainTimer;
|
||||
|
||||
/// <summary>
|
||||
/// 是否等待异步结束
|
||||
/// 警告:只能用于解压APP内部资源
|
||||
|
@ -57,41 +59,31 @@ namespace YooAsset
|
|||
}
|
||||
|
||||
|
||||
public DownloaderBase(BundleInfo bundleInfo)
|
||||
public DownloaderBase(BundleInfo bundleInfo, int failedTryAgain, int timeout)
|
||||
{
|
||||
_bundleInfo = bundleInfo;
|
||||
_failedTryAgain = failedTryAgain;
|
||||
_timeout = timeout;
|
||||
}
|
||||
public void SendRequest(int failedTryAgain, int timeout)
|
||||
{
|
||||
if (_steps == ESteps.None)
|
||||
{
|
||||
_failedTryAgain = failedTryAgain;
|
||||
_timeout = timeout;
|
||||
_steps = ESteps.CheckTempFile;
|
||||
}
|
||||
}
|
||||
public abstract void SendRequest(params object[] param);
|
||||
public abstract void Update();
|
||||
public abstract void Abort();
|
||||
|
||||
/// <summary>
|
||||
/// 获取网络请求地址
|
||||
/// 获取下载文件的大小
|
||||
/// </summary>
|
||||
protected string GetRequestURL()
|
||||
/// <returns></returns>
|
||||
public long GetDownloadFileSize()
|
||||
{
|
||||
// 轮流返回请求地址
|
||||
_requestCount++;
|
||||
if (_requestCount % 2 == 0)
|
||||
return _bundleInfo.RemoteFallbackURL;
|
||||
else
|
||||
return _bundleInfo.RemoteMainURL;
|
||||
return _bundleInfo.Bundle.FileSize;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取资源包信息
|
||||
/// 获取下载文件的资源包名
|
||||
/// </summary>
|
||||
public BundleInfo GetBundleInfo()
|
||||
public string GetDownloadBundleName()
|
||||
{
|
||||
return _bundleInfo;
|
||||
return _bundleInfo.Bundle.BundleName;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -99,7 +91,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public bool IsDone()
|
||||
{
|
||||
return _steps == ESteps.Succeed || _steps == ESteps.Failed;
|
||||
return _status == EStatus.Succeed || _status == EStatus.Failed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -107,7 +99,7 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public bool HasError()
|
||||
{
|
||||
return _steps == ESteps.Failed;
|
||||
return _status == EStatus.Failed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -133,5 +125,69 @@ namespace YooAsset
|
|||
{
|
||||
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
|
||||
{
|
||||
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 UnityWebRequest _webRequest = null;
|
||||
private DownloadHandlerFileRange _downloadHandle = null;
|
||||
private VerifyTempFileOperation _checkFileOp = null;
|
||||
private VerifyTempFileOperation _verifyFileOp = null;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
// 重置变量
|
||||
private bool _isAbort = false;
|
||||
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;
|
||||
}
|
||||
public override void SendRequest(params object[] param)
|
||||
{
|
||||
if (_steps == ESteps.None)
|
||||
{
|
||||
_steps = ESteps.CheckTempFile;
|
||||
}
|
||||
}
|
||||
public override void Update()
|
||||
{
|
||||
if (_steps == ESteps.None)
|
||||
|
@ -39,7 +58,7 @@ namespace YooAsset
|
|||
// 检测临时文件
|
||||
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);
|
||||
OperationSystem.StartOperation(_checkFileOp);
|
||||
_steps = ESteps.WaitingCheckTempFile;
|
||||
|
@ -75,45 +94,21 @@ namespace YooAsset
|
|||
// 重置变量
|
||||
_downloadProgress = 0f;
|
||||
_downloadedBytes = 0;
|
||||
|
||||
// 重置变量
|
||||
_isAbort = false;
|
||||
_fileOriginLength = 0;
|
||||
_latestDownloadBytes = 0;
|
||||
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||
_tryAgainTimer = 0f;
|
||||
_fileOriginLength = 0;
|
||||
|
||||
// 获取请求地址
|
||||
_requestURL = GetRequestURL();
|
||||
|
||||
if (_breakResume)
|
||||
_steps = ESteps.CreateResumeDownloader;
|
||||
else
|
||||
_steps = ESteps.CreateGeneralDownloader;
|
||||
_steps = ESteps.CreateDownloader;
|
||||
}
|
||||
|
||||
// 创建普通的下载器
|
||||
if (_steps == ESteps.CreateGeneralDownloader)
|
||||
{
|
||||
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)
|
||||
// 创建下载器
|
||||
if (_steps == ESteps.CreateDownloader)
|
||||
{
|
||||
long fileLength = -1;
|
||||
if (File.Exists(_tempFilePath))
|
||||
|
@ -137,13 +132,6 @@ namespace YooAsset
|
|||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||
if (fileLength > 0)
|
||||
_webRequest.SetRequestHeader("Range", $"bytes={fileLength}-");
|
||||
|
||||
if (DownloadSystem.CertificateHandlerInstance != null)
|
||||
{
|
||||
_webRequest.certificateHandler = DownloadSystem.CertificateHandlerInstance;
|
||||
_webRequest.disposeCertificateHandlerOnDispose = false;
|
||||
}
|
||||
|
||||
_webRequest.SendWebRequest();
|
||||
_steps = ESteps.CheckDownload;
|
||||
}
|
||||
|
@ -181,24 +169,15 @@ namespace YooAsset
|
|||
// 如果网络异常
|
||||
if (hasError)
|
||||
{
|
||||
if (_breakResume)
|
||||
// 注意:下载断点续传文件发生特殊错误码之后删除文件
|
||||
if (DownloadSystem.ClearFileResponseCodes != null)
|
||||
{
|
||||
// 注意:下载断点续传文件发生特殊错误码之后删除文件
|
||||
if (DownloadSystem.ClearFileResponseCodes != null)
|
||||
if (DownloadSystem.ClearFileResponseCodes.Contains(_webRequest.responseCode))
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -207,14 +186,14 @@ namespace YooAsset
|
|||
_steps = ESteps.VerifyTempFile;
|
||||
}
|
||||
|
||||
// 释放下载器
|
||||
// 最终释放下载器
|
||||
DisposeWebRequest();
|
||||
}
|
||||
|
||||
// 验证下载文件
|
||||
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);
|
||||
OperationSystem.StartOperation(_verifyFileOp);
|
||||
_steps = ESteps.WaitingVerifyTempFile;
|
||||
|
@ -248,29 +227,11 @@ namespace YooAsset
|
|||
{
|
||||
try
|
||||
{
|
||||
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);
|
||||
|
||||
CachingFile(_tempFilePath);
|
||||
_status = EStatus.Succeed;
|
||||
_steps = ESteps.Done;
|
||||
_lastError = string.Empty;
|
||||
_lastCode = 0;
|
||||
_steps = ESteps.Succeed;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -285,7 +246,8 @@ namespace YooAsset
|
|||
if (_failedTryAgain <= 0)
|
||||
{
|
||||
ReportError();
|
||||
_steps = ESteps.Failed;
|
||||
_status = EStatus.Failed;
|
||||
_steps = ESteps.Done;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -303,33 +265,14 @@ namespace YooAsset
|
|||
{
|
||||
if (IsDone() == false)
|
||||
{
|
||||
_steps = ESteps.Failed;
|
||||
_status = EStatus.Failed;
|
||||
_steps = ESteps.Done;
|
||||
_lastError = "user abort";
|
||||
_lastCode = 0;
|
||||
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()
|
||||
{
|
||||
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.Generic;
|
||||
using UnityEngine.Networking;
|
||||
using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
/// <summary>
|
||||
/// 下载器
|
||||
/// 说明:UnityWebRequest(UWR) supports reading streaming assets since 2017.1
|
||||
/// </summary>
|
||||
internal class UnityWebDataRequester
|
||||
internal class UnityWebDataRequester : UnityWebRequesterBase
|
||||
{
|
||||
private UnityWebRequest _webRequest;
|
||||
private UnityWebRequestAsyncOperation _operationHandle;
|
||||
|
||||
/// <summary>
|
||||
/// 请求URL地址
|
||||
/// </summary>
|
||||
public string URL { private set; get; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发送GET请求
|
||||
/// </summary>
|
||||
/// <param name="timeout">超时:从请求开始计时</param>
|
||||
public void SendRequest(string url, int timeout = 0)
|
||||
public void SendRequest(string url, int timeout = 60)
|
||||
{
|
||||
if (_webRequest == null)
|
||||
{
|
||||
URL = url;
|
||||
ResetTimeout(timeout);
|
||||
|
||||
_webRequest = DownloadSystem.NewRequest(URL);
|
||||
DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
|
||||
_webRequest.downloadHandler = handler;
|
||||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||
_webRequest.timeout = timeout;
|
||||
_operationHandle = _webRequest.SendWebRequest();
|
||||
}
|
||||
}
|
||||
|
@ -59,65 +47,5 @@ namespace YooAsset
|
|||
else
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// 下载器
|
||||
/// 说明:UnityWebRequest(UWR) supports reading streaming assets since 2017.1
|
||||
/// </summary>
|
||||
internal class UnityWebFileRequester
|
||||
internal class UnityWebFileRequester : UnityWebRequesterBase
|
||||
{
|
||||
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>
|
||||
/// 发送GET请求
|
||||
/// </summary>
|
||||
public void SendRequest(string url, string savePath, float timeout = 60)
|
||||
public void SendRequest(string url, string fileSavePath, int timeout = 60)
|
||||
{
|
||||
if (_webRequest == null)
|
||||
{
|
||||
URL = url;
|
||||
_timeout = timeout;
|
||||
_latestDownloadBytes = 0;
|
||||
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
||||
ResetTimeout(timeout);
|
||||
|
||||
_webRequest = DownloadSystem.NewRequest(URL);
|
||||
DownloadHandlerFile handler = new DownloadHandlerFile(savePath);
|
||||
DownloadHandlerFile handler = new DownloadHandlerFile(fileSavePath);
|
||||
handler.removeFileOnAbort = true;
|
||||
_webRequest.downloadHandler = handler;
|
||||
_webRequest.disposeDownloadHandlerOnDispose = true;
|
||||
_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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
HostPlayMode,
|
||||
|
||||
/// <summary>
|
||||
/// WebGL运行模式
|
||||
/// </summary>
|
||||
WebPlayMode,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -27,17 +32,23 @@ namespace YooAsset
|
|||
/// </summary>
|
||||
public abstract class InitializeParameters
|
||||
{
|
||||
/// <summary>
|
||||
/// 资源定位地址大小写不敏感
|
||||
/// 注意:默认值为False
|
||||
/// </summary>
|
||||
public bool LocationToLower = false;
|
||||
|
||||
/// <summary>
|
||||
/// 文件解密服务接口
|
||||
/// </summary>
|
||||
public IDecryptionServices DecryptionServices = null;
|
||||
|
||||
/// <summary>
|
||||
/// 内置文件的根路径
|
||||
/// 注意:当参数为空的时候会使用默认的根目录。
|
||||
/// </summary>
|
||||
public string BuildinRootDirectory = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 沙盒文件的根路径
|
||||
/// 注意:当参数为空的时候会使用默认的根目录。
|
||||
/// </summary>
|
||||
public string SandboxRootDirectory = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 资源加载每帧处理的最大时间片段
|
||||
/// 注意:默认值为MaxValue
|
||||
|
@ -75,18 +86,29 @@ namespace YooAsset
|
|||
public class HostPlayModeParameters : InitializeParameters
|
||||
{
|
||||
/// <summary>
|
||||
/// 默认的资源服务器下载地址
|
||||
/// 内置资源查询服务接口
|
||||
/// </summary>
|
||||
public string DefaultHostServer = string.Empty;
|
||||
public IQueryServices QueryServices = null;
|
||||
|
||||
/// <summary>
|
||||
/// 备用的资源服务器下载地址
|
||||
/// 远端资源地址查询服务类
|
||||
/// </summary>
|
||||
public string FallbackHostServer = string.Empty;
|
||||
public IRemoteServices RemoteServices = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// WebGL运行模式的初始化参数
|
||||
/// </summary>
|
||||
public class WebPlayModeParameters : InitializeParameters
|
||||
{
|
||||
/// <summary>
|
||||
/// 内置资源查询服务接口
|
||||
/// </summary>
|
||||
public IQueryServices QueryServices = null;
|
||||
|
||||
/// <summary>
|
||||
/// 远端资源地址查询服务类
|
||||
/// </summary>
|
||||
public IRemoteServices RemoteServices = null;
|
||||
}
|
||||
}
|
|
@ -26,9 +26,9 @@ namespace YooAsset
|
|||
public string RemoteFallbackURL { private set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 编辑器资源路径
|
||||
/// 注意:该字段只用于帮助编辑器下的模拟模式。
|
||||
/// </summary>
|
||||
public string EditorAssetPath { private set; get; }
|
||||
public string[] IncludeAssets;
|
||||
|
||||
|
||||
private BundleInfo()
|
||||
|
@ -40,15 +40,6 @@ namespace YooAsset
|
|||
LoadMode = loadMode;
|
||||
RemoteMainURL = mainURL;
|
||||
RemoteFallbackURL = fallbackURL;
|
||||
EditorAssetPath = string.Empty;
|
||||
}
|
||||
public BundleInfo(PackageBundle bundle, ELoadMode loadMode, string editorAssetPath)
|
||||
{
|
||||
Bundle = bundle;
|
||||
LoadMode = loadMode;
|
||||
RemoteMainURL = string.Empty;
|
||||
RemoteFallbackURL = string.Empty;
|
||||
EditorAssetPath = editorAssetPath;
|
||||
}
|
||||
public BundleInfo(PackageBundle bundle, ELoadMode loadMode)
|
||||
{
|
||||
|
@ -56,10 +47,8 @@ namespace YooAsset
|
|||
LoadMode = loadMode;
|
||||
RemoteMainURL = string.Empty;
|
||||
RemoteFallbackURL = string.Empty;
|
||||
EditorAssetPath = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 是否为JAR包内文件
|
||||
/// </summary>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue