diff --git a/Assets/YooAsset/CHANGELOG.md b/Assets/YooAsset/CHANGELOG.md
index b985db8..8e37c30 100644
--- a/Assets/YooAsset/CHANGELOG.md
+++ b/Assets/YooAsset/CHANGELOG.md
@@ -2,6 +2,271 @@
All notable changes to this package will be documented in this file.
+## [1.4.11] - 2023-04-14
+
+### Fixed
+
+- (#97)修复了着色器变种收集配置无法保存的问题。
+- (#83)修复了资源收集界面Package列表没有实时刷新的问题。
+- (#48)优化了场景卸载机制,在切换场景的时候不在主动卸载资源。
+
+### Changed
+
+- 增加了扩展属性
+
+ ```c#
+ [assembly: InternalsVisibleTo("YooAsset.EditorExtension")]
+ [assembly: InternalsVisibleTo("YooAsset.RuntimeExtension")]
+ ```
+
+## [1.4.10] - 2023-04-08
+
+### Fixed
+
+- 修复了资源文件路径无效导致异常的问题。
+- 修复了原生文件不支持ini格式文件的问题。
+- 修复了通过代码途径导入XML配置的报错问题。
+
+## [1.4.9] - 2023-03-29
+
+### Fixed
+
+- 修复了资源配置界面的GroupActiveRule保存无效的问题。
+
+### Changed
+
+- 优化了资源配置导入逻辑,增加了对XML配置文件的合法性检测。
+
+- 优化了UniTask的说明文档。
+
+- 调整构建的输出目录结构。
+
+- 调试窗口增加分屏功能。(Unity2020.3+起效)
+
+- 报告窗口增加分屏功能。(Unity2020.3+起效)
+
+- 编辑器模拟模式支持了虚拟资源包。
+
+- 扩展了Instantiate方法。
+
+ ```c#
+ public sealed class AssetOperationHandle
+ {
+ public GameObject InstantiateSync();
+ public GameObject InstantiateSync(Transform parent);
+ public GameObject InstantiateSync(Transform parent, bool worldPositionStays);
+ public GameObject InstantiateSync(Vector3 position, Quaternion rotation);
+ public GameObject InstantiateSync(Vector3 position, Quaternion rotation, Transform parent);
+ }
+ ```
+
+### Added
+
+- 优化了报告文件内容,增加了资源包内嵌的资源列表。
+
+- 可寻址规则增加了AddressByFilePath类。
+
+- 新增了新方法。
+
+ ```c#
+ ///
+ /// 向远端请求并更新清单
+ ///
+ public class UpdatePackageManifestOperation : AsyncOperationBase
+ {
+ ///
+ /// 保存当前清单的版本,用于下次启动时自动加载的版本。
+ ///
+ public void SavePackageVersion();
+ }
+ ```
+
+- 新增了初始化参数。
+
+ ```c#
+ ///
+ /// 下载失败尝试次数
+ /// 注意:默认值为MaxValue
+ ///
+ public int DownloadFailedTryAgain = int.MaxValue;
+ ```
+
+- 新增了初始化参数。
+
+ ```c#
+ ///
+ /// 资源加载每帧处理的最大时间片段
+ /// 注意:默认值为MaxValue
+ ///
+ public long LoadingMaxTimeSlice = long.MaxValue;
+ ```
+
+### Removed
+
+- 移除了代码里的Patch敏感字。
+
+ ```c#
+ //PatchManifest.cs重命名为PackageManifest.cs
+ //AssetsPackage.cs重命名为ResourcePackage.cs
+ //YooAssets.CreateAssetsPackage()重命名为YooAssets.CreatePackage()
+ //YooAssets.GetAssetsPackage()重命名为YooAssets.GetPackage()
+ //YooAssets.TryGetAssetsPackage()重命名为YooAssets.TryGetPackage()
+ //YooAssets.HasAssetsPackage()重命名为YooAssets.HasPackage()
+ ```
+
+- 移除了初始化参数:AssetLoadingMaxNumber
+
+## [1.4.8] - 2023-03-10
+
+### Fixed
+
+- 修复了同步加载原生文件,程序卡死的问题。
+- 修复了可编程构建管线,当项目里没有着色器,如果有引用内置着色器会导致打包失败的问题。
+- 修复了在Unity2021.3版本下着色器收集界面错乱的问题。
+
+### Changed
+
+- 优化了打包逻辑,提高构建速度。
+
+- 支持自定义日志处理,方便收集线上问题。
+
+ ```c#
+ public class YooAssets
+ {
+ ///
+ /// 初始化资源系统
+ ///
+ /// 自定义日志处理
+ public static void Initialize(ILogger logger = null)
+ }
+ ```
+
+## [1.4.7] - 2023-03-03
+
+### Fixed
+
+- 修复了在运行时资源引用链无效的问题。
+- 修复了在构建过程中发生异常后进度条未消失的问题。
+- 修复了使用SBP构建管线,如果有原生文件会导致打包失败的问题。
+
+### Changed
+
+- 支持自定义下载请求
+
+ ```c#
+ ///
+ /// 设置下载系统参数,自定义下载请求
+ ///
+ public static void SetDownloadSystemUnityWebRequest(DownloadRequestDelegate requestDelegate)
+ ```
+
+- 优化了打包时资源包引用关系计算的逻辑。
+
+- 优化了缓存系统初始化逻辑,支持分帧获取所有缓存文件。
+
+- 优化了缓存系统的存储目录结构,提高了文件夹查询速度。
+
+- 优化了在资源收集界面,点击查看Collector主资源列表卡顿问题。
+
+- 优化了资源对象加载耗时统计的逻辑,现在更加准确了。
+
+- 优化了资源加载器查询逻辑。
+
+- 优化了资源下载系统,下载文件的验证支持了多线程。
+
+- 着色器变种收集界面增加单次照射数量的控制。
+
+## [1.4.6-preview] - 2023-02-22
+
+### Changed
+
+- EVerifyLevel新增Middle级别。
+
+ ```c#
+ public enum EVerifyLevel
+ {
+ ///
+ /// 验证文件存在
+ ///
+ Low,
+
+ ///
+ /// 验证文件大小
+ ///
+ Middle,
+
+ ///
+ /// 验证文件大小和CRC
+ ///
+ High,
+ }
+ ```
+
+- 补丁清单的资源包列表新增引用链。
+
+ (解决复杂依赖关系下,错误卸载资源包的问题)
+
+- 缓存系统支持后缀格式存储。
+
+ (解决原生文件没有后缀格式的问题)
+
+- 收集界面增加用户自定义数据栏。
+
+## [1.4.5-preview] - 2023-02-17
+
+### Fixed
+
+- (#67)修复了报告查看界面在Unity2021.3上的兼容性问题。
+- (#66)修复了在Unity2021.3上编辑器模拟模式运行报错的问题。
+
+### Changed
+
+- 接口变更:IPackRule
+
+ ````c#
+ ///
+ /// 资源打包规则接口
+ ///
+ public interface IPackRule
+ {
+ ///
+ /// 获取打包规则结果
+ ///
+ PackRuleResult GetPackRuleResult(PackRuleData data);
+
+ ///
+ /// 是否为原生文件打包规则
+ ///
+ bool IsRawFilePackRule();
+ }
+ ````
+
+## [1.4.4-preview] - 2023-02-14
+
+### Fixed
+
+- (#65)修复了AssetBundle构建宏逻辑错误。
+- 修复了AssetBundle加载宏逻辑错误。
+
+## [1.4.3-preview] - 2023-02-10
+
+全新的缓存系统!
+
+### Fixed
+
+- 修复了WebGL平台本地文件验证报错。
+- 修复了WEBGL平台加载原生文件失败的问题。
+- 修复了通过Handle句柄查询资源包下载进度为零的问题。
+
+### Changed
+
+- 着色器变种收集增加分批次处理功能。
+- Unity2021版本开始不再支持内置构建管线。
+
+### Removed
+
+- 太空战机DEMO移除了BetterStreamingAssets插件。
+
## [1.4.2-preview] - 2023-01-03
### Fixed
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilder.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilder.cs
index ca3b3e0..88b82e0 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilder.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilder.cs
@@ -39,12 +39,6 @@ namespace YooAsset.Editor
var buildParametersContext = new BuildParametersContext(buildParameters);
_buildContext.SetContextObject(buildParametersContext);
- // 是否显示LOG
- if (buildParameters.BuildMode == EBuildMode.SimulateBuild)
- BuildRunner.EnableLog = false;
- else
- BuildRunner.EnableLog = true;
-
// 创建构建节点
List pipeline;
if (buildParameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
@@ -54,12 +48,13 @@ namespace YooAsset.Editor
new TaskPrepare(), //前期准备工作
new TaskGetBuildMap(), //获取构建列表
new TaskBuilding(), //开始执行构建
+ new TaskCopyRawFile(), //拷贝原生文件
new TaskVerifyBuildResult(), //验证构建结果
new TaskEncryption(), //加密资源文件
- new TaskUpdateBuildInfo(), //更新构建信息
- new TaskCreatePatchManifest(), //创建清单文件
+ new TaskUpdateBundleInfo(), //更新资源包信息
+ new TaskCreateManifest(), //创建清单文件
new TaskCreateReport(), //创建报告文件
- new TaskCreatePatchPackage(), //制作补丁包
+ new TaskCreatePackage(), //制作包裹
new TaskCopyBuildinFiles(), //拷贝内置文件
};
}
@@ -70,12 +65,13 @@ namespace YooAsset.Editor
new TaskPrepare(), //前期准备工作
new TaskGetBuildMap(), //获取构建列表
new TaskBuilding_SBP(), //开始执行构建
+ new TaskCopyRawFile(), //拷贝原生文件
new TaskVerifyBuildResult_SBP(), //验证构建结果
new TaskEncryption(), //加密资源文件
- new TaskUpdateBuildInfo(), //更新构建信息
- new TaskCreatePatchManifest(), //创建清单文件
+ new TaskUpdateBundleInfo(), //更新补丁信息
+ new TaskCreateManifest(), //创建清单文件
new TaskCreateReport(), //创建报告文件
- new TaskCreatePatchPackage(), //制作补丁包
+ new TaskCreatePackage(), //制作补丁包
new TaskCopyBuildinFiles(), //拷贝内置文件
};
}
@@ -84,19 +80,23 @@ namespace YooAsset.Editor
throw new NotImplementedException();
}
+ // 初始化日志
+ BuildLogger.InitLogger(buildParameters.EnableLog);
+
// 执行构建流程
var buildResult = BuildRunner.Run(pipeline, _buildContext);
if (buildResult.Success)
{
buildResult.OutputPackageDirectory = buildParametersContext.GetPackageOutputDirectory();
- Debug.Log($"{buildParameters.BuildMode} pipeline build succeed !");
+ BuildLogger.Log($"{buildParameters.BuildMode} pipeline build succeed !");
}
else
{
- Debug.LogWarning($"{buildParameters.BuildMode} pipeline build failed !");
- Debug.LogError($"Build task failed : {buildResult.FailedTask}");
- Debug.LogError($"Build task error : {buildResult.FailedInfo}");
+ BuildLogger.Warning($"{buildParameters.BuildMode} pipeline build failed !");
+ BuildLogger.Error($"Build task failed : {buildResult.FailedTask}");
+ BuildLogger.Error($"Build task error : {buildResult.FailedInfo}");
}
+
return buildResult;
}
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs
index 963b771..ab0f933 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderHelper.cs
@@ -58,14 +58,5 @@ namespace YooAsset.Editor
}
}
}
-
- ///
- /// 获取构建管线的输出目录
- ///
- public static string MakePipelineOutputDirectory(string outputRoot, string buildPackage, BuildTarget buildTarget, EBuildMode buildMode)
- {
- string outputDirectory = $"{outputRoot}/{buildPackage}/{buildTarget}/{YooAssetSettings.OutputFolderName}";
- return outputDirectory;
- }
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSettingData.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSettingData.cs
index 9412292..353931b 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSettingData.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSettingData.cs
@@ -29,7 +29,7 @@ namespace YooAsset.Editor
///
private static void LoadSettingData()
{
- _setting = EditorHelper.LoadSettingData();
+ _setting = SettingLoader.LoadSettingData();
}
///
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs
index 2d854ac..9e4b8ea 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs
@@ -14,7 +14,7 @@ namespace YooAsset.Editor
[MenuItem("YooAsset/AssetBundle Builder", false, 102)]
public static void ShowExample()
{
- AssetBundleBuilderWindow window = GetWindow("资源包构建工具", true, EditorDefine.DockedWindowTypes);
+ AssetBundleBuilderWindow window = GetWindow("资源包构建工具", true, WindowsDefine.DockedWindowTypes);
window.minSize = new Vector2(800, 600);
}
@@ -42,7 +42,7 @@ namespace YooAsset.Editor
VisualElement root = this.rootVisualElement;
// 加载布局文件
- var visualAsset = EditorHelper.LoadWindowUXML();
+ var visualAsset = UxmlLoader.LoadWindowUXML();
if (visualAsset == null)
return;
@@ -60,7 +60,7 @@ namespace YooAsset.Editor
// 加密服务类
_encryptionServicesClassTypes = GetEncryptionServicesClassTypes();
- _encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.FullName).ToList();
+ _encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.Name).ToList();
// 输出目录
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
@@ -220,15 +220,27 @@ namespace YooAsset.Editor
private void RefreshWindow()
{
+ var buildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
var buildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
var copyOption = AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption;
bool enableElement = buildMode == EBuildMode.ForceRebuild;
bool tagsFiledVisible = copyOption == ECopyBuildinFileOption.ClearAndCopyByTags || copyOption == ECopyBuildinFileOption.OnlyCopyByTags;
- _encryptionField.SetEnabled(enableElement);
- _compressionField.SetEnabled(enableElement);
- _outputNameStyleField.SetEnabled(enableElement);
- _copyBuildinFileOptionField.SetEnabled(enableElement);
- _copyBuildinFileTagsField.SetEnabled(enableElement);
+
+ if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
+ {
+ _compressionField.SetEnabled(enableElement);
+ _outputNameStyleField.SetEnabled(enableElement);
+ _copyBuildinFileOptionField.SetEnabled(enableElement);
+ _copyBuildinFileTagsField.SetEnabled(enableElement);
+ }
+ else
+ {
+ _compressionField.SetEnabled(true);
+ _outputNameStyleField.SetEnabled(true);
+ _copyBuildinFileOptionField.SetEnabled(true);
+ _copyBuildinFileTagsField.SetEnabled(true);
+ }
+
_copyBuildinFileTagsField.visible = tagsFiledVisible;
}
private void SaveBtn_clicked()
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleSimulateBuilder.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleSimulateBuilder.cs
index e9d4df7..9a89843 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleSimulateBuilder.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/AssetBundleSimulateBuilder.cs
@@ -18,6 +18,7 @@ namespace YooAsset.Editor
buildParameters.BuildMode = EBuildMode.SimulateBuild;
buildParameters.PackageName = packageName;
buildParameters.PackageVersion = "Simulate";
+ buildParameters.EnableLog = false;
AssetBundleBuilder builder = new AssetBundleBuilder();
var buildResult = builder.Run(buildParameters);
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs
index dd21a6e..7999f92 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs
@@ -7,8 +7,6 @@ namespace YooAsset.Editor
{
public class BuildAssetInfo
{
- private string _mainBundleName;
- private string _shareBundleName;
private bool _isAddAssetTags = false;
private readonly HashSet _referenceBundleNames = new HashSet();
@@ -17,6 +15,11 @@ namespace YooAsset.Editor
///
public ECollectorType CollectorType { private set; get; }
+ ///
+ /// 资源包完整名称
+ ///
+ public string BundleName { private set; get; }
+
///
/// 可寻址地址
///
@@ -54,10 +57,10 @@ namespace YooAsset.Editor
public List AllDependAssetInfos { private set; get; }
- public BuildAssetInfo(ECollectorType collectorType, string mainBundleName, string address, string assetPath, bool isRawAsset)
+ public BuildAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, bool isRawAsset)
{
- _mainBundleName = mainBundleName;
CollectorType = collectorType;
+ BundleName = bundleName;
Address = address;
AssetPath = assetPath;
IsRawAsset = isRawAsset;
@@ -133,24 +136,12 @@ namespace YooAsset.Editor
///
public bool HasBundleName()
{
- string bundleName = GetBundleName();
- if (string.IsNullOrEmpty(bundleName))
+ if (string.IsNullOrEmpty(BundleName))
return false;
else
return true;
}
- ///
- /// 获取资源包名称
- ///
- public string GetBundleName()
- {
- if (CollectorType == ECollectorType.None)
- return _shareBundleName;
- else
- return _mainBundleName;
- }
-
///
/// 添加关联的资源包名称
///
@@ -164,53 +155,32 @@ namespace YooAsset.Editor
}
///
- /// 计算主资源或共享资源的完整包名
+ /// 计算共享资源包的完整包名
///
- public void CalculateFullBundleName(bool uniqueBundleName, string packageName)
+ public void CalculateShareBundleName(bool uniqueBundleName, string packageName, string shadersBundleName)
{
- if (CollectorType == ECollectorType.None)
+ if (CollectorType != ECollectorType.None)
+ return;
+
+ if (IsRawAsset)
+ throw new Exception("Should never get here !");
+
+ if (IsShaderAsset)
{
- if (IsRawAsset)
- throw new Exception("Should never get here !");
-
- if (IsShaderAsset)
- {
- _shareBundleName = YooAssetSettingsData.GetUnityShadersBundleFullName(uniqueBundleName, packageName);
- }
- else
- {
- if (_referenceBundleNames.Count > 1)
- {
- IPackRule packRule = PackDirectory.StaticPackRule;
- var bundleName = packRule.GetBundleName(new PackRuleData(AssetPath));
- if (YooAssetSettingsData.Setting.RegularBundleName)
- bundleName = EditorTools.GetRegularPath(bundleName).Replace('/', '_').Replace('.', '_').ToLower();
- else
- bundleName = EditorTools.GetRegularPath(bundleName).ToLower();
-
- if (uniqueBundleName)
- _shareBundleName = $"{packageName.ToLower()}_share_{bundleName}.{YooAssetSettingsData.Setting.AssetBundleFileVariant}";
- else
- _shareBundleName = $"share_{bundleName}.{YooAssetSettingsData.Setting.AssetBundleFileVariant}";
- }
- }
+ BundleName = shadersBundleName;
}
else
{
- if (IsRawAsset)
+ if (_referenceBundleNames.Count > 1)
{
- string mainBundleName = $"{_mainBundleName}.{YooAssetSettingsData.Setting.RawFileVariant}";
- _mainBundleName = mainBundleName.ToLower();
+ IPackRule packRule = PackDirectory.StaticPackRule;
+ PackRuleResult packRuleResult = packRule.GetPackRuleResult(new PackRuleData(AssetPath));
+ BundleName = packRuleResult.GetShareBundleName(packageName, uniqueBundleName);
}
else
{
- string mainBundleName = $"{_mainBundleName}.{YooAssetSettingsData.Setting.AssetBundleFileVariant}";
- _mainBundleName = mainBundleName.ToLower(); ;
- }
-
- if (uniqueBundleName)
- {
- _mainBundleName = $"{packageName.ToLower()}_{_mainBundleName}";
+ // 注意:被引用次数小于1的资源不需要设置资源包名称
+ BundleName = string.Empty;
}
}
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs
index 9663de4..4063069 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs
@@ -8,7 +8,7 @@ namespace YooAsset.Editor
{
public class BuildBundleInfo
{
- public class BuildPatchInfo
+ public class InfoWrapper
{
///
/// 构建内容的哈希值
@@ -18,17 +18,17 @@ namespace YooAsset.Editor
///
/// 文件哈希值
///
- public string PatchFileHash { set; get; }
+ public string FileHash { set; get; }
///
/// 文件哈希值
///
- public string PatchFileCRC { set; get; }
+ public string FileCRC { set; get; }
///
/// 文件哈希值
///
- public long PatchFileSize { set; get; }
+ public long FileSize { set; get; }
///
@@ -39,7 +39,7 @@ namespace YooAsset.Editor
///
/// 补丁包输出文件路径
///
- public string PatchOutputFilePath { set; get; }
+ public string PackageOutputFilePath { set; get; }
}
///
@@ -51,12 +51,12 @@ namespace YooAsset.Editor
/// 参与构建的资源列表
/// 注意:不包含零依赖资源
///
- public readonly List BuildinAssets = new List();
+ public readonly List AllMainAssets = new List();
///
/// 补丁文件信息
///
- public readonly BuildPatchInfo PatchInfo = new BuildPatchInfo();
+ public readonly InfoWrapper BundleInfo = new InfoWrapper();
///
/// Bundle文件的加载方法
@@ -76,9 +76,9 @@ namespace YooAsset.Editor
{
get
{
- foreach (var asset in BuildinAssets)
+ foreach (var assetInfo in AllMainAssets)
{
- if (asset.IsRawAsset)
+ if (assetInfo.IsRawAsset)
return true;
}
return false;
@@ -113,7 +113,7 @@ namespace YooAsset.Editor
if (IsContainsAsset(assetInfo.AssetPath))
throw new System.Exception($"Asset is existed : {assetInfo.AssetPath}");
- BuildinAssets.Add(assetInfo);
+ AllMainAssets.Add(assetInfo);
}
///
@@ -121,7 +121,7 @@ namespace YooAsset.Editor
///
public bool IsContainsAsset(string assetPath)
{
- foreach (var assetInfo in BuildinAssets)
+ foreach (var assetInfo in AllMainAssets)
{
if (assetInfo.AssetPath == assetPath)
{
@@ -136,8 +136,8 @@ namespace YooAsset.Editor
///
public string[] GetBundleTags()
{
- List result = new List(BuildinAssets.Count);
- foreach (var assetInfo in BuildinAssets)
+ List result = new List(AllMainAssets.Count);
+ foreach (var assetInfo in AllMainAssets)
{
foreach (var assetTag in assetInfo.BundleTags)
{
@@ -148,20 +148,43 @@ namespace YooAsset.Editor
return result.ToArray();
}
+ ///
+ /// 获取该资源包内的所有资源(包括零依赖资源)
+ ///
+ public List GetAllBuiltinAssetPaths()
+ {
+ var packAssets = GetAllMainAssetPaths();
+ List result = new List(packAssets);
+ foreach (var assetInfo in AllMainAssets)
+ {
+ if (assetInfo.AllDependAssetInfos == null)
+ continue;
+ foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
+ {
+ if (dependAssetInfo.HasBundleName() == false)
+ {
+ if (result.Contains(dependAssetInfo.AssetPath) == false)
+ result.Add(dependAssetInfo.AssetPath);
+ }
+ }
+ }
+ return result;
+ }
+
///
/// 获取构建的资源路径列表
///
- public string[] GetBuildinAssetPaths()
+ public string[] GetAllMainAssetPaths()
{
- return BuildinAssets.Select(t => t.AssetPath).ToArray();
+ return AllMainAssets.Select(t => t.AssetPath).ToArray();
}
///
/// 获取所有写入补丁清单的资源
///
- public BuildAssetInfo[] GetAllPatchAssetInfos()
+ public BuildAssetInfo[] GetAllMainAssetInfos()
{
- return BuildinAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
+ return AllMainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
}
///
@@ -173,24 +196,24 @@ namespace YooAsset.Editor
AssetBundleBuild build = new AssetBundleBuild();
build.assetBundleName = BundleName;
build.assetBundleVariant = string.Empty;
- build.assetNames = GetBuildinAssetPaths();
+ build.assetNames = GetAllMainAssetPaths();
return build;
}
///
- /// 创建PatchBundle类
+ /// 创建PackageBundle类
///
- internal PatchBundle CreatePatchBundle()
+ internal PackageBundle CreatePackageBundle()
{
- PatchBundle patchBundle = new PatchBundle();
- patchBundle.BundleName = BundleName;
- patchBundle.FileHash = PatchInfo.PatchFileHash;
- patchBundle.FileCRC = PatchInfo.PatchFileCRC;
- patchBundle.FileSize = PatchInfo.PatchFileSize;
- patchBundle.IsRawFile = IsRawFile;
- patchBundle.LoadMethod = (byte)LoadMethod;
- patchBundle.Tags = GetBundleTags();
- return patchBundle;
+ PackageBundle packageBundle = new PackageBundle();
+ packageBundle.BundleName = BundleName;
+ packageBundle.FileHash = BundleInfo.FileHash;
+ packageBundle.FileCRC = BundleInfo.FileCRC;
+ packageBundle.FileSize = BundleInfo.FileSize;
+ packageBundle.IsRawFile = IsRawFile;
+ packageBundle.LoadMethod = (byte)LoadMethod;
+ packageBundle.Tags = GetBundleTags();
+ return packageBundle;
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs
index effc561..e28666f 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs
@@ -8,6 +8,8 @@ namespace YooAsset.Editor
{
public class BuildMapContext : IContextObject
{
+ private readonly Dictionary _bundleInfoDic = new Dictionary(10000);
+
///
/// 参与构建的资源总数
/// 说明:包括主动收集的资源以及其依赖的所有资源
@@ -25,9 +27,20 @@ namespace YooAsset.Editor
public bool UniqueBundleName;
///
- /// 资源包列表
+ /// 着色器统一的全名称
///
- public readonly List BundleInfos = new List(1000);
+ public string ShadersBundleName;
+
+ ///
+ /// 资源包信息列表
+ ///
+ public Dictionary.ValueCollection Collection
+ {
+ get
+ {
+ return _bundleInfoDic.Values;
+ }
+ }
///
@@ -35,11 +48,11 @@ namespace YooAsset.Editor
///
public void PackAsset(BuildAssetInfo assetInfo)
{
- string bundleName = assetInfo.GetBundleName();
+ string bundleName = assetInfo.BundleName;
if (string.IsNullOrEmpty(bundleName))
throw new Exception("Should never get here !");
- if (TryGetBundleInfo(bundleName, out BuildBundleInfo bundleInfo))
+ if (_bundleInfoDic.TryGetValue(bundleName, out BuildBundleInfo bundleInfo))
{
bundleInfo.PackAsset(assetInfo);
}
@@ -47,33 +60,28 @@ namespace YooAsset.Editor
{
BuildBundleInfo newBundleInfo = new BuildBundleInfo(bundleName);
newBundleInfo.PackAsset(assetInfo);
- BundleInfos.Add(newBundleInfo);
+ _bundleInfoDic.Add(bundleName, newBundleInfo);
}
}
///
- /// 获取所有的打包资源
+ /// 是否包含资源包
///
- public List GetAllAssets()
+ public bool IsContainsBundle(string bundleName)
{
- List result = new List(BundleInfos.Count);
- foreach (var bundleInfo in BundleInfos)
- {
- result.AddRange(bundleInfo.BuildinAssets);
- }
- return result;
+ return _bundleInfoDic.ContainsKey(bundleName);
}
///
- /// 获取AssetBundle内构建的资源路径列表
+ /// 获取资源包信息,如果没找到返回NULL
///
- public string[] GetBuildinAssetPaths(string bundleName)
+ public BuildBundleInfo GetBundleInfo(string bundleName)
{
- if (TryGetBundleInfo(bundleName, out BuildBundleInfo bundleInfo))
+ if (_bundleInfoDic.TryGetValue(bundleName, out BuildBundleInfo result))
{
- return bundleInfo.GetBuildinAssetPaths();
+ return result;
}
- throw new Exception($"Not found {nameof(BuildBundleInfo)} : {bundleName}");
+ throw new Exception($"Not found bundle : {bundleName}");
}
///
@@ -81,8 +89,8 @@ namespace YooAsset.Editor
///
public UnityEditor.AssetBundleBuild[] GetPipelineBuilds()
{
- List builds = new List(BundleInfos.Count);
- foreach (var bundleInfo in BundleInfos)
+ List builds = new List(_bundleInfoDic.Count);
+ foreach (var bundleInfo in _bundleInfoDic.Values)
{
if (bundleInfo.IsRawFile == false)
builds.Add(bundleInfo.CreatePipelineBuild());
@@ -91,25 +99,15 @@ namespace YooAsset.Editor
}
///
- /// 是否包含资源包
+ /// 创建着色器信息类
///
- public bool IsContainsBundle(string bundleName)
+ public void CreateShadersBundleInfo(string shadersBundleName)
{
- return TryGetBundleInfo(bundleName, out BuildBundleInfo bundleInfo);
- }
-
- public bool TryGetBundleInfo(string bundleName, out BuildBundleInfo result)
- {
- foreach (var bundleInfo in BundleInfos)
+ if (IsContainsBundle(shadersBundleName) == false)
{
- if (bundleInfo.BundleName == bundleName)
- {
- result = bundleInfo;
- return true;
- }
+ var shaderBundleInfo = new BuildBundleInfo(shadersBundleName);
+ _bundleInfoDic.Add(shadersBundleName, shaderBundleInfo);
}
- result = null;
- return false;
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs
deleted file mode 100644
index bf783d3..0000000
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-using System;
-using System.Linq;
-using System.Collections;
-using System.Collections.Generic;
-
-namespace YooAsset.Editor
-{
- public static class BuildMapCreater
- {
- ///
- /// 执行资源构建上下文
- ///
- public static BuildMapContext CreateBuildMap(EBuildMode buildMode, string packageName)
- {
- BuildMapContext context = new BuildMapContext();
- Dictionary buildAssetDic = new Dictionary(1000);
-
- // 1. 检测配置合法性
- AssetBundleCollectorSettingData.Setting.CheckConfigError();
-
- // 2. 获取所有收集器收集的资源
- var buildResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(buildMode, packageName);
- List allCollectAssets = buildResult.CollectAssets;
-
- // 3. 剔除未被引用的依赖资源
- List removeDependList = new List();
- foreach (var collectAssetInfo in allCollectAssets)
- {
- if (collectAssetInfo.CollectorType == ECollectorType.DependAssetCollector)
- {
- if (IsRemoveDependAsset(allCollectAssets, collectAssetInfo.AssetPath))
- removeDependList.Add(collectAssetInfo);
- }
- }
- foreach (var removeValue in removeDependList)
- {
- allCollectAssets.Remove(removeValue);
- }
-
- // 4. 录入所有收集器收集的资源
- foreach (var collectAssetInfo in allCollectAssets)
- {
- if (buildAssetDic.ContainsKey(collectAssetInfo.AssetPath) == false)
- {
- var buildAssetInfo = new BuildAssetInfo(collectAssetInfo.CollectorType, collectAssetInfo.BundleName,
- collectAssetInfo.Address, collectAssetInfo.AssetPath, collectAssetInfo.IsRawAsset);
- buildAssetInfo.AddAssetTags(collectAssetInfo.AssetTags);
- buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
- buildAssetDic.Add(collectAssetInfo.AssetPath, buildAssetInfo);
- }
- else
- {
- throw new Exception($"Should never get here !");
- }
- }
-
- // 5. 录入相关依赖的资源
- foreach (var collectAssetInfo in allCollectAssets)
- {
- foreach (var dependAssetPath in collectAssetInfo.DependAssets)
- {
- if (buildAssetDic.ContainsKey(dependAssetPath))
- {
- buildAssetDic[dependAssetPath].AddBundleTags(collectAssetInfo.AssetTags);
- buildAssetDic[dependAssetPath].AddReferenceBundleName(collectAssetInfo.BundleName);
- }
- else
- {
- var buildAssetInfo = new BuildAssetInfo(dependAssetPath);
- buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
- buildAssetInfo.AddReferenceBundleName(collectAssetInfo.BundleName);
- buildAssetDic.Add(dependAssetPath, buildAssetInfo);
- }
- }
- }
-
- // 6. 记录关键信息
- context.AssetFileCount = buildAssetDic.Count;
- context.EnableAddressable = buildResult.EnableAddressable;
- context.UniqueBundleName = buildResult.UniqueBundleName;
-
- // 7. 填充主动收集资源的依赖列表
- foreach (var collectAssetInfo in allCollectAssets)
- {
- var dependAssetInfos = new List(collectAssetInfo.DependAssets.Count);
- foreach (var dependAssetPath in collectAssetInfo.DependAssets)
- {
- if (buildAssetDic.TryGetValue(dependAssetPath, out BuildAssetInfo value))
- dependAssetInfos.Add(value);
- else
- throw new Exception("Should never get here !");
- }
- buildAssetDic[collectAssetInfo.AssetPath].SetAllDependAssetInfos(dependAssetInfos);
- }
-
- // 8. 计算完整的资源包名
- foreach (KeyValuePair pair in buildAssetDic)
- {
- pair.Value.CalculateFullBundleName(buildResult.UniqueBundleName, buildResult.PackageName);
- }
-
- // 9. 移除不参与构建的资源
- List removeBuildList = new List();
- foreach (KeyValuePair pair in buildAssetDic)
- {
- var buildAssetInfo = pair.Value;
- if (buildAssetInfo.HasBundleName() == false)
- removeBuildList.Add(buildAssetInfo);
- }
- foreach (var removeValue in removeBuildList)
- {
- buildAssetDic.Remove(removeValue.AssetPath);
- }
-
- // 10. 构建资源包
- var allBuildinAssets = buildAssetDic.Values.ToList();
- if (allBuildinAssets.Count == 0)
- throw new Exception("构建的资源列表不能为空");
- foreach (var assetInfo in allBuildinAssets)
- {
- context.PackAsset(assetInfo);
- }
- return context;
- }
- private static bool IsRemoveDependAsset(List allCollectAssets, string dependAssetPath)
- {
- foreach (var collectAssetInfo in allCollectAssets)
- {
- var collectorType = collectAssetInfo.CollectorType;
- if (collectorType == ECollectorType.MainAssetCollector || collectorType == ECollectorType.StaticAssetCollector)
- {
- if (collectAssetInfo.DependAssets.Contains(dependAssetPath))
- return false;
- }
- }
-
- BuildRunner.Log($"发现未被依赖的资源并自动移除 : {dependAssetPath}");
- return true;
- }
- }
-}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs
index d1ab9d6..3c324c7 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs
@@ -67,6 +67,11 @@ namespace YooAsset.Editor
public string PackageVersion;
+ ///
+ /// 是否显示普通日志
+ ///
+ public bool EnableLog = true;
+
///
/// 验证构建结果
///
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParametersContext.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParametersContext.cs
index d751f33..5774c93 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParametersContext.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParametersContext.cs
@@ -7,8 +7,6 @@ namespace YooAsset.Editor
{
public class BuildParametersContext : IContextObject
{
- private readonly System.Diagnostics.Stopwatch _buildWatch = new System.Diagnostics.Stopwatch();
-
private string _pipelineOutputDirectory = string.Empty;
private string _packageOutputDirectory = string.Empty;
@@ -31,7 +29,7 @@ namespace YooAsset.Editor
{
if (string.IsNullOrEmpty(_pipelineOutputDirectory))
{
- _pipelineOutputDirectory = AssetBundleBuilderHelper.MakePipelineOutputDirectory(Parameters.OutputRoot, Parameters.PackageName, Parameters.BuildTarget, Parameters.BuildMode);
+ _pipelineOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{YooAssetSettings.OutputFolderName}";
}
return _pipelineOutputDirectory;
}
@@ -43,7 +41,7 @@ namespace YooAsset.Editor
{
if (string.IsNullOrEmpty(_packageOutputDirectory))
{
- _packageOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.PackageName}/{Parameters.BuildTarget}/{Parameters.PackageVersion}";
+ _packageOutputDirectory = $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{Parameters.PackageVersion}";
}
return _packageOutputDirectory;
}
@@ -117,22 +115,5 @@ namespace YooAsset.Editor
return buildParams;
}
-
- ///
- /// 获取构建的耗时(单位:秒)
- ///
- public float GetBuildingSeconds()
- {
- float seconds = _buildWatch.ElapsedMilliseconds / 1000f;
- return seconds;
- }
- public void BeginWatch()
- {
- _buildWatch.Start();
- }
- public void StopWatch()
- {
- _buildWatch.Stop();
- }
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs
index c34828a..a4339ee 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildReport/ReportBundleInfo.cs
@@ -48,6 +48,16 @@ namespace YooAsset.Editor
///
public string[] Tags;
+ ///
+ /// 引用该资源包的ID列表
+ ///
+ public int[] ReferenceIDs;
+
+ ///
+ /// 该资源包内包含的所有资源
+ ///
+ public List AllBuiltinAssets = new List();
+
///
/// 获取资源分类标签的字符串
///
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildLogger.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildLogger.cs
new file mode 100644
index 0000000..2d6026c
--- /dev/null
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildLogger.cs
@@ -0,0 +1,33 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace YooAsset.Editor
+{
+ public static class BuildLogger
+ {
+ private static bool _enableLog = true;
+
+ public static void InitLogger(bool enableLog)
+ {
+ _enableLog = enableLog;
+ }
+
+ public static void Log(string message)
+ {
+ if (_enableLog)
+ {
+ Debug.Log(message);
+ }
+ }
+ public static void Warning(string message)
+ {
+ Debug.LogWarning(message);
+ }
+ public static void Error(string message)
+ {
+ Debug.LogError(message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledProvider.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildLogger.cs.meta
similarity index 83%
rename from Assets/YooAsset/Runtime/AssetSystem/Provider/BundledProvider.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildLogger.cs.meta
index 1fd4db3..8fad97d 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledProvider.cs.meta
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildLogger.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 4eacb00a7e3873740b599112dfcf0123
+guid: 2bc82466a51f50141975e4424095aa09
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildRunner.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildRunner.cs
index 9fb013c..9cc3e67 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildRunner.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildRunner.cs
@@ -2,13 +2,19 @@
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
+using System.Diagnostics;
using UnityEngine;
namespace YooAsset.Editor
{
public class BuildRunner
{
- public static bool EnableLog = true;
+ private static Stopwatch _buildWatch;
+
+ ///
+ /// 总耗时
+ ///
+ public static int TotalSeconds = 0;
///
/// 执行构建流程
@@ -23,17 +29,28 @@ namespace YooAsset.Editor
BuildResult buildResult = new BuildResult();
buildResult.Success = true;
+ TotalSeconds = 0;
for (int i = 0; i < pipeline.Count; i++)
{
IBuildTask task = pipeline[i];
try
{
+ _buildWatch = Stopwatch.StartNew();
var taskAttribute = task.GetType().GetCustomAttribute();
- Log($"---------------------------------------->{taskAttribute.Desc}<---------------------------------------");
+ if (taskAttribute != null)
+ BuildLogger.Log($"---------------------------------------->{taskAttribute.Desc}<---------------------------------------");
task.Run(context);
+ _buildWatch.Stop();
+
+ // 统计耗时
+ int seconds = GetBuildSeconds();
+ TotalSeconds += seconds;
+ if (taskAttribute != null)
+ BuildLogger.Log($"{taskAttribute.Desc}耗时:{seconds}秒");
}
catch (Exception e)
{
+ EditorTools.ClearProgressBar();
buildResult.FailedTask = task.GetType().Name;
buildResult.FailedInfo = e.ToString();
buildResult.Success = false;
@@ -42,26 +59,14 @@ namespace YooAsset.Editor
}
// 返回运行结果
+ BuildLogger.Log($"构建过程总计耗时:{TotalSeconds}秒");
return buildResult;
}
- ///
- /// 日志输出
- ///
- public static void Log(string info)
+ private static int GetBuildSeconds()
{
- if (EnableLog)
- {
- UnityEngine.Debug.Log(info);
- }
- }
-
- ///
- /// 日志输出
- ///
- public static void Info(string info)
- {
- UnityEngine.Debug.Log(info);
+ float seconds = _buildWatch.ElapsedMilliseconds / 1000f;
+ return (int)seconds;
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding.cs
index 87ed746..da267bd 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding.cs
@@ -41,36 +41,10 @@ namespace YooAsset.Editor
throw new Exception("构建过程中发生严重错误!请查阅上下文日志!");
}
- BuildRunner.Log("Unity引擎打包成功!");
+ BuildLogger.Log("Unity引擎打包成功!");
BuildResultContext buildResultContext = new BuildResultContext();
buildResultContext.UnityManifest = buildResults;
context.SetContextObject(buildResultContext);
-
- // 拷贝原生文件
- if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
- {
- CopyRawBundle(buildMapContext, buildParametersContext);
- }
- }
-
- ///
- /// 拷贝原生文件
- ///
- private void CopyRawBundle(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext)
- {
- string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
- foreach (var bundleInfo in buildMapContext.BundleInfos)
- {
- if (bundleInfo.IsRawFile)
- {
- string dest = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
- foreach (var buildAsset in bundleInfo.BuildinAssets)
- {
- if (buildAsset.IsRawAsset)
- EditorTools.CopyFile(buildAsset.AssetPath, dest, true);
- }
- }
- }
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs
index d17ee14..bb69ae2 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs
@@ -33,44 +33,26 @@ namespace YooAsset.Editor
// 开始构建
IBundleBuildResults buildResults;
var buildParameters = buildParametersContext.GetSBPBuildParameters();
- var shadersBunldeName = YooAssetSettingsData.GetUnityShadersBundleFullName(buildMapContext.UniqueBundleName, buildParametersContext.Parameters.PackageName);
- var taskList = SBPBuildTasks.Create(shadersBunldeName);
+ var taskList = SBPBuildTasks.Create(buildMapContext.ShadersBundleName);
ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
if (exitCode < 0)
{
throw new Exception($"构建过程中发生错误 : {exitCode}");
}
- BuildRunner.Log("Unity引擎打包成功!");
+ // 创建着色器信息
+ // 说明:解决因为着色器资源包导致验证失败。
+ // 例如:当项目里没有着色器,如果有依赖内置着色器就会验证失败。
+ string shadersBundleName = buildMapContext.ShadersBundleName;
+ if (buildResults.BundleInfos.ContainsKey(shadersBundleName))
+ {
+ buildMapContext.CreateShadersBundleInfo(shadersBundleName);
+ }
+
+ BuildLogger.Log("Unity引擎打包成功!");
BuildResultContext buildResultContext = new BuildResultContext();
buildResultContext.Results = buildResults;
context.SetContextObject(buildResultContext);
-
- // 拷贝原生文件
- if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
- {
- CopyRawBundle(buildMapContext, buildParametersContext);
- }
- }
-
- ///
- /// 拷贝原生文件
- ///
- private void CopyRawBundle(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext)
- {
- string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
- foreach (var bundleInfo in buildMapContext.BundleInfos)
- {
- if (bundleInfo.IsRawFile)
- {
- string dest = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
- foreach (var buildAsset in bundleInfo.BuildinAssets)
- {
- if (buildAsset.IsRawAsset)
- EditorTools.CopyFile(buildAsset.AssetPath, dest, true);
- }
- }
- }
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyBuildinFiles.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyBuildinFiles.cs
index 20b883d..fcb8a38 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyBuildinFiles.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyBuildinFiles.cs
@@ -12,13 +12,13 @@ namespace YooAsset.Editor
void IBuildTask.Run(BuildContext context)
{
var buildParametersContext = context.GetContextObject();
- var patchManifestContext = context.GetContextObject();
+ var manifestContext = context.GetContextObject();
var buildMode = buildParametersContext.Parameters.BuildMode;
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
{
if (buildParametersContext.Parameters.CopyBuildinFileOption != ECopyBuildinFileOption.None)
{
- CopyBuildinFilesToStreaming(buildParametersContext, patchManifestContext);
+ CopyBuildinFilesToStreaming(buildParametersContext, manifestContext);
}
}
}
@@ -26,7 +26,7 @@ namespace YooAsset.Editor
///
/// 拷贝首包资源文件
///
- private void CopyBuildinFilesToStreaming(BuildParametersContext buildParametersContext, PatchManifestContext patchManifestContext)
+ private void CopyBuildinFilesToStreaming(BuildParametersContext buildParametersContext, ManifestContext manifestContext)
{
ECopyBuildinFileOption option = buildParametersContext.Parameters.CopyBuildinFileOption;
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
@@ -35,7 +35,7 @@ namespace YooAsset.Editor
string buildPackageVersion = buildParametersContext.Parameters.PackageVersion;
// 加载补丁清单
- PatchManifest patchManifest = patchManifestContext.Manifest;
+ PackageManifest manifest = manifestContext.Manifest;
// 清空流目录
if (option == ECopyBuildinFileOption.ClearAndCopyAll || option == ECopyBuildinFileOption.ClearAndCopyByTags)
@@ -70,10 +70,10 @@ namespace YooAsset.Editor
// 拷贝文件列表(所有文件)
if (option == ECopyBuildinFileOption.ClearAndCopyAll || option == ECopyBuildinFileOption.OnlyCopyAll)
{
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- string sourcePath = $"{packageOutputDirectory}/{patchBundle.FileName}";
- string destPath = $"{streamingAssetsDirectory}/{patchBundle.FileName}";
+ string sourcePath = $"{packageOutputDirectory}/{packageBundle.FileName}";
+ string destPath = $"{streamingAssetsDirectory}/{packageBundle.FileName}";
EditorTools.CopyFile(sourcePath, destPath, true);
}
}
@@ -82,19 +82,19 @@ namespace YooAsset.Editor
if (option == ECopyBuildinFileOption.ClearAndCopyByTags || option == ECopyBuildinFileOption.OnlyCopyByTags)
{
string[] tags = buildParametersContext.Parameters.CopyBuildinFileTags.Split(';');
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- if (patchBundle.HasTag(tags) == false)
+ if (packageBundle.HasTag(tags) == false)
continue;
- string sourcePath = $"{packageOutputDirectory}/{patchBundle.FileName}";
- string destPath = $"{streamingAssetsDirectory}/{patchBundle.FileName}";
+ string sourcePath = $"{packageOutputDirectory}/{packageBundle.FileName}";
+ string destPath = $"{streamingAssetsDirectory}/{packageBundle.FileName}";
EditorTools.CopyFile(sourcePath, destPath, true);
}
}
// 刷新目录
AssetDatabase.Refresh();
- BuildRunner.Log($"内置文件拷贝完成:{streamingAssetsDirectory}");
+ BuildLogger.Log($"内置文件拷贝完成:{streamingAssetsDirectory}");
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyRawFile.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyRawFile.cs
new file mode 100644
index 0000000..661af52
--- /dev/null
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyRawFile.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace YooAsset.Editor
+{
+ [TaskAttribute("拷贝原生文件")]
+ public class TaskCopyRawFile : IBuildTask
+ {
+ void IBuildTask.Run(BuildContext context)
+ {
+ var buildParametersContext = context.GetContextObject();
+ var buildParameters = context.GetContextObject();
+ var buildMapContext = context.GetContextObject();
+
+ var buildMode = buildParameters.Parameters.BuildMode;
+ if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
+ {
+ CopyRawBundle(buildMapContext, buildParametersContext);
+ }
+ }
+
+ ///
+ /// 拷贝原生文件
+ ///
+ private void CopyRawBundle(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext)
+ {
+ string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
+ foreach (var bundleInfo in buildMapContext.Collection)
+ {
+ if (bundleInfo.IsRawFile)
+ {
+ string dest = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
+ foreach (var assetInfo in bundleInfo.AllMainAssets)
+ {
+ if (assetInfo.IsRawAsset)
+ EditorTools.CopyFile(assetInfo.AssetPath, dest, true);
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyRawFile.cs.meta
similarity index 83%
rename from Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyRawFile.cs.meta
index 8827383..a803fb3 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs.meta
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCopyRawFile.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: e9274735f1f14af4b893c21a4240b816
+guid: 3625d4b8b5b79324ebf7ec19a87677e7
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateManifest.cs
new file mode 100644
index 0000000..310e36f
--- /dev/null
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateManifest.cs
@@ -0,0 +1,368 @@
+using System;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+
+using UnityEditor.Build.Pipeline;
+using UnityEditor.Build.Pipeline.Interfaces;
+
+namespace YooAsset.Editor
+{
+ public class ManifestContext : IContextObject
+ {
+ internal PackageManifest Manifest;
+ }
+
+ [TaskAttribute("创建清单文件")]
+ public class TaskCreateManifest : IBuildTask
+ {
+ void IBuildTask.Run(BuildContext context)
+ {
+ CreateManifestFile(context);
+ }
+
+ ///
+ /// 创建补丁清单文件到输出目录
+ ///
+ private void CreateManifestFile(BuildContext context)
+ {
+ var buildMapContext = context.GetContextObject();
+ var buildParametersContext = context.GetContextObject();
+ var buildParameters = buildParametersContext.Parameters;
+ string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
+
+ // 创建新补丁清单
+ PackageManifest manifest = new PackageManifest();
+ manifest.FileVersion = YooAssetSettings.ManifestFileVersion;
+ manifest.EnableAddressable = buildMapContext.EnableAddressable;
+ manifest.OutputNameStyle = (int)buildParameters.OutputNameStyle;
+ manifest.PackageName = buildParameters.PackageName;
+ manifest.PackageVersion = buildParameters.PackageVersion;
+ manifest.BundleList = GetAllPackageBundle(context);
+ manifest.AssetList = GetAllPackageAsset(context, manifest);
+
+ // 更新Unity内置资源包的引用关系
+ if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
+ {
+ if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
+ {
+ var buildResultContext = context.GetContextObject();
+ UpdateBuiltInBundleReference(manifest, buildResultContext, buildMapContext.ShadersBundleName);
+ }
+ }
+
+ // 更新资源包之间的引用关系
+ if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
+ {
+ if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
+ {
+ var buildResultContext = context.GetContextObject();
+ UpdateScriptPipelineReference(manifest, buildResultContext);
+ }
+ }
+
+ // 更新资源包之间的引用关系
+ if (buildParameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
+ {
+ if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
+ {
+ var buildResultContext = context.GetContextObject();
+ UpdateBuiltinPipelineReference(manifest, buildResultContext);
+ }
+ }
+
+ // 创建补丁清单文本文件
+ {
+ string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion);
+ string filePath = $"{packageOutputDirectory}/{fileName}";
+ ManifestTools.SerializeToJson(filePath, manifest);
+ BuildLogger.Log($"创建补丁清单文件:{filePath}");
+ }
+
+ // 创建补丁清单二进制文件
+ string packageHash;
+ {
+ string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
+ string filePath = $"{packageOutputDirectory}/{fileName}";
+ ManifestTools.SerializeToBinary(filePath, manifest);
+ packageHash = HashUtility.FileMD5(filePath);
+ BuildLogger.Log($"创建补丁清单文件:{filePath}");
+
+ ManifestContext manifestContext = new ManifestContext();
+ byte[] bytesData = FileUtility.ReadAllBytes(filePath);
+ manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData);
+ context.SetContextObject(manifestContext);
+ }
+
+ // 创建补丁清单哈希文件
+ {
+ string fileName = YooAssetSettingsData.GetPackageHashFileName(buildParameters.PackageName, buildParameters.PackageVersion);
+ string filePath = $"{packageOutputDirectory}/{fileName}";
+ FileUtility.CreateFile(filePath, packageHash);
+ BuildLogger.Log($"创建补丁清单哈希文件:{filePath}");
+ }
+
+ // 创建补丁清单版本文件
+ {
+ string fileName = YooAssetSettingsData.GetPackageVersionFileName(buildParameters.PackageName);
+ string filePath = $"{packageOutputDirectory}/{fileName}";
+ FileUtility.CreateFile(filePath, buildParameters.PackageVersion);
+ BuildLogger.Log($"创建补丁清单版本文件:{filePath}");
+ }
+ }
+
+ ///
+ /// 获取资源包列表
+ ///
+ private List GetAllPackageBundle(BuildContext context)
+ {
+ var buildMapContext = context.GetContextObject();
+
+ List result = new List(1000);
+ foreach (var bundleInfo in buildMapContext.Collection)
+ {
+ var packageBundle = bundleInfo.CreatePackageBundle();
+ result.Add(packageBundle);
+ }
+ return result;
+ }
+
+ ///
+ /// 获取资源列表
+ ///
+ private List GetAllPackageAsset(BuildContext context, PackageManifest manifest)
+ {
+ var buildMapContext = context.GetContextObject();
+
+ List result = new List(1000);
+ foreach (var bundleInfo in buildMapContext.Collection)
+ {
+ var assetInfos = bundleInfo.GetAllMainAssetInfos();
+ foreach (var assetInfo in assetInfos)
+ {
+ PackageAsset packageAsset = new PackageAsset();
+ if (buildMapContext.EnableAddressable)
+ packageAsset.Address = assetInfo.Address;
+ else
+ packageAsset.Address = string.Empty;
+ packageAsset.AssetPath = assetInfo.AssetPath;
+ packageAsset.AssetTags = assetInfo.AssetTags.ToArray();
+ packageAsset.BundleID = GetAssetBundleID(assetInfo.BundleName, manifest);
+ packageAsset.DependIDs = GetAssetBundleDependIDs(packageAsset.BundleID, assetInfo, manifest);
+ result.Add(packageAsset);
+ }
+ }
+ return result;
+ }
+ private int[] GetAssetBundleDependIDs(int mainBundleID, BuildAssetInfo assetInfo, PackageManifest manifest)
+ {
+ List result = new List();
+ foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
+ {
+ if (dependAssetInfo.HasBundleName())
+ {
+ int bundleID = GetAssetBundleID(dependAssetInfo.BundleName, manifest);
+ if (mainBundleID != bundleID)
+ {
+ if (result.Contains(bundleID) == false)
+ result.Add(bundleID);
+ }
+ }
+ }
+ return result.ToArray();
+ }
+ private int GetAssetBundleID(string bundleName, PackageManifest manifest)
+ {
+ for (int index = 0; index < manifest.BundleList.Count; index++)
+ {
+ if (manifest.BundleList[index].BundleName == bundleName)
+ return index;
+ }
+ throw new Exception($"Not found bundle name : {bundleName}");
+ }
+
+ ///
+ /// 更新Unity内置资源包的引用关系
+ ///
+ private void UpdateBuiltInBundleReference(PackageManifest manifest, TaskBuilding_SBP.BuildResultContext buildResultContext, string shadersBunldeName)
+ {
+ // 获取所有依赖着色器资源包的资源包列表
+ List shaderBundleReferenceList = new List();
+ foreach (var valuePair in buildResultContext.Results.BundleInfos)
+ {
+ if (valuePair.Value.Dependencies.Any(t => t == shadersBunldeName))
+ shaderBundleReferenceList.Add(valuePair.Key);
+ }
+
+ // 注意:没有任何资源依赖着色器
+ if (shaderBundleReferenceList.Count == 0)
+ return;
+
+ // 获取着色器资源包索引
+ Predicate predicate = new Predicate(s => s.BundleName == shadersBunldeName);
+ int shaderBundleId = manifest.BundleList.FindIndex(predicate);
+ if (shaderBundleId == -1)
+ throw new Exception("没有发现着色器资源包!");
+
+ // 检测依赖交集并更新依赖ID
+ foreach (var packageAsset in manifest.AssetList)
+ {
+ List dependBundles = GetPackageAssetAllDependBundles(manifest, packageAsset);
+ List conflictAssetPathList = dependBundles.Intersect(shaderBundleReferenceList).ToList();
+ if (conflictAssetPathList.Count > 0)
+ {
+ List newDependIDs = new List(packageAsset.DependIDs);
+ if (newDependIDs.Contains(shaderBundleId) == false)
+ newDependIDs.Add(shaderBundleId);
+ packageAsset.DependIDs = newDependIDs.ToArray();
+ }
+ }
+ }
+ private List GetPackageAssetAllDependBundles(PackageManifest manifest, PackageAsset packageAsset)
+ {
+ List result = new List();
+ string mainBundle = manifest.BundleList[packageAsset.BundleID].BundleName;
+ result.Add(mainBundle);
+ foreach (var dependID in packageAsset.DependIDs)
+ {
+ string dependBundle = manifest.BundleList[dependID].BundleName;
+ result.Add(dependBundle);
+ }
+ return result;
+ }
+
+ #region 资源包引用关系相关
+ private readonly Dictionary _cachedBundleID = new Dictionary(10000);
+ private readonly Dictionary _cachedBundleDepends = new Dictionary(10000);
+
+ private void UpdateScriptPipelineReference(PackageManifest manifest, TaskBuilding_SBP.BuildResultContext buildResultContext)
+ {
+ int progressValue;
+ int totalCount = manifest.BundleList.Count;
+
+ // 缓存资源包ID
+ _cachedBundleID.Clear();
+ progressValue = 0;
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ int bundleID = GetAssetBundleID(packageBundle.BundleName, manifest);
+ _cachedBundleID.Add(packageBundle.BundleName, bundleID);
+ EditorTools.DisplayProgressBar("缓存资源包索引", ++progressValue, totalCount);
+ }
+ EditorTools.ClearProgressBar();
+
+ // 缓存资源包依赖
+ _cachedBundleDepends.Clear();
+ progressValue = 0;
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ if (packageBundle.IsRawFile)
+ {
+ _cachedBundleDepends.Add(packageBundle.BundleName, new string[] { });
+ continue;
+ }
+
+ if (buildResultContext.Results.BundleInfos.ContainsKey(packageBundle.BundleName) == false)
+ throw new Exception($"Not found bundle in SBP build results : {packageBundle.BundleName}");
+
+ var depends = buildResultContext.Results.BundleInfos[packageBundle.BundleName].Dependencies;
+ _cachedBundleDepends.Add(packageBundle.BundleName, depends);
+ EditorTools.DisplayProgressBar("缓存资源包依赖列表", ++progressValue, totalCount);
+ }
+ EditorTools.ClearProgressBar();
+
+ // 计算资源包引用列表
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ packageBundle.ReferenceIDs = GetBundleRefrenceIDs(manifest, packageBundle);
+ EditorTools.DisplayProgressBar("计算资源包引用关系", ++progressValue, totalCount);
+ }
+ EditorTools.ClearProgressBar();
+ }
+ private void UpdateBuiltinPipelineReference(PackageManifest manifest, TaskBuilding.BuildResultContext buildResultContext)
+ {
+ int progressValue;
+ int totalCount = manifest.BundleList.Count;
+
+ // 缓存资源包ID
+ _cachedBundleID.Clear();
+ progressValue = 0;
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ int bundleID = GetAssetBundleID(packageBundle.BundleName, manifest);
+ _cachedBundleID.Add(packageBundle.BundleName, bundleID);
+ EditorTools.DisplayProgressBar("缓存资源包索引", ++progressValue, totalCount);
+ }
+ EditorTools.ClearProgressBar();
+
+ // 缓存资源包依赖
+ _cachedBundleDepends.Clear();
+ progressValue = 0;
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ if (packageBundle.IsRawFile)
+ {
+ _cachedBundleDepends.Add(packageBundle.BundleName, new string[] { } );
+ continue;
+ }
+
+ var depends = buildResultContext.UnityManifest.GetDirectDependencies(packageBundle.BundleName);
+ _cachedBundleDepends.Add(packageBundle.BundleName, depends);
+ EditorTools.DisplayProgressBar("缓存资源包依赖列表", ++progressValue, totalCount);
+ }
+ EditorTools.ClearProgressBar();
+
+ // 计算资源包引用列表
+ progressValue = 0;
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ packageBundle.ReferenceIDs = GetBundleRefrenceIDs(manifest, packageBundle);
+ EditorTools.DisplayProgressBar("计算资源包引用关系", ++progressValue, totalCount);
+ }
+ EditorTools.ClearProgressBar();
+ }
+
+ private int[] GetBundleRefrenceIDs(PackageManifest manifest, PackageBundle targetBundle)
+ {
+ List referenceList = new List();
+ foreach (var packageBundle in manifest.BundleList)
+ {
+ string bundleName = packageBundle.BundleName;
+ if (bundleName == targetBundle.BundleName)
+ continue;
+
+ string[] dependencies = GetCachedBundleDepends(bundleName);
+ if (dependencies.Contains(targetBundle.BundleName))
+ {
+ referenceList.Add(bundleName);
+ }
+ }
+
+ List result = new List();
+ foreach (var bundleName in referenceList)
+ {
+ int bundleID = GetCachedBundleID(bundleName);
+ if (result.Contains(bundleID) == false)
+ result.Add(bundleID);
+ }
+ return result.ToArray();
+ }
+ private int GetCachedBundleID(string bundleName)
+ {
+ if (_cachedBundleID.TryGetValue(bundleName, out int value) == false)
+ {
+ throw new Exception($"Not found cached bundle ID : {bundleName}");
+ }
+ return value;
+ }
+ private string[] GetCachedBundleDepends(string bundleName)
+ {
+ if (_cachedBundleDepends.TryGetValue(bundleName, out string[] value) == false)
+ {
+ throw new Exception($"Not found cached bundle depends : {bundleName}");
+ }
+ return value;
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateManifest.cs.meta
similarity index 100%
rename from Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateManifest.cs.meta
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchPackage.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePackage.cs
similarity index 79%
rename from Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchPackage.cs
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePackage.cs
index 954c73f..4f891bb 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchPackage.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePackage.cs
@@ -3,8 +3,8 @@ using System.Collections.Generic;
namespace YooAsset.Editor
{
- [TaskAttribute("制作补丁包")]
- public class TaskCreatePatchPackage : IBuildTask
+ [TaskAttribute("制作包裹")]
+ public class TaskCreatePackage : IBuildTask
{
void IBuildTask.Run(BuildContext context)
{
@@ -13,19 +13,19 @@ namespace YooAsset.Editor
var buildMode = buildParameters.Parameters.BuildMode;
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
{
- CopyPatchFiles(buildParameters, buildMapContext);
+ CopyPackageFiles(buildParameters, buildMapContext);
}
}
///
/// 拷贝补丁文件到补丁包目录
///
- private void CopyPatchFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
+ private void CopyPackageFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
{
var buildParameters = buildParametersContext.Parameters;
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
- BuildRunner.Log($"开始拷贝补丁文件到补丁包目录:{packageOutputDirectory}");
+ BuildLogger.Log($"开始拷贝补丁文件到补丁包目录:{packageOutputDirectory}");
if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
{
@@ -67,11 +67,11 @@ namespace YooAsset.Editor
// 拷贝所有补丁文件
int progressValue = 0;
- int patchFileTotalCount = buildMapContext.BundleInfos.Count;
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ int fileTotalCount = buildMapContext.Collection.Count;
+ foreach (var bundleInfo in buildMapContext.Collection)
{
- EditorTools.CopyFile(bundleInfo.PatchInfo.BuildOutputFilePath, bundleInfo.PatchInfo.PatchOutputFilePath, true);
- EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, patchFileTotalCount);
+ EditorTools.CopyFile(bundleInfo.BundleInfo.BuildOutputFilePath, bundleInfo.BundleInfo.PackageOutputFilePath, true);
+ EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, fileTotalCount);
}
EditorTools.ClearProgressBar();
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchPackage.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePackage.cs.meta
similarity index 100%
rename from Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchPackage.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePackage.cs.meta
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs
deleted file mode 100644
index 2982c84..0000000
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-using System;
-using System.Linq;
-using System.Collections;
-using System.Collections.Generic;
-
-using UnityEditor.Build.Pipeline;
-using UnityEditor.Build.Pipeline.Interfaces;
-
-namespace YooAsset.Editor
-{
- public class PatchManifestContext : IContextObject
- {
- internal PatchManifest Manifest;
- }
-
- [TaskAttribute("创建补丁清单文件")]
- public class TaskCreatePatchManifest : IBuildTask
- {
- void IBuildTask.Run(BuildContext context)
- {
- CreatePatchManifestFile(context);
- }
-
- ///
- /// 创建补丁清单文件到输出目录
- ///
- private void CreatePatchManifestFile(BuildContext context)
- {
- var buildMapContext = context.GetContextObject();
- var buildParametersContext = context.GetContextObject();
- var buildParameters = buildParametersContext.Parameters;
- string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
-
- // 创建新补丁清单
- PatchManifest patchManifest = new PatchManifest();
- patchManifest.FileVersion = YooAssetSettings.PatchManifestFileVersion;
- patchManifest.EnableAddressable = buildMapContext.EnableAddressable;
- patchManifest.OutputNameStyle = (int)buildParameters.OutputNameStyle;
- patchManifest.PackageName = buildParameters.PackageName;
- patchManifest.PackageVersion = buildParameters.PackageVersion;
- patchManifest.BundleList = GetAllPatchBundle(context);
- patchManifest.AssetList = GetAllPatchAsset(context, patchManifest);
-
- // 更新Unity内置资源包的引用关系
- string shadersBunldeName = YooAssetSettingsData.GetUnityShadersBundleFullName(buildMapContext.UniqueBundleName, buildParameters.PackageName);
- if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
- {
- if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
- {
- var buildResultContext = context.GetContextObject();
- UpdateBuiltInBundleReference(patchManifest, buildResultContext.Results, shadersBunldeName);
- }
- }
-
- // 创建补丁清单文本文件
- {
- string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion);
- string filePath = $"{packageOutputDirectory}/{fileName}";
- PatchManifestTools.SerializeToJson(filePath, patchManifest);
- BuildRunner.Log($"创建补丁清单文件:{filePath}");
- }
-
- // 创建补丁清单二进制文件
- string packageHash;
- {
- string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
- string filePath = $"{packageOutputDirectory}/{fileName}";
- PatchManifestTools.SerializeToBinary(filePath, patchManifest);
- packageHash = HashUtility.FileMD5(filePath);
- BuildRunner.Log($"创建补丁清单文件:{filePath}");
-
- PatchManifestContext patchManifestContext = new PatchManifestContext();
- byte[] bytesData = FileUtility.ReadAllBytes(filePath);
- patchManifestContext.Manifest = PatchManifestTools.DeserializeFromBinary(bytesData);
- context.SetContextObject(patchManifestContext);
- }
-
- // 创建补丁清单哈希文件
- {
- string fileName = YooAssetSettingsData.GetPackageHashFileName(buildParameters.PackageName, buildParameters.PackageVersion);
- string filePath = $"{packageOutputDirectory}/{fileName}";
- FileUtility.CreateFile(filePath, packageHash);
- BuildRunner.Log($"创建补丁清单哈希文件:{filePath}");
- }
-
- // 创建补丁清单版本文件
- {
- string fileName = YooAssetSettingsData.GetPackageVersionFileName(buildParameters.PackageName);
- string filePath = $"{packageOutputDirectory}/{fileName}";
- FileUtility.CreateFile(filePath, buildParameters.PackageVersion);
- BuildRunner.Log($"创建补丁清单版本文件:{filePath}");
- }
- }
-
- ///
- /// 获取资源包列表
- ///
- private List GetAllPatchBundle(BuildContext context)
- {
- var buildMapContext = context.GetContextObject();
- var buildParametersContext = context.GetContextObject();
-
- List result = new List(1000);
- foreach (var bundleInfo in buildMapContext.BundleInfos)
- {
- var patchBundle = bundleInfo.CreatePatchBundle();
- result.Add(patchBundle);
- }
- return result;
- }
-
- ///
- /// 获取资源列表
- ///
- private List GetAllPatchAsset(BuildContext context, PatchManifest patchManifest)
- {
- var buildMapContext = context.GetContextObject();
-
- List result = new List(1000);
- foreach (var bundleInfo in buildMapContext.BundleInfos)
- {
- var assetInfos = bundleInfo.GetAllPatchAssetInfos();
- foreach (var assetInfo in assetInfos)
- {
- PatchAsset patchAsset = new PatchAsset();
- if (buildMapContext.EnableAddressable)
- patchAsset.Address = assetInfo.Address;
- else
- patchAsset.Address = string.Empty;
- patchAsset.AssetPath = assetInfo.AssetPath;
- patchAsset.AssetTags = assetInfo.AssetTags.ToArray();
- patchAsset.BundleID = GetAssetBundleID(assetInfo.GetBundleName(), patchManifest);
- patchAsset.DependIDs = GetAssetBundleDependIDs(patchAsset.BundleID, assetInfo, patchManifest);
- result.Add(patchAsset);
- }
- }
- return result;
- }
- private int[] GetAssetBundleDependIDs(int mainBundleID, BuildAssetInfo assetInfo, PatchManifest patchManifest)
- {
- List result = new List();
- foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
- {
- if (dependAssetInfo.HasBundleName())
- {
- int bundleID = GetAssetBundleID(dependAssetInfo.GetBundleName(), patchManifest);
- if (mainBundleID != bundleID)
- {
- if (result.Contains(bundleID) == false)
- result.Add(bundleID);
- }
- }
- }
- return result.ToArray();
- }
- private int GetAssetBundleID(string bundleName, PatchManifest patchManifest)
- {
- for (int index = 0; index < patchManifest.BundleList.Count; index++)
- {
- if (patchManifest.BundleList[index].BundleName == bundleName)
- return index;
- }
- throw new Exception($"Not found bundle name : {bundleName}");
- }
-
- ///
- /// 更新Unity内置资源包的引用关系
- ///
- private void UpdateBuiltInBundleReference(PatchManifest patchManifest, IBundleBuildResults buildResults, string shadersBunldeName)
- {
- // 获取所有依赖着色器资源包的资源包列表
- List shaderBundleReferenceList = new List();
- foreach (var valuePair in buildResults.BundleInfos)
- {
- if (valuePair.Value.Dependencies.Any(t => t == shadersBunldeName))
- shaderBundleReferenceList.Add(valuePair.Key);
- }
-
- // 注意:没有任何资源依赖着色器
- if (shaderBundleReferenceList.Count == 0)
- return;
-
- // 获取着色器资源包索引
- Predicate predicate = new Predicate(s => s.BundleName == shadersBunldeName);
- int shaderBundleId = patchManifest.BundleList.FindIndex(predicate);
- if (shaderBundleId == -1)
- throw new Exception("没有发现着色器资源包!");
-
- // 检测依赖交集并更新依赖ID
- foreach (var patchAsset in patchManifest.AssetList)
- {
- List dependBundles = GetPatchAssetAllDependBundles(patchManifest, patchAsset);
- List conflictAssetPathList = dependBundles.Intersect(shaderBundleReferenceList).ToList();
- if (conflictAssetPathList.Count > 0)
- {
- List newDependIDs = new List(patchAsset.DependIDs);
- if (newDependIDs.Contains(shaderBundleId) == false)
- newDependIDs.Add(shaderBundleId);
- patchAsset.DependIDs = newDependIDs.ToArray();
- }
- }
- }
- private List GetPatchAssetAllDependBundles(PatchManifest patchManifest, PatchAsset patchAsset)
- {
- List result = new List();
- string mainBundle = patchManifest.BundleList[patchAsset.BundleID].BundleName;
- result.Add(mainBundle);
- foreach (var dependID in patchAsset.DependIDs)
- {
- string dependBundle = patchManifest.BundleList[dependID].BundleName;
- result.Add(dependBundle);
- }
- return result;
- }
- }
-}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateReport.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateReport.cs
index 4969c22..3b65c33 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateReport.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreateReport.cs
@@ -12,25 +12,21 @@ namespace YooAsset.Editor
{
var buildParameters = context.GetContextObject();
var buildMapContext = context.GetContextObject();
- var patchManifestContext = context.GetContextObject();
- buildParameters.StopWatch();
+ var manifestContext = context.GetContextObject();
var buildMode = buildParameters.Parameters.BuildMode;
if (buildMode != EBuildMode.SimulateBuild)
{
- CreateReportFile(buildParameters, buildMapContext, patchManifestContext);
+ CreateReportFile(buildParameters, buildMapContext, manifestContext);
}
-
- float buildSeconds = buildParameters.GetBuildingSeconds();
- BuildRunner.Info($"Build time consuming {buildSeconds} seconds.");
}
- private void CreateReportFile(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext, PatchManifestContext patchManifestContext)
+ private void CreateReportFile(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext, ManifestContext manifestContext)
{
var buildParameters = buildParametersContext.Parameters;
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
- PatchManifest patchManifest = patchManifestContext.Manifest;
+ PackageManifest manifest = manifestContext.Manifest;
BuildReport buildReport = new BuildReport();
// 概述信息
@@ -42,7 +38,7 @@ namespace YooAsset.Editor
#endif
buildReport.Summary.UnityVersion = UnityEngine.Application.unityVersion;
buildReport.Summary.BuildDate = DateTime.Now.ToString();
- buildReport.Summary.BuildSeconds = (int)buildParametersContext.GetBuildingSeconds();
+ buildReport.Summary.BuildSeconds = BuildRunner.TotalSeconds;
buildReport.Summary.BuildTarget = buildParameters.BuildTarget;
buildReport.Summary.BuildPipeline = buildParameters.BuildPipeline;
buildReport.Summary.BuildMode = buildParameters.BuildMode;
@@ -61,45 +57,47 @@ namespace YooAsset.Editor
// 构建结果
buildReport.Summary.AssetFileTotalCount = buildMapContext.AssetFileCount;
- buildReport.Summary.MainAssetTotalCount = GetMainAssetCount(patchManifest);
- buildReport.Summary.AllBundleTotalCount = GetAllBundleCount(patchManifest);
- buildReport.Summary.AllBundleTotalSize = GetAllBundleSize(patchManifest);
- buildReport.Summary.EncryptedBundleTotalCount = GetEncryptedBundleCount(patchManifest);
- buildReport.Summary.EncryptedBundleTotalSize = GetEncryptedBundleSize(patchManifest);
- buildReport.Summary.RawBundleTotalCount = GetRawBundleCount(patchManifest);
- buildReport.Summary.RawBundleTotalSize = GetRawBundleSize(patchManifest);
+ buildReport.Summary.MainAssetTotalCount = GetMainAssetCount(manifest);
+ buildReport.Summary.AllBundleTotalCount = GetAllBundleCount(manifest);
+ buildReport.Summary.AllBundleTotalSize = GetAllBundleSize(manifest);
+ buildReport.Summary.EncryptedBundleTotalCount = GetEncryptedBundleCount(manifest);
+ buildReport.Summary.EncryptedBundleTotalSize = GetEncryptedBundleSize(manifest);
+ buildReport.Summary.RawBundleTotalCount = GetRawBundleCount(manifest);
+ buildReport.Summary.RawBundleTotalSize = GetRawBundleSize(manifest);
}
// 资源对象列表
- buildReport.AssetInfos = new List(patchManifest.AssetList.Count);
- foreach (var patchAsset in patchManifest.AssetList)
+ buildReport.AssetInfos = new List(manifest.AssetList.Count);
+ foreach (var packageAsset in manifest.AssetList)
{
- var mainBundle = patchManifest.BundleList[patchAsset.BundleID];
+ var mainBundle = manifest.BundleList[packageAsset.BundleID];
ReportAssetInfo reportAssetInfo = new ReportAssetInfo();
- reportAssetInfo.Address = patchAsset.Address;
- reportAssetInfo.AssetPath = patchAsset.AssetPath;
- reportAssetInfo.AssetTags = patchAsset.AssetTags;
- reportAssetInfo.AssetGUID = AssetDatabase.AssetPathToGUID(patchAsset.AssetPath);
+ reportAssetInfo.Address = packageAsset.Address;
+ reportAssetInfo.AssetPath = packageAsset.AssetPath;
+ reportAssetInfo.AssetTags = packageAsset.AssetTags;
+ reportAssetInfo.AssetGUID = AssetDatabase.AssetPathToGUID(packageAsset.AssetPath);
reportAssetInfo.MainBundleName = mainBundle.BundleName;
reportAssetInfo.MainBundleSize = mainBundle.FileSize;
- reportAssetInfo.DependBundles = GetDependBundles(patchManifest, patchAsset);
- reportAssetInfo.DependAssets = GetDependAssets(buildMapContext, mainBundle.BundleName, patchAsset.AssetPath);
+ reportAssetInfo.DependBundles = GetDependBundles(manifest, packageAsset);
+ reportAssetInfo.DependAssets = GetDependAssets(buildMapContext, mainBundle.BundleName, packageAsset.AssetPath);
buildReport.AssetInfos.Add(reportAssetInfo);
}
// 资源包列表
- buildReport.BundleInfos = new List(patchManifest.BundleList.Count);
- foreach (var patchBundle in patchManifest.BundleList)
+ buildReport.BundleInfos = new List(manifest.BundleList.Count);
+ foreach (var packageBundle in manifest.BundleList)
{
ReportBundleInfo reportBundleInfo = new ReportBundleInfo();
- reportBundleInfo.BundleName = patchBundle.BundleName;
- reportBundleInfo.FileName = patchBundle.FileName;
- reportBundleInfo.FileHash = patchBundle.FileHash;
- reportBundleInfo.FileCRC = patchBundle.FileCRC;
- reportBundleInfo.FileSize = patchBundle.FileSize;
- reportBundleInfo.Tags = patchBundle.Tags;
- reportBundleInfo.IsRawFile = patchBundle.IsRawFile;
- reportBundleInfo.LoadMethod = (EBundleLoadMethod)patchBundle.LoadMethod;
+ reportBundleInfo.BundleName = packageBundle.BundleName;
+ reportBundleInfo.FileName = packageBundle.FileName;
+ reportBundleInfo.FileHash = packageBundle.FileHash;
+ reportBundleInfo.FileCRC = packageBundle.FileCRC;
+ reportBundleInfo.FileSize = packageBundle.FileSize;
+ reportBundleInfo.IsRawFile = packageBundle.IsRawFile;
+ reportBundleInfo.LoadMethod = (EBundleLoadMethod)packageBundle.LoadMethod;
+ reportBundleInfo.Tags = packageBundle.Tags;
+ reportBundleInfo.ReferenceIDs = packageBundle.ReferenceIDs;
+ reportBundleInfo.AllBuiltinAssets = GetAllBuiltinAssets(buildMapContext, packageBundle.BundleName);
buildReport.BundleInfos.Add(reportBundleInfo);
}
@@ -107,18 +105,18 @@ namespace YooAsset.Editor
string fileName = YooAssetSettingsData.GetReportFileName(buildParameters.PackageName, buildParameters.PackageVersion);
string filePath = $"{packageOutputDirectory}/{fileName}";
BuildReport.Serialize(filePath, buildReport);
- BuildRunner.Log($"资源构建报告文件创建完成:{filePath}");
+ BuildLogger.Log($"资源构建报告文件创建完成:{filePath}");
}
///
/// 获取资源对象依赖的所有资源包
///
- private List GetDependBundles(PatchManifest patchManifest, PatchAsset patchAsset)
+ private List GetDependBundles(PackageManifest manifest, PackageAsset packageAsset)
{
- List dependBundles = new List(patchAsset.DependIDs.Length);
- foreach (int index in patchAsset.DependIDs)
+ List dependBundles = new List(packageAsset.DependIDs.Length);
+ foreach (int index in packageAsset.DependIDs)
{
- string dependBundleName = patchManifest.BundleList[index].BundleName;
+ string dependBundleName = manifest.BundleList[index].BundleName;
dependBundles.Add(dependBundleName);
}
return dependBundles;
@@ -130,14 +128,14 @@ namespace YooAsset.Editor
private List GetDependAssets(BuildMapContext buildMapContext, string bundleName, string assetPath)
{
List result = new List();
- if (buildMapContext.TryGetBundleInfo(bundleName, out BuildBundleInfo bundleInfo))
+ var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
{
BuildAssetInfo findAssetInfo = null;
- foreach (var buildinAsset in bundleInfo.BuildinAssets)
+ foreach (var assetInfo in bundleInfo.AllMainAssets)
{
- if (buildinAsset.AssetPath == assetPath)
+ if (assetInfo.AssetPath == assetPath)
{
- findAssetInfo = buildinAsset;
+ findAssetInfo = assetInfo;
break;
}
}
@@ -150,67 +148,72 @@ namespace YooAsset.Editor
result.Add(dependAssetInfo.AssetPath);
}
}
- else
- {
- throw new Exception($"Not found bundle : {bundleName}");
- }
return result;
}
- private int GetMainAssetCount(PatchManifest patchManifest)
+ ///
+ /// 获取该资源包内的所有资源(包括零依赖资源)
+ ///
+ private List GetAllBuiltinAssets(BuildMapContext buildMapContext, string bundleName)
{
- return patchManifest.AssetList.Count;
+ var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
+ return bundleInfo.GetAllBuiltinAssetPaths();
}
- private int GetAllBundleCount(PatchManifest patchManifest)
+
+ private int GetMainAssetCount(PackageManifest manifest)
{
- return patchManifest.BundleList.Count;
+ return manifest.AssetList.Count;
}
- private long GetAllBundleSize(PatchManifest patchManifest)
+ private int GetAllBundleCount(PackageManifest manifest)
+ {
+ return manifest.BundleList.Count;
+ }
+ private long GetAllBundleSize(PackageManifest manifest)
{
long fileBytes = 0;
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- fileBytes += patchBundle.FileSize;
+ fileBytes += packageBundle.FileSize;
}
return fileBytes;
}
- private int GetEncryptedBundleCount(PatchManifest patchManifest)
+ private int GetEncryptedBundleCount(PackageManifest manifest)
{
int fileCount = 0;
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- if (patchBundle.LoadMethod != (byte)EBundleLoadMethod.Normal)
+ if (packageBundle.LoadMethod != (byte)EBundleLoadMethod.Normal)
fileCount++;
}
return fileCount;
}
- private long GetEncryptedBundleSize(PatchManifest patchManifest)
+ private long GetEncryptedBundleSize(PackageManifest manifest)
{
long fileBytes = 0;
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- if (patchBundle.LoadMethod != (byte)EBundleLoadMethod.Normal)
- fileBytes += patchBundle.FileSize;
+ if (packageBundle.LoadMethod != (byte)EBundleLoadMethod.Normal)
+ fileBytes += packageBundle.FileSize;
}
return fileBytes;
}
- private int GetRawBundleCount(PatchManifest patchManifest)
+ private int GetRawBundleCount(PackageManifest manifest)
{
int fileCount = 0;
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- if (patchBundle.IsRawFile)
+ if (packageBundle.IsRawFile)
fileCount++;
}
return fileCount;
}
- private long GetRawBundleSize(PatchManifest patchManifest)
+ private long GetRawBundleSize(PackageManifest manifest)
{
long fileBytes = 0;
- foreach (var patchBundle in patchManifest.BundleList)
+ foreach (var packageBundle in manifest.BundleList)
{
- if (patchBundle.IsRawFile)
- fileBytes += patchBundle.FileSize;
+ if (packageBundle.IsRawFile)
+ fileBytes += packageBundle.FileSize;
}
return fileBytes;
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskEncryption.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskEncryption.cs
index 96ffe6a..ab4e64b 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskEncryption.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskEncryption.cs
@@ -27,17 +27,16 @@ namespace YooAsset.Editor
private void EncryptingBundleFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
{
var encryptionServices = buildParametersContext.Parameters.EncryptionServices;
-
- // 如果没有设置加密类
if (encryptionServices == null)
return;
+ if (encryptionServices.GetType() == typeof(EncryptionNone))
+ return;
+
int progressValue = 0;
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ foreach (var bundleInfo in buildMapContext.Collection)
{
- bundleInfo.LoadMethod = EBundleLoadMethod.Normal;
-
EncryptFileInfo fileInfo = new EncryptFileInfo();
fileInfo.BundleName = bundleInfo.BundleName;
fileInfo.FilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
@@ -48,7 +47,7 @@ namespace YooAsset.Editor
// 注意:原生文件不支持加密
if (bundleInfo.IsRawFile)
{
- UnityEngine.Debug.LogWarning($"Encryption not support raw file : {bundleInfo.BundleName}");
+ BuildLogger.Warning($"Encryption not support raw file : {bundleInfo.BundleName}");
continue;
}
@@ -56,11 +55,11 @@ namespace YooAsset.Editor
FileUtility.CreateFile(filePath, encryptResult.EncryptedData);
bundleInfo.EncryptedFilePath = filePath;
bundleInfo.LoadMethod = encryptResult.LoadMethod;
- BuildRunner.Log($"Bundle文件加密完成:{filePath}");
+ BuildLogger.Log($"Bundle文件加密完成:{filePath}");
}
// 进度条
- EditorTools.DisplayProgressBar("加密资源包", ++progressValue, buildMapContext.BundleInfos.Count);
+ EditorTools.DisplayProgressBar("加密资源包", ++progressValue, buildMapContext.Collection.Count);
}
EditorTools.ClearProgressBar();
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskGetBuildMap.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskGetBuildMap.cs
index 2cc5396..f3cd9a8 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskGetBuildMap.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskGetBuildMap.cs
@@ -13,32 +13,188 @@ namespace YooAsset.Editor
void IBuildTask.Run(BuildContext context)
{
var buildParametersContext = context.GetContextObject();
- var buildMapContext = BuildMapCreater.CreateBuildMap(buildParametersContext.Parameters.BuildMode, buildParametersContext.Parameters.PackageName);
+ var buildMapContext = CreateBuildMap(buildParametersContext.Parameters.BuildMode, buildParametersContext.Parameters.PackageName);
context.SetContextObject(buildMapContext);
- BuildRunner.Log("构建内容准备完毕!");
+ BuildLogger.Log("构建内容准备完毕!");
// 检测构建结果
CheckBuildMapContent(buildMapContext);
}
+ ///
+ /// 资源构建上下文
+ ///
+ public BuildMapContext CreateBuildMap(EBuildMode buildMode, string packageName)
+ {
+ Dictionary allBuildAssetInfoDic = new Dictionary(1000);
+
+ // 1. 检测配置合法性
+ AssetBundleCollectorSettingData.Setting.CheckConfigError();
+
+ // 2. 获取所有收集器收集的资源
+ var collectResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(buildMode, packageName);
+ List allCollectAssetInfos = collectResult.CollectAssets;
+
+ // 3. 剔除未被引用的依赖项资源
+ RemoveZeroReferenceAssets(allCollectAssetInfos);
+
+ // 4. 录入所有收集器收集的资源
+ foreach (var collectAssetInfo in allCollectAssetInfos)
+ {
+ if (allBuildAssetInfoDic.ContainsKey(collectAssetInfo.AssetPath) == false)
+ {
+ var buildAssetInfo = new BuildAssetInfo(collectAssetInfo.CollectorType, collectAssetInfo.BundleName,
+ collectAssetInfo.Address, collectAssetInfo.AssetPath, collectAssetInfo.IsRawAsset);
+ buildAssetInfo.AddAssetTags(collectAssetInfo.AssetTags);
+ buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
+ allBuildAssetInfoDic.Add(collectAssetInfo.AssetPath, buildAssetInfo);
+ }
+ else
+ {
+ throw new Exception($"Should never get here !");
+ }
+ }
+
+ // 5. 录入所有收集资源的依赖资源
+ foreach (var collectAssetInfo in allCollectAssetInfos)
+ {
+ string collectAssetBundleName = collectAssetInfo.BundleName;
+ foreach (var dependAssetPath in collectAssetInfo.DependAssets)
+ {
+ if (allBuildAssetInfoDic.ContainsKey(dependAssetPath))
+ {
+ allBuildAssetInfoDic[dependAssetPath].AddBundleTags(collectAssetInfo.AssetTags);
+ allBuildAssetInfoDic[dependAssetPath].AddReferenceBundleName(collectAssetBundleName);
+ }
+ else
+ {
+ var buildAssetInfo = new BuildAssetInfo(dependAssetPath);
+ buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
+ buildAssetInfo.AddReferenceBundleName(collectAssetBundleName);
+ allBuildAssetInfoDic.Add(dependAssetPath, buildAssetInfo);
+ }
+ }
+ }
+
+ // 6. 填充所有收集资源的依赖列表
+ foreach (var collectAssetInfo in allCollectAssetInfos)
+ {
+ var dependAssetInfos = new List(collectAssetInfo.DependAssets.Count);
+ foreach (var dependAssetPath in collectAssetInfo.DependAssets)
+ {
+ if (allBuildAssetInfoDic.TryGetValue(dependAssetPath, out BuildAssetInfo value))
+ dependAssetInfos.Add(value);
+ else
+ throw new Exception("Should never get here !");
+ }
+ allBuildAssetInfoDic[collectAssetInfo.AssetPath].SetAllDependAssetInfos(dependAssetInfos);
+ }
+
+ // 7. 记录关键信息
+ BuildMapContext context = new BuildMapContext();
+ context.AssetFileCount = allBuildAssetInfoDic.Count;
+ context.EnableAddressable = collectResult.Command.EnableAddressable;
+ context.UniqueBundleName = collectResult.Command.UniqueBundleName;
+ context.ShadersBundleName = collectResult.Command.ShadersBundleName;
+
+ // 8. 计算共享的资源包名
+ var command = collectResult.Command;
+ foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
+ {
+ buildAssetInfo.CalculateShareBundleName(command.UniqueBundleName, command.PackageName, command.ShadersBundleName);
+ }
+
+ // 9. 移除不参与构建的资源
+ List removeBuildList = new List();
+ foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
+ {
+ if (buildAssetInfo.HasBundleName() == false)
+ removeBuildList.Add(buildAssetInfo);
+ }
+ foreach (var removeValue in removeBuildList)
+ {
+ allBuildAssetInfoDic.Remove(removeValue.AssetPath);
+ }
+
+ // 10. 构建资源包
+ var allPackAssets = allBuildAssetInfoDic.Values.ToList();
+ if (allPackAssets.Count == 0)
+ throw new Exception("构建的资源列表不能为空");
+ foreach (var assetInfo in allPackAssets)
+ {
+ context.PackAsset(assetInfo);
+ }
+ return context;
+ }
+ private void RemoveZeroReferenceAssets(List allCollectAssetInfos)
+ {
+ // 1. 检测是否任何存在依赖资源
+ bool hasAnyDependAsset = false;
+ foreach (var collectAssetInfo in allCollectAssetInfos)
+ {
+ var collectorType = collectAssetInfo.CollectorType;
+ if (collectorType == ECollectorType.DependAssetCollector)
+ {
+ hasAnyDependAsset = true;
+ break;
+ }
+ }
+ if (hasAnyDependAsset == false)
+ return;
+
+ // 2. 获取所有主资源的依赖资源集合
+ HashSet allDependAsset = new HashSet();
+ foreach (var collectAssetInfo in allCollectAssetInfos)
+ {
+ var collectorType = collectAssetInfo.CollectorType;
+ if (collectorType == ECollectorType.MainAssetCollector || collectorType == ECollectorType.StaticAssetCollector)
+ {
+ foreach (var dependAsset in collectAssetInfo.DependAssets)
+ {
+ if (allDependAsset.Contains(dependAsset) == false)
+ allDependAsset.Add(dependAsset);
+ }
+ }
+ }
+
+ // 3. 找出所有零引用的依赖资源集合
+ List removeList = new List();
+ foreach (var collectAssetInfo in allCollectAssetInfos)
+ {
+ var collectorType = collectAssetInfo.CollectorType;
+ if (collectorType == ECollectorType.DependAssetCollector)
+ {
+ if (allDependAsset.Contains(collectAssetInfo.AssetPath) == false)
+ removeList.Add(collectAssetInfo);
+ }
+ }
+
+ // 4. 移除所有零引用的依赖资源
+ foreach (var removeValue in removeList)
+ {
+ BuildLogger.Log($"发现未被依赖的资源并自动移除 : {removeValue.AssetPath}");
+ allCollectAssetInfos.Remove(removeValue);
+ }
+ }
+
///
/// 检测构建结果
///
private void CheckBuildMapContent(BuildMapContext buildMapContext)
{
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ foreach (var bundleInfo in buildMapContext.Collection)
{
// 注意:原生文件资源包只能包含一个原生文件
bool isRawFile = bundleInfo.IsRawFile;
if (isRawFile)
{
- if (bundleInfo.BuildinAssets.Count != 1)
+ if (bundleInfo.AllMainAssets.Count != 1)
throw new Exception($"The bundle does not support multiple raw asset : {bundleInfo.BundleName}");
continue;
}
// 注意:原生文件不能被其它资源文件依赖
- foreach (var assetInfo in bundleInfo.BuildinAssets)
+ foreach (var assetInfo in bundleInfo.AllMainAssets)
{
if (assetInfo.AllDependAssetInfos != null)
{
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskPrepare.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskPrepare.cs
index 718cfbb..5c32428 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskPrepare.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskPrepare.cs
@@ -12,8 +12,6 @@ namespace YooAsset.Editor
void IBuildTask.Run(BuildContext context)
{
var buildParametersContext = context.GetContextObject();
- buildParametersContext.BeginWatch();
-
var buildParameters = buildParametersContext.Parameters;
// 检测构建参数合法性
@@ -21,7 +19,7 @@ namespace YooAsset.Editor
throw new Exception("请选择目标平台");
if (string.IsNullOrEmpty(buildParameters.PackageName))
throw new Exception("包裹名称不能为空");
- if(string.IsNullOrEmpty(buildParameters.PackageVersion))
+ if (string.IsNullOrEmpty(buildParameters.PackageVersion))
throw new Exception("包裹版本不能为空");
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
@@ -53,11 +51,11 @@ namespace YooAsset.Editor
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
{
- // 删除平台总目录
- string platformDirectory = $"{buildParameters.OutputRoot}/{buildParameters.PackageName}/{buildParameters.BuildTarget}";
+ // 删除总目录
+ string platformDirectory = $"{buildParameters.OutputRoot}/{buildParameters.BuildTarget}/{buildParameters.PackageName}";
if (EditorTools.DeleteDirectory(platformDirectory))
{
- BuildRunner.Log($"删除平台总目录:{platformDirectory}");
+ BuildLogger.Log($"删除平台总目录:{platformDirectory}");
}
}
@@ -65,7 +63,7 @@ namespace YooAsset.Editor
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
if (EditorTools.CreateDirectory(pipelineOutputDirectory))
{
- BuildRunner.Log($"创建输出目录:{pipelineOutputDirectory}");
+ BuildLogger.Log($"创建输出目录:{pipelineOutputDirectory}");
}
}
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBundleInfo.cs
similarity index 68%
rename from Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBundleInfo.cs
index 8c6f6fd..4881a51 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBundleInfo.cs
@@ -6,8 +6,8 @@ using UnityEditor;
namespace YooAsset.Editor
{
- [TaskAttribute("更新构建信息")]
- public class TaskUpdateBuildInfo : IBuildTask
+ [TaskAttribute("更新资源包信息")]
+ public class TaskUpdateBundleInfo : IBuildTask
{
void IBuildTask.Run(BuildContext context)
{
@@ -17,39 +17,40 @@ namespace YooAsset.Editor
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
int outputNameStyle = (int)buildParametersContext.Parameters.OutputNameStyle;
- // 1.检测路径长度
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ // 1.检测文件名长度
+ foreach (var bundleInfo in buildMapContext.Collection)
{
- // NOTE:检测路径长度不要超过260字符。
- string filePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
- if (filePath.Length >= 260)
- throw new Exception($"The output bundle name is too long {filePath.Length} chars : {filePath}");
+ // NOTE:检测文件名长度不要超过260字符。
+ string fileName = bundleInfo.BundleName;
+ if (fileName.Length >= 260)
+ throw new Exception($"The output bundle name is too long {fileName.Length} chars : {fileName}");
}
// 2.更新构建输出的文件路径
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ foreach (var bundleInfo in buildMapContext.Collection)
{
if (bundleInfo.IsEncryptedFile)
- bundleInfo.PatchInfo.BuildOutputFilePath = bundleInfo.EncryptedFilePath;
+ bundleInfo.BundleInfo.BuildOutputFilePath = bundleInfo.EncryptedFilePath;
else
- bundleInfo.PatchInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
+ bundleInfo.BundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
}
// 3.更新文件其它信息
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ foreach (var bundleInfo in buildMapContext.Collection)
{
- string buildOutputFilePath = bundleInfo.PatchInfo.BuildOutputFilePath;
- bundleInfo.PatchInfo.ContentHash = GetBundleContentHash(bundleInfo, context);
- bundleInfo.PatchInfo.PatchFileHash = GetBundleFileHash(buildOutputFilePath, buildParametersContext);
- bundleInfo.PatchInfo.PatchFileCRC = GetBundleFileCRC(buildOutputFilePath, buildParametersContext);
- bundleInfo.PatchInfo.PatchFileSize = GetBundleFileSize(buildOutputFilePath, buildParametersContext);
+ 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);
}
// 4.更新补丁包输出的文件路径
- foreach (var bundleInfo in buildMapContext.BundleInfos)
+ foreach (var bundleInfo in buildMapContext.Collection)
{
- string patchFileName = PatchManifestTools.CreateBundleFileName(outputNameStyle, bundleInfo.BundleName, bundleInfo.PatchInfo.PatchFileHash, bundleInfo.IsRawFile);
- bundleInfo.PatchInfo.PatchOutputFilePath = $"{packageOutputDirectory}/{patchFileName}";
+ string fileExtension = ManifestTools.GetRemoteBundleFileExtension(bundleInfo.BundleName);
+ string fileName = ManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleInfo.BundleName, fileExtension, bundleInfo.BundleInfo.FileHash);
+ bundleInfo.BundleInfo.PackageOutputFilePath = $"{packageOutputDirectory}/{fileName}";
}
}
@@ -63,7 +64,7 @@ namespace YooAsset.Editor
if (bundleInfo.IsRawFile)
{
- string filePath = bundleInfo.PatchInfo.BuildOutputFilePath;
+ string filePath = bundleInfo.BundleInfo.BuildOutputFilePath;
return HashUtility.FileMD5(filePath);
}
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBundleInfo.cs.meta
similarity index 100%
rename from Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBundleInfo.cs.meta
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult.cs
index 52dd554..e3ffbbf 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult.cs
@@ -34,29 +34,29 @@ namespace YooAsset.Editor
{
var buildParametersContext = context.GetContextObject();
var buildMapContext = context.GetContextObject();
- string[] buildedBundles = unityManifest.GetAllAssetBundles();
+ string[] unityCreateBundles = unityManifest.GetAllAssetBundles();
// 1. 过滤掉原生Bundle
- string[] mapBundles = buildMapContext.BundleInfos.Where(t => t.IsRawFile == false).Select(t => t.BundleName).ToArray();
+ string[] mapBundles = buildMapContext.Collection.Where(t => t.IsRawFile == false).Select(t => t.BundleName).ToArray();
// 2. 验证Bundle
- List exceptBundleList1 = buildedBundles.Except(mapBundles).ToList();
+ List exceptBundleList1 = unityCreateBundles.Except(mapBundles).ToList();
if (exceptBundleList1.Count > 0)
{
foreach (var exceptBundle in exceptBundleList1)
{
- Debug.LogWarning($"差异资源包: {exceptBundle}");
+ BuildLogger.Warning($"差异资源包: {exceptBundle}");
}
throw new System.Exception("存在差异资源包!请查看警告信息!");
}
// 3. 验证Bundle
- List exceptBundleList2 = mapBundles.Except(buildedBundles).ToList();
+ List exceptBundleList2 = mapBundles.Except(unityCreateBundles).ToList();
if (exceptBundleList2.Count > 0)
{
foreach (var exceptBundle in exceptBundleList2)
{
- Debug.LogWarning($"差异资源包: {exceptBundle}");
+ BuildLogger.Warning($"差异资源包: {exceptBundle}");
}
throw new System.Exception("存在差异资源包!请查看警告信息!");
}
@@ -76,16 +76,16 @@ namespace YooAsset.Editor
string[] mapAssetPaths = buildMapContext.GetBuildinAssetPaths(buildedBundle);
if (mapAssetPaths.Length != buildedAssetPaths.Length)
{
- Debug.LogWarning($"构建的Bundle文件内的资源对象数量和预期不匹配 : {buildedBundle}");
+ BuildLogger.Warning($"构建的Bundle文件内的资源对象数量和预期不匹配 : {buildedBundle}");
var exceptAssetList1 = mapAssetPaths.Except(buildedAssetPaths).ToList();
foreach (var excpetAsset in exceptAssetList1)
{
- Debug.LogWarning($"构建失败的资源对象路径为 : {excpetAsset}");
+ BuildLogger.Warning($"构建失败的资源对象路径为 : {excpetAsset}");
}
var exceptAssetList2 = buildedAssetPaths.Except(mapAssetPaths).ToList();
foreach (var excpetAsset in exceptAssetList2)
{
- Debug.LogWarning($"构建失败的资源对象路径为 : {excpetAsset}");
+ BuildLogger.Warning($"构建失败的资源对象路径为 : {excpetAsset}");
}
isPass = false;
continue;
@@ -101,7 +101,7 @@ namespace YooAsset.Editor
}
*/
- BuildRunner.Log("构建结果验证成功!");
+ BuildLogger.Log("构建结果验证成功!");
}
///
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult_SBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult_SBP.cs
index 9b52d8e..b4ec42a 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult_SBP.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskVerifyBuildResult_SBP.cs
@@ -35,34 +35,34 @@ namespace YooAsset.Editor
{
var buildParameters = context.GetContextObject();
var buildMapContext = context.GetContextObject();
- List buildedBundles = buildResults.BundleInfos.Keys.ToList();
+ List unityCreateBundles = buildResults.BundleInfos.Keys.ToList();
// 1. 过滤掉原生Bundle
- List expectBundles = buildMapContext.BundleInfos.Where(t => t.IsRawFile == false).Select(t => t.BundleName).ToList();
+ List expectBundles = buildMapContext.Collection.Where(t => t.IsRawFile == false).Select(t => t.BundleName).ToList();
// 2. 验证Bundle
- List exceptBundleList1 = buildedBundles.Except(expectBundles).ToList();
+ List exceptBundleList1 = unityCreateBundles.Except(expectBundles).ToList();
if (exceptBundleList1.Count > 0)
{
foreach (var exceptBundle in exceptBundleList1)
{
- Debug.LogWarning($"差异资源包: {exceptBundle}");
+ BuildLogger.Warning($"差异资源包: {exceptBundle}");
}
throw new System.Exception("存在差异资源包!请查看警告信息!");
}
// 3. 验证Bundle
- List exceptBundleList2 = expectBundles.Except(buildedBundles).ToList();
+ List exceptBundleList2 = expectBundles.Except(unityCreateBundles).ToList();
if (exceptBundleList2.Count > 0)
{
foreach (var exceptBundle in exceptBundleList2)
{
- Debug.LogWarning($"差异资源包: {exceptBundle}");
+ BuildLogger.Warning($"差异资源包: {exceptBundle}");
}
throw new System.Exception("存在差异资源包!请查看警告信息!");
}
- BuildRunner.Log("构建结果验证成功!");
+ BuildLogger.Log("构建结果验证成功!");
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs
new file mode 100644
index 0000000..44f5053
--- /dev/null
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs
@@ -0,0 +1,11 @@
+
+namespace YooAsset.Editor
+{
+ public class EncryptionNone : IEncryptionServices
+ {
+ public EncryptResult Encrypt(EncryptFileInfo fileInfo)
+ {
+ throw new System.NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/CacheSystem/VerifyInfo.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta
similarity index 83%
rename from Assets/YooAsset/Runtime/CacheSystem/VerifyInfo.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta
index 4b66326..3c666d3 100644
--- a/Assets/YooAsset/Runtime/CacheSystem/VerifyInfo.cs.meta
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: a6296859f09655c4191594304ddf378f
+guid: 46b8b200b841799498896403d9d427c2
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs
index 8449b7c..b344a42 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs
@@ -45,6 +45,11 @@ namespace YooAsset.Editor
///
public string AssetTags = string.Empty;
+ ///
+ /// 用户自定义数据
+ ///
+ public string UserData = string.Empty;
+
///
/// 收集器是否有效
@@ -142,11 +147,14 @@ namespace YooAsset.Editor
}
Dictionary result = new Dictionary(1000);
- bool isRawAsset = PackRuleName == nameof(PackRawFile);
+
+ // 检测是否为原生资源打包规则
+ IPackRule packRuleInstance = AssetBundleCollectorSettingData.GetPackRuleInstance(PackRuleName);
+ bool isRawFilePackRule = packRuleInstance.IsRawFilePackRule();
// 检测原生资源包的收集器类型
- if (isRawAsset && CollectorType != ECollectorType.MainAssetCollector)
- throw new Exception($"The raw file must be set to {nameof(ECollectorType)}.{ECollectorType.MainAssetCollector} : {CollectPath}");
+ if (isRawFilePackRule && CollectorType != ECollectorType.MainAssetCollector)
+ throw new Exception($"The raw file pack rule must be set to {nameof(ECollectorType)}.{ECollectorType.MainAssetCollector} : {CollectPath}");
if (string.IsNullOrEmpty(CollectPath))
throw new Exception($"The collect path is null or empty in group : {group.GroupName}");
@@ -158,11 +166,11 @@ namespace YooAsset.Editor
string[] findAssets = EditorTools.FindAssets(EAssetSearchType.All, collectDirectory);
foreach (string assetPath in findAssets)
{
- if (IsValidateAsset(assetPath) && IsCollectAsset(assetPath))
+ if (IsValidateAsset(assetPath, isRawFilePackRule) && IsCollectAsset(assetPath))
{
if (result.ContainsKey(assetPath) == false)
{
- var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawAsset);
+ var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawFilePackRule);
result.Add(assetPath, collectAssetInfo);
}
else
@@ -175,9 +183,9 @@ namespace YooAsset.Editor
else
{
string assetPath = CollectPath;
- if (IsValidateAsset(assetPath) && IsCollectAsset(assetPath))
+ if (IsValidateAsset(assetPath, isRawFilePackRule) && IsCollectAsset(assetPath))
{
- var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawAsset);
+ var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawFilePackRule);
result.Add(assetPath, collectAssetInfo);
}
else
@@ -207,12 +215,12 @@ namespace YooAsset.Editor
return result.Values.ToList();
}
- private CollectAssetInfo CreateCollectAssetInfo(CollectCommand command, AssetBundleCollectorGroup group, string assetPath, bool isRawAsset)
+ private CollectAssetInfo CreateCollectAssetInfo(CollectCommand command, AssetBundleCollectorGroup group, string assetPath, bool isRawFilePackRule)
{
- string address = GetAddress(group, assetPath);
- string bundleName = GetBundleName(group, assetPath);
+ string address = GetAddress(command, group, assetPath);
+ string bundleName = GetBundleName(command, group, assetPath);
List assetTags = GetAssetTags(group);
- CollectAssetInfo collectAssetInfo = new CollectAssetInfo(CollectorType, bundleName, address, assetPath, assetTags, isRawAsset);
+ CollectAssetInfo collectAssetInfo = new CollectAssetInfo(CollectorType, bundleName, address, assetPath, isRawFilePackRule, assetTags);
// 注意:模拟构建模式下不需要收集依赖资源
if (command.BuildMode == EBuildMode.SimulateBuild)
@@ -222,7 +230,7 @@ namespace YooAsset.Editor
return collectAssetInfo;
}
- private bool IsValidateAsset(string assetPath)
+ private bool IsValidateAsset(string assetPath, bool isRawFilePackRule)
{
if (assetPath.StartsWith("Assets/") == false && assetPath.StartsWith("Packages/") == false)
{
@@ -235,15 +243,38 @@ namespace YooAsset.Editor
return false;
// 忽略编辑器下的类型资源
- Type type = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
- if (type == typeof(LightingDataAsset))
+ Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
+ if (assetType == typeof(LightingDataAsset))
return false;
- // 忽略Unity无法识别的无效文件
- // 注意:只对非原生文件收集器处理
- if(PackRuleName != nameof(PackRawFile))
+ // 检测原生文件是否合规
+ if (isRawFilePackRule)
{
- if (type == typeof(UnityEditor.DefaultAsset))
+ string extension = StringUtility.RemoveFirstChar(System.IO.Path.GetExtension(assetPath));
+ if (extension == EAssetFileExtension.unity.ToString() || extension == EAssetFileExtension.prefab.ToString() ||
+ extension == EAssetFileExtension.fbx.ToString() || extension == EAssetFileExtension.mat.ToString() ||
+ extension == EAssetFileExtension.controller.ToString() || extension == EAssetFileExtension.anim.ToString() ||
+ extension == EAssetFileExtension.ttf.ToString() || extension == EAssetFileExtension.shader.ToString())
+ {
+ UnityEngine.Debug.LogWarning($"Raw file pack rule can not support file estension : {extension}");
+ return false;
+ }
+
+ // 注意:原生文件只支持无依赖关系的资源
+ /*
+ string[] depends = AssetDatabase.GetDependencies(assetPath, true);
+ if (depends.Length != 1)
+ {
+ UnityEngine.Debug.LogWarning($"Raw file pack rule can not support estension : {extension}");
+ return false;
+ }
+ */
+ }
+ else
+ {
+ // 忽略Unity无法识别的无效文件
+ // 注意:只对非原生文件收集器处理
+ if (assetType == typeof(UnityEditor.DefaultAsset))
{
UnityEngine.Debug.LogWarning($"Cannot pack default asset : {assetPath}");
return false;
@@ -251,20 +282,11 @@ namespace YooAsset.Editor
}
string fileExtension = System.IO.Path.GetExtension(assetPath);
- if (IsIgnoreFile(fileExtension))
+ if (DefaultFilterRule.IsIgnoreFile(fileExtension))
return false;
return true;
}
- private bool IsIgnoreFile(string fileExtension)
- {
- foreach (var extension in YooAssetSettings.IgnoreFileExtensions)
- {
- if (extension == fileExtension)
- return true;
- }
- return false;
- }
private bool IsCollectAsset(string assetPath)
{
Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
@@ -275,28 +297,34 @@ namespace YooAsset.Editor
IFilterRule filterRuleInstance = AssetBundleCollectorSettingData.GetFilterRuleInstance(FilterRuleName);
return filterRuleInstance.IsCollectAsset(new FilterRuleData(assetPath));
}
- private string GetAddress(AssetBundleCollectorGroup group, string assetPath)
+ private string GetAddress(CollectCommand command, AssetBundleCollectorGroup group, string assetPath)
{
+ if (command.EnableAddressable == false)
+ return string.Empty;
+
if (CollectorType != ECollectorType.MainAssetCollector)
return string.Empty;
IAddressRule addressRuleInstance = AssetBundleCollectorSettingData.GetAddressRuleInstance(AddressRuleName);
- string adressValue = addressRuleInstance.GetAssetAddress(new AddressRuleData(assetPath, CollectPath, group.GroupName));
+ string adressValue = addressRuleInstance.GetAssetAddress(new AddressRuleData(assetPath, CollectPath, group.GroupName, UserData));
return adressValue;
}
- private string GetBundleName(AssetBundleCollectorGroup group, string assetPath)
+ private string GetBundleName(CollectCommand command, AssetBundleCollectorGroup group, string assetPath)
{
System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
- return EditorTools.GetRegularPath(YooAssetSettings.UnityShadersBundleName).ToLower();
-
- // 根据规则设置获取资源包名称
- IPackRule packRuleInstance = AssetBundleCollectorSettingData.GetPackRuleInstance(PackRuleName);
- string bundleName = packRuleInstance.GetBundleName(new PackRuleData(assetPath, CollectPath, group.GroupName));
- if(YooAssetSettingsData.Setting.RegularBundleName)
- return EditorTools.GetRegularPath(bundleName).Replace('/', '_').Replace('.', '_').ToLower();
+ {
+ // 获取着色器打包规则结果
+ PackRuleResult packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
+ return packRuleResult.GetMainBundleName(command.PackageName, command.UniqueBundleName);
+ }
else
- return EditorTools.GetRegularPath(bundleName).ToLower();
+ {
+ // 获取其它资源打包规则结果
+ IPackRule packRuleInstance = AssetBundleCollectorSettingData.GetPackRuleInstance(PackRuleName);
+ PackRuleResult packRuleResult = packRuleInstance.GetPackRuleResult(new PackRuleData(assetPath, CollectPath, group.GroupName, UserData));
+ return packRuleResult.GetMainBundleName(command.PackageName, command.UniqueBundleName);
+ }
}
private List GetAssetTags(AssetBundleCollectorGroup group)
{
@@ -307,11 +335,11 @@ namespace YooAsset.Editor
}
private List GetAllDependencies(string mainAssetPath)
{
- List result = new List();
string[] depends = AssetDatabase.GetDependencies(mainAssetPath, true);
+ List result = new List(depends.Length);
foreach (string assetPath in depends)
{
- if (IsValidateAsset(assetPath))
+ if (IsValidateAsset(assetPath, false))
{
// 注意:排除主资源对象
if (assetPath != mainAssetPath)
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorConfig.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorConfig.cs
index 1996b0a..7db138a 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorConfig.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorConfig.cs
@@ -10,7 +10,7 @@ namespace YooAsset.Editor
{
public class AssetBundleCollectorConfig
{
- public const string ConfigVersion = "2.2";
+ public const string ConfigVersion = "2.4";
public const string XmlVersion = "Version";
public const string XmlCommon = "Common";
@@ -24,6 +24,7 @@ namespace YooAsset.Editor
public const string XmlPackageDesc = "PackageDesc";
public const string XmlGroup = "Group";
+ public const string XmlGroupActiveRule = "GroupActiveRule";
public const string XmlGroupName = "GroupName";
public const string XmlGroupDesc = "GroupDesc";
@@ -34,6 +35,7 @@ namespace YooAsset.Editor
public const string XmlAddressRule = "AddressRule";
public const string XmlPackRule = "PackRule";
public const string XmlFilterRule = "FilterRule";
+ public const string XmlUserData = "UserData";
public const string XmlAssetTags = "AssetTags";
///
@@ -107,6 +109,8 @@ namespace YooAsset.Editor
foreach (var groupNode in groupNodeList)
{
XmlElement groupElement = groupNode as XmlElement;
+ if (groupElement.HasAttribute(XmlGroupActiveRule) == false)
+ throw new Exception($"Not found attribute {XmlGroupActiveRule} in {XmlGroup}");
if (groupElement.HasAttribute(XmlGroupName) == false)
throw new Exception($"Not found attribute {XmlGroupName} in {XmlGroup}");
if (groupElement.HasAttribute(XmlGroupDesc) == false)
@@ -115,6 +119,7 @@ namespace YooAsset.Editor
throw new Exception($"Not found attribute {XmlAssetTags} in {XmlGroup}");
AssetBundleCollectorGroup group = new AssetBundleCollectorGroup();
+ group.ActiveRuleName = groupElement.GetAttribute(XmlGroupActiveRule);
group.GroupName = groupElement.GetAttribute(XmlGroupName);
group.GroupDesc = groupElement.GetAttribute(XmlGroupDesc);
group.AssetTags = groupElement.GetAttribute(XmlAssetTags);
@@ -137,6 +142,8 @@ namespace YooAsset.Editor
throw new Exception($"Not found attribute {XmlPackRule} in {XmlCollector}");
if (collectorElement.HasAttribute(XmlFilterRule) == false)
throw new Exception($"Not found attribute {XmlFilterRule} in {XmlCollector}");
+ if (collectorElement.HasAttribute(XmlUserData) == false)
+ throw new Exception($"Not found attribute {XmlUserData} in {XmlCollector}");
if (collectorElement.HasAttribute(XmlAssetTags) == false)
throw new Exception($"Not found attribute {XmlAssetTags} in {XmlCollector}");
@@ -147,12 +154,19 @@ namespace YooAsset.Editor
collector.AddressRuleName = collectorElement.GetAttribute(XmlAddressRule);
collector.PackRuleName = collectorElement.GetAttribute(XmlPackRule);
collector.FilterRuleName = collectorElement.GetAttribute(XmlFilterRule);
+ collector.UserData = collectorElement.GetAttribute(XmlUserData);
collector.AssetTags = collectorElement.GetAttribute(XmlAssetTags);
group.Collectors.Add(collector);
}
}
}
+ // 检测配置错误
+ foreach(var package in packages)
+ {
+ package.CheckConfigError();
+ }
+
// 保存配置数据
AssetBundleCollectorSettingData.ClearAll();
AssetBundleCollectorSettingData.Setting.EnableAddressable = enableAddressable;
@@ -204,6 +218,7 @@ namespace YooAsset.Editor
foreach (var group in package.Groups)
{
var groupElement = xmlDoc.CreateElement(XmlGroup);
+ groupElement.SetAttribute(XmlGroupActiveRule, group.ActiveRuleName);
groupElement.SetAttribute(XmlGroupName, group.GroupName);
groupElement.SetAttribute(XmlGroupDesc, group.GroupDesc);
groupElement.SetAttribute(XmlAssetTags, group.AssetTags);
@@ -219,6 +234,7 @@ namespace YooAsset.Editor
collectorElement.SetAttribute(XmlAddressRule, collector.AddressRuleName);
collectorElement.SetAttribute(XmlPackRule, collector.PackRuleName);
collectorElement.SetAttribute(XmlFilterRule, collector.FilterRuleName);
+ collectorElement.SetAttribute(XmlUserData, collector.UserData);
collectorElement.SetAttribute(XmlAssetTags, collector.AssetTags);
groupElement.AppendChild(collectorElement);
}
@@ -320,6 +336,45 @@ namespace YooAsset.Editor
return UpdateXmlConfig(xmlDoc);
}
+ // 2.2 -> 2.3
+ if (configVersion == "2.2")
+ {
+ // 获取所有分组元素
+ var groupNodeList = root.GetElementsByTagName(XmlGroup);
+ foreach (var groupNode in groupNodeList)
+ {
+ XmlElement groupElement = groupNode as XmlElement;
+ var collectorNodeList = groupElement.GetElementsByTagName(XmlCollector);
+ foreach (var collectorNode in collectorNodeList)
+ {
+ XmlElement collectorElement = collectorNode as XmlElement;
+ if (collectorElement.HasAttribute(XmlUserData) == false)
+ collectorElement.SetAttribute(XmlUserData, string.Empty);
+ }
+ }
+
+ // 更新版本
+ root.SetAttribute(XmlVersion, "2.3");
+ return UpdateXmlConfig(xmlDoc);
+ }
+
+ // 2.3 -> 2.4
+ if(configVersion == "2.3")
+ {
+ // 获取所有分组元素
+ var groupNodeList = root.GetElementsByTagName(XmlGroup);
+ foreach (var groupNode in groupNodeList)
+ {
+ XmlElement groupElement = groupNode as XmlElement;
+ if(groupElement.HasAttribute(XmlGroupActiveRule) == false)
+ groupElement.SetAttribute(XmlGroupActiveRule, $"{nameof(EnableGroup)}");
+ }
+
+ // 更新版本
+ root.SetAttribute(XmlVersion, "2.4");
+ return UpdateXmlConfig(xmlDoc);
+ }
+
return false;
}
}
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs
index bfcc7d8..1563147 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs
@@ -100,8 +100,8 @@ namespace YooAsset.Editor
{
if (package.PackageName == packageName)
{
- CollectCommand command = new CollectCommand(buildMode, EnableAddressable);
- CollectResult collectResult = new CollectResult(package.PackageName, EnableAddressable, UniqueBundleName);
+ CollectCommand command = new CollectCommand(buildMode, packageName, EnableAddressable, UniqueBundleName);
+ CollectResult collectResult = new CollectResult(command);
collectResult.SetCollectAssets(package.GetAllCollectAssets(command));
return collectResult;
}
@@ -109,21 +109,5 @@ namespace YooAsset.Editor
throw new Exception($"Not found collector pacakge : {packageName}");
}
-
- ///
- /// 获取所有包裹收集的资源文件
- ///
- public List GetAllPackageAssets(EBuildMode buildMode)
- {
- List collectResultList = new List(1000);
- foreach (var package in Packages)
- {
- CollectCommand command = new CollectCommand(buildMode, EnableAddressable);
- CollectResult collectResult = new CollectResult(package.PackageName, EnableAddressable, UniqueBundleName);
- collectResult.SetCollectAssets(package.GetAllCollectAssets(command));
- collectResultList.Add(collectResult);
- }
- return collectResultList;
- }
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSettingData.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSettingData.cs
index 55600c4..5fd5aee 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSettingData.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSettingData.cs
@@ -27,24 +27,8 @@ namespace YooAsset.Editor
public static bool IsDirty { private set; get; } = false;
- private static AssetBundleCollectorSetting _setting = null;
- public static AssetBundleCollectorSetting Setting
+ static AssetBundleCollectorSettingData()
{
- get
- {
- if (_setting == null)
- LoadSettingData();
- return _setting;
- }
- }
-
- ///
- /// 加载配置文件
- ///
- private static void LoadSettingData()
- {
- _setting = EditorHelper.LoadSettingData();
-
// IPackRule
{
// 清空缓存集合
@@ -108,7 +92,8 @@ namespace YooAsset.Editor
List types = new List(100)
{
typeof(AddressByFileName),
- typeof(AddressByCollectorAndFileName),
+ typeof(AddressByFilePath),
+ typeof(AddressByFolderAndFileName),
typeof(AddressByGroupAndFileName)
};
@@ -146,6 +131,17 @@ namespace YooAsset.Editor
}
}
+ private static AssetBundleCollectorSetting _setting = null;
+ public static AssetBundleCollectorSetting Setting
+ {
+ get
+ {
+ if (_setting == null)
+ _setting = SettingLoader.LoadSettingData();
+ return _setting;
+ }
+ }
+
///
/// 存储配置文件
///
@@ -183,9 +179,6 @@ namespace YooAsset.Editor
public static List GetActiveRuleNames()
{
- if (_setting == null)
- LoadSettingData();
-
List names = new List();
foreach (var pair in _cacheActiveRuleTypes)
{
@@ -198,9 +191,6 @@ namespace YooAsset.Editor
}
public static List GetAddressRuleNames()
{
- if (_setting == null)
- LoadSettingData();
-
List names = new List();
foreach (var pair in _cacheAddressRuleTypes)
{
@@ -213,9 +203,6 @@ namespace YooAsset.Editor
}
public static List GetPackRuleNames()
{
- if (_setting == null)
- LoadSettingData();
-
List names = new List();
foreach (var pair in _cachePackRuleTypes)
{
@@ -228,9 +215,6 @@ namespace YooAsset.Editor
}
public static List GetFilterRuleNames()
{
- if (_setting == null)
- LoadSettingData();
-
List names = new List();
foreach (var pair in _cacheFilterRuleTypes)
{
@@ -243,7 +227,7 @@ namespace YooAsset.Editor
}
private static string GetRuleDisplayName(string name, Type type)
{
- var attribute = EditorAttribute.GetAttribute(type);
+ var attribute = DisplayNameAttributeHelper.GetAttribute(type);
if (attribute != null && string.IsNullOrEmpty(attribute.DisplayName) == false)
return attribute.DisplayName;
else
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs
index 486ce7e..7d9b049 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs
@@ -14,7 +14,7 @@ namespace YooAsset.Editor
[MenuItem("YooAsset/AssetBundle Collector", false, 101)]
public static void ShowExample()
{
- AssetBundleCollectorWindow window = GetWindow("资源包收集工具", true, EditorDefine.DockedWindowTypes);
+ AssetBundleCollectorWindow window = GetWindow("资源包收集工具", true, WindowsDefine.DockedWindowTypes);
window.minSize = new Vector2(800, 600);
}
@@ -70,7 +70,7 @@ namespace YooAsset.Editor
VisualElement root = this.rootVisualElement;
// 加载布局文件
- var visualAsset = EditorHelper.LoadWindowUXML();
+ var visualAsset = UxmlLoader.LoadWindowUXML();
if (visualAsset == null)
return;
@@ -148,6 +148,7 @@ namespace YooAsset.Editor
{
selectPackage.PackageName = evt.newValue;
AssetBundleCollectorSettingData.ModifyPackage(selectPackage);
+ FillPackageViewData();
}
});
@@ -160,6 +161,7 @@ namespace YooAsset.Editor
{
selectPackage.PackageDesc = evt.newValue;
AssetBundleCollectorSettingData.ModifyPackage(selectPackage);
+ FillPackageViewData();
}
});
@@ -594,14 +596,14 @@ namespace YooAsset.Editor
var popupField = new PopupField(_addressRuleList, 0);
popupField.name = "PopupField1";
popupField.style.unityTextAlign = TextAnchor.MiddleLeft;
- popupField.style.width = 200;
+ popupField.style.width = 220;
elementBottom.Add(popupField);
}
{
var popupField = new PopupField(_packRuleList, 0);
popupField.name = "PopupField2";
popupField.style.unityTextAlign = TextAnchor.MiddleLeft;
- popupField.style.width = 230;
+ popupField.style.width = 220;
elementBottom.Add(popupField);
}
{
@@ -611,6 +613,15 @@ namespace YooAsset.Editor
popupField.style.width = 150;
elementBottom.Add(popupField);
}
+ {
+ var textField = new TextField();
+ textField.name = "TextField0";
+ textField.label = "UserData";
+ textField.style.width = 200;
+ elementBottom.Add(textField);
+ var label = textField.Q
public string BundleName { private set; get; }
-
+
///
/// 可寻址地址
///
@@ -25,30 +25,30 @@ namespace YooAsset.Editor
///
public string AssetPath { private set; get; }
- ///
- /// 资源分类标签
- ///
- public List AssetTags { private set; get; }
-
///
/// 是否为原生资源
///
public bool IsRawAsset { private set; get; }
+ ///
+ /// 资源分类标签
+ ///
+ public List AssetTags { private set; get; }
+
///
/// 依赖的资源列表
///
public List DependAssets = new List();
- public CollectAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, List assetTags, bool isRawAsset)
+ public CollectAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, bool isRawAsset, List assetTags)
{
CollectorType = collectorType;
BundleName = bundleName;
Address = address;
AssetPath = assetPath;
- AssetTags = assetTags;
IsRawAsset = isRawAsset;
+ AssetTags = assetTags;
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs b/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs
index 0501a37..c244e1e 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs
@@ -8,15 +8,37 @@ namespace YooAsset.Editor
///
public EBuildMode BuildMode { private set; get; }
+ ///
+ /// 包裹名称
+ ///
+ public string PackageName { private set; get; }
+
///
/// 是否启用可寻址资源定位
///
public bool EnableAddressable { private set; get; }
- public CollectCommand(EBuildMode buildMode, bool enableAddressable)
+ ///
+ /// 资源包名唯一化
+ ///
+ public bool UniqueBundleName { private set; get; }
+
+ ///
+ /// 着色器统一全名称
+ ///
+ public string ShadersBundleName { private set; get; }
+
+
+ public CollectCommand(EBuildMode buildMode, string packageName, bool enableAddressable, bool uniqueBundleName)
{
BuildMode = buildMode;
+ PackageName = packageName;
EnableAddressable = enableAddressable;
+ UniqueBundleName = uniqueBundleName;
+
+ // 着色器统一全名称
+ var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
+ ShadersBundleName = packRuleResult.GetMainBundleName(packageName, uniqueBundleName);
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs b/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs
index 5eca265..1a24cdc 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs
@@ -6,33 +6,19 @@ namespace YooAsset.Editor
public class CollectResult
{
///
- /// 包裹名称
+ /// 收集命令
///
- public string PackageName { private set; get; }
-
- ///
- /// 是否启用可寻址资源定位
- ///
- public bool EnableAddressable { private set; get; }
-
- ///
- /// 资源包名唯一化
- ///
- public bool UniqueBundleName { private set; get; }
+ public CollectCommand Command { private set; get; }
///
/// 收集的资源信息列表
///
public List CollectAssets { private set; get; }
-
- public CollectResult(string packageName, bool enableAddressable, bool uniqueBundleName)
+ public CollectResult(CollectCommand command)
{
- PackageName = packageName;
- EnableAddressable = enableAddressable;
- UniqueBundleName = uniqueBundleName;
+ Command = command;
}
-
public void SetCollectAssets(List collectAssets)
{
CollectAssets = collectAssets;
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultAddressRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultAddressRule.cs
index a2f1936..d23c78b 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultAddressRule.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultAddressRule.cs
@@ -2,7 +2,7 @@
namespace YooAsset.Editor
{
- [DisplayName("以文件名称为定位地址")]
+ [DisplayName("定位地址: 文件名")]
public class AddressByFileName : IAddressRule
{
string IAddressRule.GetAssetAddress(AddressRuleData data)
@@ -11,7 +11,16 @@ namespace YooAsset.Editor
}
}
- [DisplayName("以分组名称+文件名称为定位地址")]
+ [DisplayName("定位地址: 文件路径")]
+ public class AddressByFilePath : IAddressRule
+ {
+ string IAddressRule.GetAssetAddress(AddressRuleData data)
+ {
+ return data.AssetPath;
+ }
+ }
+
+ [DisplayName("定位地址: 分组名+文件名")]
public class AddressByGroupAndFileName : IAddressRule
{
string IAddressRule.GetAssetAddress(AddressRuleData data)
@@ -21,14 +30,14 @@ namespace YooAsset.Editor
}
}
- [DisplayName("以收集器名称+文件名称为定位地址")]
- public class AddressByCollectorAndFileName : IAddressRule
+ [DisplayName("定位地址: 文件夹名+文件名")]
+ public class AddressByFolderAndFileName : IAddressRule
{
string IAddressRule.GetAssetAddress(AddressRuleData data)
{
string fileName = Path.GetFileNameWithoutExtension(data.AssetPath);
- string collectorName = Path.GetFileNameWithoutExtension(data.CollectPath);
- return $"{collectorName}_{fileName}";
+ FileInfo fileInfo = new FileInfo(data.AssetPath);
+ return $"{fileInfo.Directory.Name}_{fileName}";
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs
index eba9b87..931e00a 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs
@@ -1,9 +1,27 @@
-using UnityEngine;
-using UnityEditor;
+using System.Collections;
+using System.Collections.Generic;
using System.IO;
+using UnityEngine;
+using UnityEditor;
namespace YooAsset.Editor
{
+ public class DefaultFilterRule
+ {
+ ///
+ /// 忽略的文件类型
+ ///
+ private readonly static HashSet _ignoreFileExtensions = new HashSet() { "", ".so", ".dll", ".cs", ".js", ".boo", ".meta", ".cginc", ".hlsl" };
+
+ ///
+ /// 查询是否为忽略文件
+ ///
+ public static bool IsIgnoreFile(string fileExtension)
+ {
+ return _ignoreFileExtensions.Contains(fileExtension);
+ }
+ }
+
[DisplayName("收集所有资源")]
public class CollectAll : IFilterRule
{
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs
index 3dbc7c9..563d1e9 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs
@@ -4,18 +4,50 @@ using UnityEditor;
namespace YooAsset.Editor
{
+ public class DefaultPackRule
+ {
+ ///
+ /// AssetBundle文件的后缀名
+ ///
+ public const string AssetBundleFileExtension = "bundle";
+
+ ///
+ /// 原生文件的后缀名
+ ///
+ public const string RawFileExtension = "rawfile";
+
+ ///
+ /// Unity着色器资源包名称
+ ///
+ public const string ShadersBundleName = "unityshaders";
+
+
+ public static PackRuleResult CreateShadersPackRuleResult()
+ {
+ PackRuleResult result = new PackRuleResult(ShadersBundleName, AssetBundleFileExtension);
+ return result;
+ }
+ }
+
///
/// 以文件路径作为资源包名
/// 注意:每个文件独自打资源包
/// 例如:"Assets/UIPanel/Shop/Image/backgroud.png" --> "assets_uipanel_shop_image_backgroud.bundle"
/// 例如:"Assets/UIPanel/Shop/View/main.prefab" --> "assets_uipanel_shop_view_main.bundle"
///
- [DisplayName("以文件路径作为资源包名")]
+ [DisplayName("资源包名: 文件路径")]
public class PackSeparately : IPackRule
{
- string IPackRule.GetBundleName(PackRuleData data)
+ PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data)
{
- return StringUtility.RemoveExtension(data.AssetPath);
+ string bundleName = StringUtility.RemoveExtension(data.AssetPath);
+ PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
+ return result;
+ }
+
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return false;
}
}
@@ -25,14 +57,21 @@ namespace YooAsset.Editor
/// 例如:"Assets/UIPanel/Shop/Image/backgroud.png" --> "assets_uipanel_shop_image.bundle"
/// 例如:"Assets/UIPanel/Shop/View/main.prefab" --> "assets_uipanel_shop_view.bundle"
///
- [DisplayName("以父类文件夹路径作为资源包名")]
+ [DisplayName("资源包名: 父类文件夹路径")]
public class PackDirectory : IPackRule
{
public static PackDirectory StaticPackRule = new PackDirectory();
- string IPackRule.GetBundleName(PackRuleData data)
+ PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data)
{
- return Path.GetDirectoryName(data.AssetPath);
+ string bundleName = Path.GetDirectoryName(data.AssetPath);
+ PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
+ return result;
+ }
+
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return false;
}
}
@@ -43,10 +82,10 @@ namespace YooAsset.Editor
/// 例如:"Assets/UIPanel/Shop/Image/backgroud.png" --> "assets_uipanel_shop.bundle"
/// 例如:"Assets/UIPanel/Shop/View/main.prefab" --> "assets_uipanel_shop.bundle"
///
- [DisplayName("以收集器路径下顶级文件夹为资源包名")]
+ [DisplayName("资源包名: 收集器下顶级文件夹路径")]
public class PackTopDirectory : IPackRule
{
- string IPackRule.GetBundleName(PackRuleData data)
+ PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data)
{
string assetPath = data.AssetPath.Replace(data.CollectPath, string.Empty);
assetPath = assetPath.TrimStart('/');
@@ -56,33 +95,48 @@ namespace YooAsset.Editor
if (Path.HasExtension(splits[0]))
throw new Exception($"Not found root directory : {assetPath}");
string bundleName = $"{data.CollectPath}/{splits[0]}";
- return bundleName;
+ PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
+ return result;
}
else
{
throw new Exception($"Not found root directory : {assetPath}");
}
}
+
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return false;
+ }
}
///
/// 以收集器路径作为资源包名
/// 注意:收集的所有文件打进一个资源包
///
- [DisplayName("以收集器路径作为资源包名")]
+ [DisplayName("资源包名: 收集器路径")]
public class PackCollector : IPackRule
{
- string IPackRule.GetBundleName(PackRuleData data)
+ PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data)
{
+ string bundleName;
string collectPath = data.CollectPath;
if (AssetDatabase.IsValidFolder(collectPath))
{
- return collectPath;
+ bundleName = collectPath;
}
else
{
- return StringUtility.RemoveExtension(collectPath);
+ bundleName = StringUtility.RemoveExtension(collectPath);
}
+
+ PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
+ return result;
+ }
+
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return false;
}
}
@@ -90,51 +144,55 @@ namespace YooAsset.Editor
/// 以分组名称作为资源包名
/// 注意:收集的所有文件打进一个资源包
///
- [DisplayName("以分组名称作为资源包名")]
+ [DisplayName("资源包名: 分组名称")]
public class PackGroup : IPackRule
{
- string IPackRule.GetBundleName(PackRuleData data)
+ PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data)
{
- return data.GroupName;
+ string bundleName = data.GroupName;
+ PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
+ return result;
+ }
+
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return false;
}
}
///
/// 打包原生文件
- /// 注意:原生文件打包支持:图片,音频,视频,文本
///
[DisplayName("打包原生文件")]
public class PackRawFile : IPackRule
{
- string IPackRule.GetBundleName(PackRuleData data)
+ PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data)
{
- string extension = StringUtility.RemoveFirstChar(Path.GetExtension(data.AssetPath));
- if (extension == EAssetFileExtension.unity.ToString() || extension == EAssetFileExtension.prefab.ToString() ||
- extension == EAssetFileExtension.mat.ToString() || extension == EAssetFileExtension.controller.ToString() ||
- extension == EAssetFileExtension.fbx.ToString() || extension == EAssetFileExtension.anim.ToString() ||
- extension == EAssetFileExtension.shader.ToString())
- {
- throw new Exception($"{nameof(PackRawFile)} is not support file estension : {extension}");
- }
+ string bundleName = data.AssetPath;
+ PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.RawFileExtension);
+ return result;
+ }
- // 注意:原生文件只支持无依赖关系的资源
- string[] depends = AssetDatabase.GetDependencies(data.AssetPath, true);
- if (depends.Length != 1)
- throw new Exception($"{nameof(PackRawFile)} is not support estension : {extension}");
-
- return data.AssetPath;
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return true;
}
}
///
/// 打包着色器变种集合
///
- [DisplayName("打包着色器变种集合")]
+ [DisplayName("打包着色器变种集合文件")]
public class PackShaderVariants : IPackRule
{
- public string GetBundleName(PackRuleData data)
+ public PackRuleResult GetPackRuleResult(PackRuleData data)
{
- return YooAssetSettings.UnityShadersBundleName;
+ return DefaultPackRule.CreateShadersPackRuleResult();
+ }
+
+ bool IPackRule.IsRawFilePackRule()
+ {
+ return false;
}
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/EditorAttribute.cs b/Assets/YooAsset/Editor/AssetBundleCollector/DisplayNameAttribute.cs
similarity index 93%
rename from Assets/YooAsset/Editor/EditorAttribute.cs
rename to Assets/YooAsset/Editor/AssetBundleCollector/DisplayNameAttribute.cs
index beecd80..8e001ed 100644
--- a/Assets/YooAsset/Editor/EditorAttribute.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/DisplayNameAttribute.cs
@@ -16,7 +16,7 @@ namespace YooAsset.Editor
}
}
- public static class EditorAttribute
+ public static class DisplayNameAttributeHelper
{
internal static T GetAttribute(Type type) where T : Attribute
{
diff --git a/Assets/YooAsset/Editor/EditorAttribute.cs.meta b/Assets/YooAsset/Editor/AssetBundleCollector/DisplayNameAttribute.cs.meta
similarity index 100%
rename from Assets/YooAsset/Editor/EditorAttribute.cs.meta
rename to Assets/YooAsset/Editor/AssetBundleCollector/DisplayNameAttribute.cs.meta
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/IAddressRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/IAddressRule.cs
index 061f03d..7b4f609 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/IAddressRule.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/IAddressRule.cs
@@ -6,12 +6,14 @@ namespace YooAsset.Editor
public string AssetPath;
public string CollectPath;
public string GroupName;
+ public string UserData;
- public AddressRuleData(string assetPath, string collectPath, string groupName)
+ public AddressRuleData(string assetPath, string collectPath, string groupName, string userData)
{
AssetPath = assetPath;
CollectPath = collectPath;
GroupName = groupName;
+ UserData = userData;
}
}
diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs
index c719002..3e45713 100644
--- a/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs
+++ b/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs
@@ -3,21 +3,64 @@ namespace YooAsset.Editor
{
public struct PackRuleData
{
- public string AssetPath;
+ public string AssetPath;
public string CollectPath;
public string GroupName;
+ public string UserData;
public PackRuleData(string assetPath)
{
AssetPath = assetPath;
CollectPath = string.Empty;
GroupName = string.Empty;
+ UserData = string.Empty;
}
- public PackRuleData(string assetPath, string collectPath, string groupName)
+ public PackRuleData(string assetPath, string collectPath, string groupName, string userData)
{
AssetPath = assetPath;
CollectPath = collectPath;
GroupName = groupName;
+ UserData = userData;
+ }
+ }
+
+ public struct PackRuleResult
+ {
+ private readonly string _bundleName;
+ private readonly string _bundleExtension;
+
+ public PackRuleResult(string bundleName, string bundleExtension)
+ {
+ _bundleName = bundleName;
+ _bundleExtension = bundleExtension;
+ }
+
+ ///
+ /// 获取主资源包全名称
+ ///
+ public string GetMainBundleName(string packageName, bool uniqueBundleName)
+ {
+ string fullName;
+ string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower();
+ if (uniqueBundleName)
+ fullName = $"{packageName}_{bundleName}.{_bundleExtension}";
+ else
+ fullName = $"{bundleName}.{_bundleExtension}";
+ return fullName.ToLower();
+ }
+
+ ///
+ /// 获取共享资源包全名称
+ ///
+ public string GetShareBundleName(string packageName, bool uniqueBundleName)
+ {
+ string fullName;
+ string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower();
+ if (uniqueBundleName)
+ fullName = $"{packageName}_share_{bundleName}.{_bundleExtension}";
+ else
+ fullName = $"share_{bundleName}.{_bundleExtension}";
+ return fullName.ToLower();
}
}
@@ -27,8 +70,13 @@ namespace YooAsset.Editor
public interface IPackRule
{
///
- /// 获取资源打包所属的资源包名称
+ /// 获取打包规则结果
///
- string GetBundleName(PackRuleData data);
+ PackRuleResult GetPackRuleResult(PackRuleData data);
+
+ ///
+ /// 是否为原生文件打包规则
+ ///
+ bool IsRawFilePackRule();
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs b/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs
index adda79d..19a3012 100644
--- a/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs
+++ b/Assets/YooAsset/Editor/AssetBundleDebugger/AssetBundleDebuggerWindow.cs
@@ -15,7 +15,7 @@ namespace YooAsset.Editor
[MenuItem("YooAsset/AssetBundle Debugger", false, 104)]
public static void ShowExample()
{
- AssetBundleDebuggerWindow wnd = GetWindow("资源包调试工具", true, EditorDefine.DockedWindowTypes);
+ AssetBundleDebuggerWindow wnd = GetWindow("资源包调试工具", true, WindowsDefine.DockedWindowTypes);
wnd.minSize = new Vector2(800, 600);
}
@@ -63,7 +63,7 @@ namespace YooAsset.Editor
VisualElement root = rootVisualElement;
// 加载布局文件
- var visualAsset = EditorHelper.LoadWindowUXML();
+ var visualAsset = UxmlLoader.LoadWindowUXML();
if (visualAsset == null)
return;
diff --git a/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerAssetListViewer.cs b/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerAssetListViewer.cs
index 389f9bb..edc150b 100644
--- a/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerAssetListViewer.cs
+++ b/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerAssetListViewer.cs
@@ -24,7 +24,7 @@ namespace YooAsset.Editor
public void InitViewer()
{
// 加载布局文件
- _visualAsset = EditorHelper.LoadWindowUXML();
+ _visualAsset = UxmlLoader.LoadWindowUXML();
if (_visualAsset == null)
return;
@@ -45,6 +45,10 @@ namespace YooAsset.Editor
_dependListView = _root.Q("BottomListView");
_dependListView.makeItem = MakeDependListViewItem;
_dependListView.bindItem = BindDependListViewItem;
+
+#if UNITY_2020_3_OR_NEWER
+ SplitView.Adjuster(_root);
+#endif
}
///
diff --git a/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerBundleListViewer.cs b/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerBundleListViewer.cs
index cb68f3a..c4a2e6d 100644
--- a/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerBundleListViewer.cs
+++ b/Assets/YooAsset/Editor/AssetBundleDebugger/VisualViewers/DebuggerBundleListViewer.cs
@@ -24,7 +24,7 @@ namespace YooAsset.Editor
public void InitViewer()
{
// 加载布局文件
- _visualAsset = EditorHelper.LoadWindowUXML();
+ _visualAsset = UxmlLoader.LoadWindowUXML();
if (_visualAsset == null)
return;
@@ -45,6 +45,10 @@ namespace YooAsset.Editor
_usingListView = _root.Q("BottomListView");
_usingListView.makeItem = MakeIncludeListViewItem;
_usingListView.bindItem = BindIncludeListViewItem;
+
+#if UNITY_2020_3_OR_NEWER
+ SplitView.Adjuster(_root);
+#endif
}
///
diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs
index 5cc2dd4..15009da 100644
--- a/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs
+++ b/Assets/YooAsset/Editor/AssetBundleReporter/AssetBundleReporterWindow.cs
@@ -12,7 +12,7 @@ namespace YooAsset.Editor
[MenuItem("YooAsset/AssetBundle Reporter", false, 103)]
public static void ShowExample()
{
- AssetBundleReporterWindow window = GetWindow("资源包报告工具", true, EditorDefine.DockedWindowTypes);
+ AssetBundleReporterWindow window = GetWindow("资源包报告工具", true, WindowsDefine.DockedWindowTypes);
window.minSize = new Vector2(800, 600);
}
@@ -55,7 +55,7 @@ namespace YooAsset.Editor
VisualElement root = this.rootVisualElement;
// 加载布局文件
- var visualAsset = EditorHelper.LoadWindowUXML();
+ var visualAsset = UxmlLoader.LoadWindowUXML();
if (visualAsset == null)
return;
diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.cs
index 7830871..9417146 100644
--- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.cs
+++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.cs
@@ -38,7 +38,7 @@ namespace YooAsset.Editor
public void InitViewer()
{
// 加载布局文件
- _visualAsset = EditorHelper.LoadWindowUXML();
+ _visualAsset = UxmlLoader.LoadWindowUXML();
if (_visualAsset == null)
return;
@@ -68,6 +68,10 @@ namespace YooAsset.Editor
_dependListView = _root.Q("BottomListView");
_dependListView.makeItem = MakeDependListViewItem;
_dependListView.bindItem = BindDependListViewItem;
+
+#if UNITY_2020_3_OR_NEWER
+ SplitView.Adjuster(_root);
+#endif
}
///
diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.uxml b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.uxml
index 18391ae..a957c06 100644
--- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.uxml
+++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterAssetListViewer.uxml
@@ -1,10 +1,10 @@
-
+
-
+
diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.cs
index 35d800e..18ddfcc 100644
--- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.cs
+++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.cs
@@ -42,7 +42,7 @@ namespace YooAsset.Editor
public void InitViewer()
{
// 加载布局文件
- _visualAsset = EditorHelper.LoadWindowUXML();
+ _visualAsset = UxmlLoader.LoadWindowUXML();
if (_visualAsset == null)
return;
@@ -76,6 +76,10 @@ namespace YooAsset.Editor
_includeListView = _root.Q("BottomListView");
_includeListView.makeItem = MakeIncludeListViewItem;
_includeListView.bindItem = BindIncludeListViewItem;
+
+#if UNITY_2020_3_OR_NEWER
+ SplitView.Adjuster(_root);
+#endif
}
///
diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.uxml b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.uxml
index 73f0c86..460124c 100644
--- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.uxml
+++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterBundleListViewer.uxml
@@ -1,21 +1,19 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs
index c78b4c4..a12b53b 100644
--- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs
+++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs
@@ -27,7 +27,6 @@ namespace YooAsset.Editor
private TemplateContainer _root;
private ListView _listView;
- private BuildReport _buildReport;
private readonly List _items = new List();
@@ -37,7 +36,7 @@ namespace YooAsset.Editor
public void InitViewer()
{
// 加载布局文件
- _visualAsset = EditorHelper.LoadWindowUXML();
+ _visualAsset = UxmlLoader.LoadWindowUXML();
if (_visualAsset == null)
return;
@@ -55,14 +54,12 @@ namespace YooAsset.Editor
///
public void FillViewData(BuildReport buildReport)
{
- _buildReport = buildReport;
-
_items.Clear();
_items.Add(new ItemWrapper("YooAsset版本", buildReport.Summary.YooVersion));
_items.Add(new ItemWrapper("引擎版本", buildReport.Summary.UnityVersion));
_items.Add(new ItemWrapper("构建时间", buildReport.Summary.BuildDate));
- _items.Add(new ItemWrapper("构建耗时", $"{buildReport.Summary.BuildSeconds}秒"));
+ _items.Add(new ItemWrapper("构建耗时", ConvertTime(buildReport.Summary.BuildSeconds)));
_items.Add(new ItemWrapper("构建平台", $"{buildReport.Summary.BuildTarget}"));
_items.Add(new ItemWrapper("构建管线", $"{buildReport.Summary.BuildPipeline}"));
_items.Add(new ItemWrapper("构建模式", $"{buildReport.Summary.BuildMode}"));
@@ -154,16 +151,23 @@ namespace YooAsset.Editor
label2.text = itemWrapper.Value;
}
+ private string ConvertTime(int time)
+ {
+ if (time <= 60)
+ {
+ return $"{time}秒钟";
+ }
+ else
+ {
+ int minute = time / 60;
+ return $"{minute}分钟";
+ }
+ }
private string ConvertSize(long size)
{
if (size == 0)
return "0";
- if (size < 1024)
- return $"{size} Bytes";
- else if (size < 1024 * 1024)
- return $"{(int)(size / 1024)} KB";
- else
- return $"{(int)(size / (1024 * 1024))} MB";
+ return EditorUtility.FormatBytes(size);
}
}
}
diff --git a/Assets/YooAsset/Editor/EditorDefine.cs b/Assets/YooAsset/Editor/EditorDefine.cs
index cbb03fc..1cff7da 100644
--- a/Assets/YooAsset/Editor/EditorDefine.cs
+++ b/Assets/YooAsset/Editor/EditorDefine.cs
@@ -2,13 +2,13 @@
namespace YooAsset.Editor
{
- public class EditorDefine
+ public class WindowsDefine
{
#if UNITY_2019_4_OR_NEWER
///
/// 停靠窗口类型集合
///
- public static readonly Type[] DockedWindowTypes =
+ public static readonly Type[] DockedWindowTypes =
{
typeof(AssetBundleBuilderWindow),
typeof(AssetBundleCollectorWindow),
diff --git a/Assets/YooAsset/Editor/EditorHelper.cs b/Assets/YooAsset/Editor/EditorHelper.cs
deleted file mode 100644
index 08b3b4a..0000000
--- a/Assets/YooAsset/Editor/EditorHelper.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using UnityEditor;
-
-namespace YooAsset.Editor
-{
- public class EditorHelper
- {
-#if UNITY_2019_4_OR_NEWER
- private readonly static Dictionary _uxmlDic = new Dictionary();
-
- /*
- static EditorHelper()
- {
- // 资源包收集
- _uxmlDic.Add(typeof(AssetBundleCollectorWindow), "355c4ac5cdebddc4c8362bed6f17a79e");
-
- // 资源包构建
- _uxmlDic.Add(typeof(AssetBundleBuilderWindow), "28ba29adb4949284e8c48893218b0d9a");
-
- // 资源包调试
- _uxmlDic.Add(typeof(AssetBundleDebuggerWindow), "790db12999afd334e8fb6ba70ef0a947");
- _uxmlDic.Add(typeof(DebuggerAssetListViewer), "31c6096c1cb29b4469096b7b4942a322");
- _uxmlDic.Add(typeof(DebuggerBundleListViewer), "932a25ffd05c13c47994d66e9d73bc37");
-
- // 构建报告
- _uxmlDic.Add(typeof(AssetBundleReporterWindow), "9052b72c383e95043a0c7e7f369b1ad7");
- _uxmlDic.Add(typeof(ReporterSummaryViewer), "f8929271050855e42a1ccc6b14993a04");
- _uxmlDic.Add(typeof(ReporterAssetListViewer), "5f81bc15a55ee0a49a266f9d71e2372b");
- _uxmlDic.Add(typeof(ReporterBundleListViewer), "56d6dbe0d65ce334a8996beb19612989");
- }
-
- ///
- /// 加载窗口的布局文件
- ///
- public static UnityEngine.UIElements.VisualTreeAsset LoadWindowUXML() where TWindow : class
- {
- var windowType = typeof(TWindow);
- if (_uxmlDic.TryGetValue(windowType, out string uxmlGUID))
- {
- string assetPath = AssetDatabase.GUIDToAssetPath(uxmlGUID);
- if (string.IsNullOrEmpty(assetPath))
- throw new System.Exception($"Invalid YooAsset uxml guid : {uxmlGUID}");
- var visualTreeAsset = AssetDatabase.LoadAssetAtPath(assetPath);
- if (visualTreeAsset == null)
- throw new System.Exception($"Failed to load {windowType}.uxml");
- return visualTreeAsset;
- }
- else
- {
- throw new System.Exception($"Invalid YooAsset window type : {windowType}");
- }
- }
- */
-
- ///
- /// 加载窗口的布局文件
- ///
- public static UnityEngine.UIElements.VisualTreeAsset LoadWindowUXML() where TWindow : class
- {
- var windowType = typeof(TWindow);
-
- // 缓存里查询并加载
- if (_uxmlDic.TryGetValue(windowType, out string uxmlGUID))
- {
- string assetPath = AssetDatabase.GUIDToAssetPath(uxmlGUID);
- if (string.IsNullOrEmpty(assetPath))
- {
- _uxmlDic.Clear();
- throw new System.Exception($"Invalid UXML GUID : {uxmlGUID} ! Please close the window and open it again !");
- }
- var treeAsset = AssetDatabase.LoadAssetAtPath(assetPath);
- return treeAsset;
- }
-
- // 全局搜索并加载
- string[] guids = AssetDatabase.FindAssets(windowType.Name);
- if (guids.Length == 0)
- throw new System.Exception($"Not found any assets : {windowType.Name}");
-
- foreach (string assetGUID in guids)
- {
- string assetPath = AssetDatabase.GUIDToAssetPath(assetGUID);
- var assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
- if (assetType == typeof(UnityEngine.UIElements.VisualTreeAsset))
- {
- _uxmlDic.Add(windowType, assetGUID);
- var treeAsset = AssetDatabase.LoadAssetAtPath(assetPath);
- return treeAsset;
- }
- }
- throw new System.Exception($"Not found UXML file : {windowType.Name}");
- }
-#endif
-
- ///
- /// 加载相关的配置文件
- ///
- public static TSetting LoadSettingData() where TSetting : ScriptableObject
- {
- var settingType = typeof(TSetting);
- var guids = AssetDatabase.FindAssets($"t:{settingType.Name}");
- if (guids.Length == 0)
- {
- Debug.LogWarning($"Create new {settingType.Name}.asset");
- var setting = ScriptableObject.CreateInstance();
- string filePath = $"Assets/{settingType.Name}.asset";
- AssetDatabase.CreateAsset(setting, filePath);
- AssetDatabase.SaveAssets();
- AssetDatabase.Refresh();
- return setting;
- }
- else
- {
- if (guids.Length != 1)
- {
- foreach (var guid in guids)
- {
- string path = AssetDatabase.GUIDToAssetPath(guid);
- Debug.LogWarning($"Found multiple file : {path}");
- }
- throw new System.Exception($"Found multiple {settingType.Name} files !");
- }
-
- string filePath = AssetDatabase.GUIDToAssetPath(guids[0]);
- var setting = AssetDatabase.LoadAssetAtPath(filePath);
- return setting;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/EditorTools.cs b/Assets/YooAsset/Editor/EditorTools.cs
index 8b33a51..a03830f 100644
--- a/Assets/YooAsset/Editor/EditorTools.cs
+++ b/Assets/YooAsset/Editor/EditorTools.cs
@@ -582,7 +582,7 @@ namespace YooAsset.Editor
/// 关键字
/// 分割的结果里是否包含关键字
/// 是否使用初始匹配的位置,否则使用末尾匹配的位置
- private static string Substring(string content, string key, bool includeKey, bool firstMatch = true)
+ public static string Substring(string content, string key, bool includeKey, bool firstMatch = true)
{
if (string.IsNullOrEmpty(key))
return content;
diff --git a/Assets/YooAsset/Editor/SettingLoader.cs b/Assets/YooAsset/Editor/SettingLoader.cs
new file mode 100644
index 0000000..2aaf434
--- /dev/null
+++ b/Assets/YooAsset/Editor/SettingLoader.cs
@@ -0,0 +1,45 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+
+namespace YooAsset.Editor
+{
+ public class SettingLoader
+ {
+ ///
+ /// 加载相关的配置文件
+ ///
+ public static TSetting LoadSettingData() where TSetting : ScriptableObject
+ {
+ var settingType = typeof(TSetting);
+ var guids = AssetDatabase.FindAssets($"t:{settingType.Name}");
+ if (guids.Length == 0)
+ {
+ Debug.LogWarning($"Create new {settingType.Name}.asset");
+ var setting = ScriptableObject.CreateInstance();
+ string filePath = $"Assets/{settingType.Name}.asset";
+ AssetDatabase.CreateAsset(setting, filePath);
+ AssetDatabase.SaveAssets();
+ AssetDatabase.Refresh();
+ return setting;
+ }
+ else
+ {
+ if (guids.Length != 1)
+ {
+ foreach (var guid in guids)
+ {
+ string path = AssetDatabase.GUIDToAssetPath(guid);
+ Debug.LogWarning($"Found multiple file : {path}");
+ }
+ throw new System.Exception($"Found multiple {settingType.Name} files !");
+ }
+
+ string filePath = AssetDatabase.GUIDToAssetPath(guids[0]);
+ var setting = AssetDatabase.LoadAssetAtPath(filePath);
+ return setting;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/EditorHelper.cs.meta b/Assets/YooAsset/Editor/SettingLoader.cs.meta
similarity index 100%
rename from Assets/YooAsset/Editor/EditorHelper.cs.meta
rename to Assets/YooAsset/Editor/SettingLoader.cs.meta
diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs
index 1d69b1b..420e7e4 100644
--- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs
+++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollector.cs
@@ -12,134 +12,169 @@ namespace YooAsset.Editor
{
public static class ShaderVariantCollector
{
+ private enum ESteps
+ {
+ None,
+ Prepare,
+ CollectAllMaterial,
+ CollectVariants,
+ CollectSleeping,
+ WaitingDone,
+ }
+
private const float WaitMilliseconds = 1000f;
- private static string _saveFilePath;
- private static bool _isStarted = false;
- private static readonly Stopwatch _elapsedTime = new Stopwatch();
+ private const float SleepMilliseconds = 100f;
+ private static string _savePath;
+ private static string _packageName;
+ private static int _processMaxNum;
private static Action _completedCallback;
- private static void EditorUpdate()
- {
- // 注意:一定要延迟保存才会起效
- if (_isStarted && _elapsedTime.ElapsedMilliseconds > WaitMilliseconds)
- {
- _isStarted = false;
- _elapsedTime.Stop();
- EditorApplication.update -= EditorUpdate;
+ private static ESteps _steps = ESteps.None;
+ private static Stopwatch _elapsedTime;
+ private static List _allMaterials;
+ private static List _allSpheres = new List(1000);
- // 保存结果
- ShaderVariantCollectionHelper.SaveCurrentShaderVariantCollection(_saveFilePath);
-
- // 创建清单
- CreateManifest();
-
- Debug.Log($"搜集SVC完毕!");
- _completedCallback?.Invoke();
- }
- }
///
/// 开始收集
///
- public static void Run(string saveFilePath, Action completedCallback)
+ public static void Run(string savePath, string packageName, int processMaxNum, Action completedCallback)
{
- if (_isStarted)
+ if (_steps != ESteps.None)
return;
- if (Path.HasExtension(saveFilePath) == false)
- saveFilePath = $"{saveFilePath}.shadervariants";
- if (Path.GetExtension(saveFilePath) != ".shadervariants")
+ if (Path.HasExtension(savePath) == false)
+ savePath = $"{savePath}.shadervariants";
+ if (Path.GetExtension(savePath) != ".shadervariants")
throw new System.Exception("Shader variant file extension is invalid.");
+ if (string.IsNullOrEmpty(packageName))
+ throw new System.Exception("Package name is null or empty !");
// 注意:先删除再保存,否则ShaderVariantCollection内容将无法及时刷新
- AssetDatabase.DeleteAsset(ShaderVariantCollectorSettingData.Setting.SavePath);
- EditorTools.CreateFileDirectory(saveFilePath);
- _saveFilePath = saveFilePath;
+ AssetDatabase.DeleteAsset(savePath);
+ EditorTools.CreateFileDirectory(savePath);
+ _savePath = savePath;
+ _packageName = packageName;
+ _processMaxNum = processMaxNum;
_completedCallback = completedCallback;
// 聚焦到游戏窗口
EditorTools.FocusUnityGameWindow();
- // 清空旧数据
- ShaderVariantCollectionHelper.ClearCurrentShaderVariantCollection();
-
// 创建临时测试场景
CreateTempScene();
- // 收集着色器变种
- var materials = GetAllMaterials();
- CollectVariants(materials);
-
+ _steps = ESteps.Prepare;
EditorApplication.update += EditorUpdate;
- _isStarted = true;
- _elapsedTime.Reset();
- _elapsedTime.Start();
}
+ private static void EditorUpdate()
+ {
+ if (_steps == ESteps.None)
+ return;
+
+ if (_steps == ESteps.Prepare)
+ {
+ ShaderVariantCollectionHelper.ClearCurrentShaderVariantCollection();
+ _steps = ESteps.CollectAllMaterial;
+ return; //等待一帧
+ }
+
+ if (_steps == ESteps.CollectAllMaterial)
+ {
+ _allMaterials = GetAllMaterials();
+ _steps = ESteps.CollectVariants;
+ return; //等待一帧
+ }
+
+ if (_steps == ESteps.CollectVariants)
+ {
+ int count = Mathf.Min(_processMaxNum, _allMaterials.Count);
+ List range = _allMaterials.GetRange(0, count);
+ _allMaterials.RemoveRange(0, count);
+ CollectVariants(range);
+
+ if (_allMaterials.Count > 0)
+ {
+ _elapsedTime = Stopwatch.StartNew();
+ _steps = ESteps.CollectSleeping;
+ }
+ else
+ {
+ _elapsedTime = Stopwatch.StartNew();
+ _steps = ESteps.WaitingDone;
+ }
+ }
+
+ if (_steps == ESteps.CollectSleeping)
+ {
+ if (_elapsedTime.ElapsedMilliseconds > SleepMilliseconds)
+ {
+ DestroyAllSpheres();
+ _elapsedTime.Stop();
+ _steps = ESteps.CollectVariants;
+ }
+ }
+
+ if (_steps == ESteps.WaitingDone)
+ {
+ // 注意:一定要延迟保存才会起效
+ if (_elapsedTime.ElapsedMilliseconds > WaitMilliseconds)
+ {
+ _elapsedTime.Stop();
+ _steps = ESteps.None;
+
+ // 保存结果并创建清单
+ ShaderVariantCollectionHelper.SaveCurrentShaderVariantCollection(_savePath);
+ CreateManifest();
+
+ Debug.Log($"搜集SVC完毕!");
+ EditorApplication.update -= EditorUpdate;
+ _completedCallback?.Invoke();
+ }
+ }
+ }
private static void CreateTempScene()
{
EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects);
}
- private static List GetAllMaterials()
+ private static List GetAllMaterials()
{
int progressValue = 0;
List allAssets = new List(1000);
// 获取所有打包的资源
- List allCollectAssetInfos = new List();
- List collectResults = AssetBundleCollectorSettingData.Setting.GetAllPackageAssets(EBuildMode.DryRunBuild);
- foreach (var collectResult in collectResults)
+ CollectResult collectResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(EBuildMode.DryRunBuild, _packageName);
+ foreach (var assetInfo in collectResult.CollectAssets)
{
- allCollectAssetInfos.AddRange(collectResult.CollectAssets);
- }
- List allAssetPath = allCollectAssetInfos.Select(t => t.AssetPath).ToList();
- foreach (var assetPath in allAssetPath)
- {
- string[] depends = AssetDatabase.GetDependencies(assetPath, true);
- foreach (var depend in depends)
+ string[] depends = AssetDatabase.GetDependencies(assetInfo.AssetPath, true);
+ foreach (var dependAsset in depends)
{
- if (allAssets.Contains(depend) == false)
- allAssets.Add(depend);
+ if (allAssets.Contains(dependAsset) == false)
+ allAssets.Add(dependAsset);
}
- EditorTools.DisplayProgressBar("获取所有打包资源", ++progressValue, allAssetPath.Count);
+ EditorTools.DisplayProgressBar("获取所有打包资源", ++progressValue, collectResult.CollectAssets.Count);
}
EditorTools.ClearProgressBar();
// 搜集所有材质球
progressValue = 0;
- var shaderDic = new Dictionary>(100);
+ List allMaterial = new List(1000);
foreach (var assetPath in allAssets)
{
System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
if (assetType == typeof(UnityEngine.Material))
{
- var material = AssetDatabase.LoadAssetAtPath(assetPath);
- var shader = material.shader;
- if (shader == null)
- continue;
-
- if (shaderDic.ContainsKey(shader) == false)
- {
- shaderDic.Add(shader, new List());
- }
- if (shaderDic[shader].Contains(material) == false)
- {
- shaderDic[shader].Add(material);
- }
+ allMaterial.Add(assetPath);
}
EditorTools.DisplayProgressBar("搜集所有材质球", ++progressValue, allAssets.Count);
}
EditorTools.ClearProgressBar();
// 返回结果
- var materials = new List(1000);
- foreach (var valuePair in shaderDic)
- {
- materials.AddRange(valuePair.Value);
- }
- return materials;
+ return allMaterial;
}
- private static void CollectVariants(List materials)
+ private static void CollectVariants(List materials)
{
Camera camera = Camera.main;
if (camera == null)
@@ -164,7 +199,9 @@ namespace YooAsset.Editor
{
var material = materials[i];
var position = new Vector3(x - halfWidth + 1f, y - halfHeight + 1f, 0f);
- CreateSphere(material, position, i);
+ var go = CreateSphere(material, position, i);
+ if (go != null)
+ _allSpheres.Add(go);
if (x == xMax)
{
x = 0;
@@ -174,27 +211,44 @@ namespace YooAsset.Editor
{
x++;
}
- EditorTools.DisplayProgressBar("测试所有材质球", ++progressValue, materials.Count);
+ EditorTools.DisplayProgressBar("照射所有材质球", ++progressValue, materials.Count);
}
EditorTools.ClearProgressBar();
}
- private static void CreateSphere(Material material, Vector3 position, int index)
+ private static GameObject CreateSphere(string assetPath, Vector3 position, int index)
{
+ var material = AssetDatabase.LoadAssetAtPath(assetPath);
+ var shader = material.shader;
+ if (shader == null)
+ return null;
+
var go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
- go.GetComponent().material = material;
+ go.GetComponent().sharedMaterial = material;
go.transform.position = position;
- go.name = $"Sphere_{index}|{material.name}";
+ go.name = $"Sphere_{index} | {material.name}";
+ return go;
+ }
+ private static void DestroyAllSpheres()
+ {
+ foreach(var go in _allSpheres)
+ {
+ GameObject.DestroyImmediate(go);
+ }
+ _allSpheres.Clear();
+
+ // 尝试释放编辑器加载的资源
+ EditorUtility.UnloadUnusedAssetsImmediate(true);
}
private static void CreateManifest()
{
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
- ShaderVariantCollection svc = AssetDatabase.LoadAssetAtPath(_saveFilePath);
+ ShaderVariantCollection svc = AssetDatabase.LoadAssetAtPath(_savePath);
if (svc != null)
{
var wrapper = ShaderVariantCollectionManifest.Extract(svc);
string jsonData = JsonUtility.ToJson(wrapper, true);
- string savePath = _saveFilePath.Replace(".shadervariants", ".json");
+ string savePath = _savePath.Replace(".shadervariants", ".json");
File.WriteAllText(savePath, jsonData);
}
diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSetting.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSetting.cs
index d7e9851..658cb1a 100644
--- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSetting.cs
+++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSetting.cs
@@ -8,5 +8,15 @@ namespace YooAsset.Editor
/// 文件存储路径
///
public string SavePath = "Assets/MyShaderVariants.shadervariants";
+
+ ///
+ /// 收集的包裹名称
+ ///
+ public string CollectPackage = string.Empty;
+
+ ///
+ /// 容器值
+ ///
+ public int ProcessCapacity = 1000;
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSettingData.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSettingData.cs
index 465add8..7b097cf 100644
--- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSettingData.cs
+++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorSettingData.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
-using System.Linq;
using UnityEngine;
using UnityEditor;
@@ -20,12 +19,17 @@ namespace YooAsset.Editor
}
}
+ ///
+ /// 配置数据是否被修改
+ ///
+ public static bool IsDirty { set; get; } = false;
+
///
/// 加载配置文件
///
private static void LoadSettingData()
{
- _setting = EditorHelper.LoadSettingData();
+ _setting = SettingLoader.LoadSettingData();
}
///
@@ -35,6 +39,7 @@ namespace YooAsset.Editor
{
if (Setting != null)
{
+ IsDirty = false;
EditorUtility.SetDirty(Setting);
AssetDatabase.SaveAssets();
Debug.Log($"{nameof(ShaderVariantCollectorSetting)}.asset is saved!");
diff --git a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs
index 9d8b9d9..46e9d39 100644
--- a/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs
+++ b/Assets/YooAsset/Editor/ShaderVariantCollector/ShaderVariantCollectorWindow.cs
@@ -14,14 +14,19 @@ namespace YooAsset.Editor
[MenuItem("YooAsset/ShaderVariant Collector", false, 201)]
public static void ShowExample()
{
- ShaderVariantCollectorWindow window = GetWindow("着色器变种收集工具", true, EditorDefine.DockedWindowTypes);
+ ShaderVariantCollectorWindow window = GetWindow("着色器变种收集工具", true, WindowsDefine.DockedWindowTypes);
window.minSize = new Vector2(800, 600);
}
+ private List _packageNames;
+
+ private Button _saveButton;
private Button _collectButton;
private TextField _collectOutputField;
private Label _currentShaderCountField;
private Label _currentVariantCountField;
+ private SliderInt _processCapacitySlider;
+ private PopupField _packageField;
public void CreateGUI()
{
@@ -30,36 +35,103 @@ namespace YooAsset.Editor
VisualElement root = this.rootVisualElement;
// 加载布局文件
- var visualAsset = EditorHelper.LoadWindowUXML();
+ var visualAsset = UxmlLoader.LoadWindowUXML();
if (visualAsset == null)
return;
visualAsset.CloneTree(root);
+ // 配置保存按钮
+ _saveButton = root.Q
public void UnloadUnusedAssets()
{
+ if (_isUnloadSafe == false)
+ {
+ YooLogger.Warning("Can not unload unused assets when processing resource loading !");
+ return;
+ }
+
// 注意:资源包之间可能存在多层深层嵌套,需要多次循环释放。
int loopCount = 10;
for (int i = 0; i < loopCount; i++)
@@ -102,32 +123,21 @@ namespace YooAsset
}
private void UnloadUnusedAssetsInternal()
{
- if (_simulationOnEditor)
+ for (int i = _loaderList.Count - 1; i >= 0; i--)
{
- for (int i = _providers.Count - 1; i >= 0; i--)
- {
- if (_providers[i].CanDestroy())
- {
- _providers[i].Destroy();
- _providers.RemoveAt(i);
- }
- }
+ BundleLoaderBase loader = _loaderList[i];
+ loader.TryDestroyAllProviders();
}
- else
+
+ for (int i = _loaderList.Count - 1; i >= 0; i--)
{
- for (int i = _loaders.Count - 1; i >= 0; i--)
+ BundleLoaderBase loader = _loaderList[i];
+ if (loader.CanDestroy())
{
- BundleLoaderBase loader = _loaders[i];
- loader.TryDestroyAllProviders();
- }
- for (int i = _loaders.Count - 1; i >= 0; i--)
- {
- BundleLoaderBase loader = _loaders[i];
- if (loader.CanDestroy())
- {
- loader.Destroy(false);
- _loaders.RemoveAt(i);
- }
+ string bundleName = loader.MainBundleInfo.Bundle.BundleName;
+ loader.Destroy(false);
+ _loaderList.RemoveAt(i);
+ _loaderDic.Remove(bundleName);
}
}
}
@@ -137,17 +147,19 @@ namespace YooAsset
///
public void ForceUnloadAllAssets()
{
- foreach (var provider in _providers)
+ foreach (var provider in _providerList)
{
provider.Destroy();
}
- foreach (var loader in _loaders)
+ foreach (var loader in _loaderList)
{
loader.Destroy(true);
}
- _providers.Clear();
- _loaders.Clear();
+ _providerList.Clear();
+ _providerDic.Clear();
+ _loaderList.Clear();
+ _loaderDic.Clear();
ClearSceneHandle();
// 注意:调用底层接口释放所有资源
@@ -182,7 +194,8 @@ namespace YooAsset
else
provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode, activateOnLoad, priority);
provider.InitSpawnDebugInfo();
- _providers.Add(provider);
+ _providerList.Add(provider);
+ _providerDic.Add(providerGUID, provider);
}
var handle = provider.CreateHandle();
@@ -213,7 +226,8 @@ namespace YooAsset
else
provider = new BundledAssetProvider(this, providerGUID, assetInfo);
provider.InitSpawnDebugInfo();
- _providers.Add(provider);
+ _providerList.Add(provider);
+ _providerDic.Add(providerGUID, provider);
}
return provider.CreateHandle();
}
@@ -240,7 +254,8 @@ namespace YooAsset
else
provider = new BundledSubAssetsProvider(this, providerGUID, assetInfo);
provider.InitSpawnDebugInfo();
- _providers.Add(provider);
+ _providerList.Add(provider);
+ _providerDic.Add(providerGUID, provider);
}
return provider.CreateHandle();
}
@@ -267,7 +282,8 @@ namespace YooAsset
else
provider = new BundledRawFileProvider(this, providerGUID, assetInfo);
provider.InitSpawnDebugInfo();
- _providers.Add(provider);
+ _providerList.Add(provider);
+ _providerDic.Add(providerGUID, provider);
}
return provider.CreateHandle();
}
@@ -281,9 +297,6 @@ namespace YooAsset
// 释放子场景句柄
_sceneHandles[providerGUID].ReleaseInternal();
_sceneHandles.Remove(providerGUID);
-
- // 卸载未被使用的资源(包括场景)
- UnloadUnusedAssets();
}
internal void UnloadAllScene()
{
@@ -293,9 +306,6 @@ namespace YooAsset
valuePair.Value.ReleaseInternal();
}
_sceneHandles.Clear();
-
- // 卸载未被使用的资源(包括场景)
- UnloadUnusedAssets();
}
internal void ClearSceneHandle()
{
@@ -338,64 +348,71 @@ namespace YooAsset
{
foreach (var provider in providers)
{
- _providers.Remove(provider);
+ _providerList.Remove(provider);
+ _providerDic.Remove(provider.ProviderGUID);
}
}
+ internal bool CheckBundleDestroyed(int bundleID)
+ {
+ string bundleName = BundleServices.GetBundleName(bundleID);
+ BundleLoaderBase loader = TryGetAssetBundleLoader(bundleName);
+ if (loader == null)
+ return true;
+ return loader.IsDestroyed;
+ }
private BundleLoaderBase CreateAssetBundleLoaderInternal(BundleInfo bundleInfo)
{
// 如果加载器已经存在
- BundleLoaderBase loader = TryGetAssetBundleLoader(bundleInfo.Bundle.BundleName);
+ string bundleName = bundleInfo.Bundle.BundleName;
+ BundleLoaderBase loader = TryGetAssetBundleLoader(bundleName);
if (loader != null)
return loader;
// 新增下载需求
-#if UNITY_WEBGL
- loader = new AssetBundleWebLoader(this, bundleInfo);
-#else
- if (bundleInfo.Bundle.IsRawFile)
- loader = new RawBundleFileLoader(this, bundleInfo);
+ if (_simulationOnEditor)
+ {
+ loader = new VirtualBundleFileLoader(this, bundleInfo);
+ }
else
- loader = new AssetBundleFileLoader(this, bundleInfo);
+ {
+#if UNITY_WEBGL
+ 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);
+ else
+ loader = new AssetBundleFileLoader(this, bundleInfo);
#endif
+ }
- _loaders.Add(loader);
+ _loaderList.Add(loader);
+ _loaderDic.Add(bundleName, loader);
return loader;
}
private BundleLoaderBase TryGetAssetBundleLoader(string bundleName)
{
- BundleLoaderBase loader = null;
- for (int i = 0; i < _loaders.Count; i++)
- {
- BundleLoaderBase temp = _loaders[i];
- if (temp.MainBundleInfo.Bundle.BundleName.Equals(bundleName))
- {
- loader = temp;
- break;
- }
- }
- return loader;
+ if (_loaderDic.TryGetValue(bundleName, out BundleLoaderBase value))
+ return value;
+ else
+ return null;
}
private ProviderBase TryGetProvider(string providerGUID)
{
- ProviderBase provider = null;
- for (int i = 0; i < _providers.Count; i++)
- {
- ProviderBase temp = _providers[i];
- if (temp.ProviderGUID.Equals(providerGUID))
- {
- provider = temp;
- break;
- }
- }
- return provider;
+ if (_providerDic.TryGetValue(providerGUID, out ProviderBase value))
+ return value;
+ else
+ return null;
}
#region 调试信息
internal List GetDebugReportInfos()
{
- List result = new List(_providers.Count);
- foreach (var provider in _providers)
+ List result = new List(_providerList.Count);
+ foreach (var provider in _providerList)
{
DebugProviderInfo providerInfo = new DebugProviderInfo();
providerInfo.AssetPath = provider.MainAssetInfo.AssetPath;
@@ -405,22 +422,17 @@ namespace YooAsset
providerInfo.RefCount = provider.RefCount;
providerInfo.Status = provider.Status.ToString();
providerInfo.DependBundleInfos = new List();
+ provider.GetBundleDebugInfos(providerInfo.DependBundleInfos);
result.Add(providerInfo);
-
- if (provider is BundledProvider)
- {
- BundledProvider temp = provider as BundledProvider;
- temp.GetBundleDebugInfos(providerInfo.DependBundleInfos);
- }
}
return result;
}
internal List GetLoadedBundleInfos()
{
List result = new List(100);
- foreach (var bundleLoader in _loaders)
+ foreach (var loader in _loaderList)
{
- result.Add(bundleLoader.MainBundleInfo);
+ result.Add(loader.MainBundleInfo);
}
return result;
}
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Handles/AssetOperationHandle.cs b/Assets/YooAsset/Runtime/AssetSystem/Handles/AssetOperationHandle.cs
index f9f9451..24a43d2 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Handles/AssetOperationHandle.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Handles/AssetOperationHandle.cs
@@ -92,58 +92,63 @@ namespace YooAsset
///
/// 同步初始化游戏对象
///
- /// 父类对象
- ///
- public GameObject InstantiateSync(Transform parent = null)
+ public GameObject InstantiateSync()
{
- return InstantiateSyncInternal(Vector3.zero, Quaternion.identity, parent);
+ return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, null, false);
}
-
- ///
- /// 同步初始化游戏对象
- ///
- /// 坐标
- /// 角度
- /// 父类对象
- public GameObject InstantiateSync(Vector3 position, Quaternion rotation, Transform parent = null)
+ public GameObject InstantiateSync(Transform parent)
{
- return InstantiateSyncInternal(position, rotation, parent);
+ return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, parent, false);
+ }
+ public GameObject InstantiateSync(Transform parent, bool worldPositionStays)
+ {
+ return InstantiateSyncInternal(false, Vector3.zero, Quaternion.identity, parent, worldPositionStays);
+ }
+ public GameObject InstantiateSync(Vector3 position, Quaternion rotation)
+ {
+ return InstantiateSyncInternal(true, position, rotation, null, false);
+ }
+ public GameObject InstantiateSync(Vector3 position, Quaternion rotation, Transform parent)
+ {
+ return InstantiateSyncInternal(true, position, rotation, parent, false);
}
///
/// 异步初始化游戏对象
///
- /// 父类对象
- public InstantiateOperation InstantiateAsync(Transform parent = null)
+ public InstantiateOperation InstantiateAsync()
{
- return InstantiateAsyncInternal(Vector3.zero, Quaternion.identity, parent);
+ return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, null, false);
+ }
+ public InstantiateOperation InstantiateAsync(Transform parent)
+ {
+ return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, parent, false);
+ }
+ public InstantiateOperation InstantiateAsync(Transform parent, bool worldPositionStays)
+ {
+ return InstantiateAsyncInternal(false, Vector3.zero, Quaternion.identity, parent, worldPositionStays);
+ }
+ public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation)
+ {
+ return InstantiateAsyncInternal(true, position, rotation, null, false);
+ }
+ public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation, Transform parent)
+ {
+ return InstantiateAsyncInternal(true, position, rotation, parent, false);
}
- ///
- /// 异步初始化游戏对象
- ///
- /// 坐标
- /// 角度
- /// 父类对象
- public InstantiateOperation InstantiateAsync(Vector3 position, Quaternion rotation, Transform parent = null)
- {
- return InstantiateAsyncInternal(position, rotation, parent);
- }
-
-
- private GameObject InstantiateSyncInternal(Vector3 position, Quaternion rotation, Transform parent)
+ private GameObject InstantiateSyncInternal(bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
{
if (IsValidWithWarning == false)
return null;
if (Provider.AssetObject == null)
return null;
- GameObject clone = UnityEngine.Object.Instantiate(Provider.AssetObject as GameObject, position, rotation, parent);
- return clone;
+ return InstantiateOperation.InstantiateInternal(Provider.AssetObject, setPositionAndRotation, position, rotation, parent, worldPositionStays);
}
- private InstantiateOperation InstantiateAsyncInternal(Vector3 position, Quaternion rotation, Transform parent)
+ private InstantiateOperation InstantiateAsyncInternal(bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
{
- InstantiateOperation operation = new InstantiateOperation(this, position, rotation, parent);
+ InstantiateOperation operation = new InstantiateOperation(this, setPositionAndRotation, position, rotation, parent, worldPositionStays);
OperationSystem.StartOperation(operation);
return operation;
}
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs
index 0ec9208..9de9906 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs
@@ -26,7 +26,7 @@ namespace YooAsset
private DownloaderBase _unpacker;
private DownloaderBase _downloader;
private AssetBundleCreateRequest _createRequest;
- private FileStream _fileStream;
+ private Stream _stream;
public AssetBundleFileLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
@@ -46,7 +46,7 @@ namespace YooAsset
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
{
_steps = ESteps.Download;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
{
@@ -55,7 +55,7 @@ namespace YooAsset
if (loadMethod == EBundleLoadMethod.LoadFromMemory || loadMethod == EBundleLoadMethod.LoadFromStream)
{
_steps = ESteps.Unpack;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else
{
@@ -70,7 +70,7 @@ namespace YooAsset
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
{
_steps = ESteps.LoadFile;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else
{
@@ -81,7 +81,7 @@ namespace YooAsset
// 1. 从服务器下载
if (_steps == ESteps.Download)
{
- int failedTryAgain = int.MaxValue;
+ int failedTryAgain = Impl.DownloadFailedTryAgain;
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
_steps = ESteps.CheckDownload;
}
@@ -110,7 +110,7 @@ namespace YooAsset
if (_steps == ESteps.Unpack)
{
int failedTryAgain = 1;
- var bundleInfo = PatchManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
+ var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
_unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
_steps = ESteps.CheckUnpack;
}
@@ -196,12 +196,12 @@ namespace YooAsset
}
else if (loadMethod == EBundleLoadMethod.LoadFromStream)
{
- _fileStream = Impl.DecryptionServices.LoadFromStream(fileInfo);
+ _stream = Impl.DecryptionServices.LoadFromStream(fileInfo);
uint managedReadBufferSize = Impl.DecryptionServices.GetManagedReadBufferSize();
if (_isWaitForAsyncComplete)
- CacheBundle = AssetBundle.LoadFromStream(_fileStream, 0, managedReadBufferSize);
+ CacheBundle = AssetBundle.LoadFromStream(_stream, 0, managedReadBufferSize);
else
- _createRequest = AssetBundle.LoadFromStreamAsync(_fileStream, 0, managedReadBufferSize);
+ _createRequest = AssetBundle.LoadFromStreamAsync(_stream, 0, managedReadBufferSize);
}
else
{
@@ -242,14 +242,11 @@ namespace YooAsset
// 在AssetBundle文件加载失败的情况下,我们需要重新验证文件的完整性!
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
{
- string cacheLoadPath = MainBundleInfo.Bundle.CachedFilePath;
- if (CacheSystem.VerifyBundle(MainBundleInfo.Bundle, EVerifyLevel.High) != EVerifyResult.Succeed)
+ var result = CacheSystem.VerifyingRecordFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
+ if (result != EVerifyResult.Succeed)
{
- if (File.Exists(cacheLoadPath))
- {
- YooLogger.Error($"Delete the invalid cache file : {cacheLoadPath}");
- File.Delete(cacheLoadPath);
- }
+ YooLogger.Error($"Found possibly corrupt file ! {MainBundleInfo.Bundle.CacheGUID}");
+ CacheSystem.DiscardFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
}
}
}
@@ -268,11 +265,11 @@ namespace YooAsset
{
base.Destroy(forceDestroy);
- if (_fileStream != null)
+ if (_stream != null)
{
- _fileStream.Close();
- _fileStream.Dispose();
- _fileStream = null;
+ _stream.Close();
+ _stream.Dispose();
+ _stream = null;
}
}
@@ -289,9 +286,12 @@ namespace YooAsset
// 文件解压
if (_unpacker != null)
{
- _unpacker.Update();
if (_unpacker.IsDone() == false)
+ {
+ _unpacker.WaitForAsyncComplete = true;
+ _unpacker.Update();
continue;
+ }
}
// 保险机制
@@ -302,7 +302,7 @@ namespace YooAsset
if (_isShowWaitForAsyncError == false)
{
_isShowWaitForAsyncError = true;
- YooLogger.Error($"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !");
+ YooLogger.Error($"{nameof(WaitForAsyncComplete)} failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !");
}
break;
}
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs
index 5a68de7..f3fedb5 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs
@@ -7,6 +7,9 @@ using UnityEngine.Networking;
namespace YooAsset
{
+ ///
+ /// WebGL平台加载器
+ ///
internal sealed class AssetBundleWebLoader : BundleLoaderBase
{
private enum ESteps
@@ -24,7 +27,6 @@ namespace YooAsset
private ESteps _steps = ESteps.None;
private float _tryTimer = 0;
- private bool _isShowWaitForAsyncError = false;
private DownloaderBase _downloader;
private UnityWebRequest _webRequest;
private AssetBundleCreateRequest _createRequest;
@@ -47,7 +49,7 @@ namespace YooAsset
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
{
_steps = ESteps.Download;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
{
@@ -57,7 +59,7 @@ namespace YooAsset
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
{
_steps = ESteps.LoadCacheFile;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else
{
@@ -68,7 +70,7 @@ namespace YooAsset
// 1. 从服务器下载
if (_steps == ESteps.Download)
{
- int failedTryAgain = int.MaxValue;
+ int failedTryAgain = Impl.DownloadFailedTryAgain;
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
_steps = ESteps.CheckDownload;
}
@@ -147,14 +149,11 @@ namespace YooAsset
// 在AssetBundle文件加载失败的情况下,我们需要重新验证文件的完整性!
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
{
- string cacheLoadPath = MainBundleInfo.Bundle.CachedFilePath;
- if (CacheSystem.VerifyBundle(MainBundleInfo.Bundle, EVerifyLevel.High) != EVerifyResult.Succeed)
+ var result = CacheSystem.VerifyingRecordFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
+ if (result != EVerifyResult.Succeed)
{
- if (File.Exists(cacheLoadPath))
- {
- YooLogger.Error($"Delete the invalid cache file : {cacheLoadPath}");
- File.Delete(cacheLoadPath);
- }
+ YooLogger.Error($"Found possibly corrupt file ! {MainBundleInfo.Bundle.CacheGUID}");
+ CacheSystem.DiscardFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
}
}
}
@@ -228,10 +227,11 @@ namespace YooAsset
///
public override void WaitForAsyncComplete()
{
- if (_isShowWaitForAsyncError == false)
+ if (IsDone() == false)
{
- _isShowWaitForAsyncError = true;
- YooLogger.Error($"WebGL platform not support {nameof(WaitForAsyncComplete)} ! Use the async load method instead of the sync load method !");
+ Status = EStatus.Failed;
+ LastError = $"{nameof(WaitForAsyncComplete)} failed ! WebGL platform not support sync load method !";
+ YooLogger.Error(LastError);
}
}
}
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/BundleLoaderBase.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/BundleLoaderBase.cs
index dc9ef22..b559029 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Loader/BundleLoaderBase.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/BundleLoaderBase.cs
@@ -100,7 +100,18 @@ namespace YooAsset
if (IsDone() == false)
return false;
- return RefCount <= 0;
+ if (RefCount > 0)
+ return false;
+
+ // 检查引用链上的资源包是否已经全部销毁
+ // 注意:互相引用的资源包无法卸载!
+ foreach (var bundleID in MainBundleInfo.Bundle.ReferenceIDs)
+ {
+ if (Impl.CheckBundleDestroyed(bundleID) == false)
+ return false;
+ }
+
+ return true;
}
///
@@ -123,14 +134,14 @@ namespace YooAsset
return;
// 销毁所有Providers
- foreach (var provider in _providers)
{
- provider.Destroy();
+ foreach (var provider in _providers)
+ {
+ provider.Destroy();
+ }
+ Impl.RemoveBundleProviders(_providers);
+ _providers.Clear();
}
-
- // 从列表里移除Providers
- Impl.RemoveBundleProviders(_providers);
- _providers.Clear();
}
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs
index cf6fa78..b7ee11a 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs
@@ -16,7 +16,6 @@ namespace YooAsset
}
private ESteps _steps = ESteps.None;
- private bool _isShowWaitForAsyncError = false;
private DownloaderBase _unpacker;
private DownloaderBase _downloader;
@@ -38,13 +37,13 @@ namespace YooAsset
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
{
_steps = ESteps.Download;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
{
-#if UNITY_ANDROID || UNITY_WEBGL
+#if UNITY_ANDROID
_steps = ESteps.Unpack;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
#else
_steps = ESteps.CheckFile;
FileLoadPath = MainBundleInfo.Bundle.StreamingFilePath;
@@ -53,7 +52,7 @@ namespace YooAsset
else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
{
_steps = ESteps.CheckFile;
- FileLoadPath = MainBundleInfo.Bundle.CachedFilePath;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
}
else
{
@@ -64,7 +63,7 @@ namespace YooAsset
// 1. 下载远端文件
if (_steps == ESteps.Download)
{
- int failedTryAgain = int.MaxValue;
+ int failedTryAgain = Impl.DownloadFailedTryAgain;
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
_steps = ESteps.CheckDownload;
}
@@ -93,7 +92,7 @@ namespace YooAsset
if (_steps == ESteps.Unpack)
{
int failedTryAgain = 1;
- var bundleInfo = PatchManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
+ var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
_unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
_steps = ESteps.CheckUnpack;
}
@@ -125,13 +124,14 @@ namespace YooAsset
DownloadProgress = 1f;
DownloadedBytes = (ulong)MainBundleInfo.Bundle.FileSize;
- _steps = ESteps.Done;
if (File.Exists(FileLoadPath))
{
+ _steps = ESteps.Done;
Status = EStatus.Succeed;
}
else
{
+ _steps = ESteps.Done;
Status = EStatus.Failed;
LastError = $"Raw file not found : {FileLoadPath}";
}
@@ -149,20 +149,24 @@ namespace YooAsset
// 文件解压
if (_unpacker != null)
{
- _unpacker.Update();
if (_unpacker.IsDone() == false)
+ {
+ _unpacker.WaitForAsyncComplete = true;
+ _unpacker.Update();
continue;
+ }
}
// 保险机制
- // 注意:如果需要从WEB端下载资源,可能会触发保险机制!
+ // 注意:如果需要从远端下载资源,可能会触发保险机制!
frame--;
if (frame == 0)
{
- if (_isShowWaitForAsyncError == false)
+ if (IsDone() == false)
{
- _isShowWaitForAsyncError = true;
- YooLogger.Error($"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !");
+ Status = EStatus.Failed;
+ LastError = $"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !";
+ YooLogger.Error(LastError);
}
break;
}
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs
new file mode 100644
index 0000000..b5513d6
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs
@@ -0,0 +1,151 @@
+using System.IO;
+
+namespace YooAsset
+{
+ ///
+ /// WebGL平台加载器
+ ///
+ internal class RawBundleWebLoader : BundleLoaderBase
+ {
+ private enum ESteps
+ {
+ None,
+ Download,
+ CheckDownload,
+ Website,
+ CheckWebsite,
+ CheckFile,
+ Done,
+ }
+
+ private ESteps _steps = ESteps.None;
+ private DownloaderBase _website;
+ private DownloaderBase _downloader;
+
+
+ public RawBundleWebLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
+ {
+ }
+
+ ///
+ /// 轮询更新
+ ///
+ public override void Update()
+ {
+ if (_steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.None)
+ {
+ if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
+ {
+ _steps = ESteps.Download;
+ FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
+ }
+ else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
+ {
+ _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());
+ }
+ }
+
+ // 1. 下载远端文件
+ if (_steps == ESteps.Download)
+ {
+ int failedTryAgain = Impl.DownloadFailedTryAgain;
+ _downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
+ _steps = ESteps.CheckDownload;
+ }
+
+ // 2. 检测下载结果
+ if (_steps == ESteps.CheckDownload)
+ {
+ 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.CheckFile;
+ }
+ }
+
+ // 3. 从站点下载
+ if (_steps == ESteps.Website)
+ {
+ int failedTryAgain = 1;
+ var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
+ _website = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
+ _steps = ESteps.CheckWebsite;
+ }
+
+ // 4. 检测站点下载
+ if (_steps == ESteps.CheckWebsite)
+ {
+ DownloadProgress = _website.DownloadProgress;
+ DownloadedBytes = _website.DownloadedBytes;
+ if (_website.IsDone() == false)
+ return;
+
+ if (_website.HasError())
+ {
+ _steps = ESteps.Done;
+ Status = EStatus.Failed;
+ LastError = _website.GetLastError();
+ }
+ else
+ {
+ _steps = ESteps.CheckFile;
+ }
+ }
+
+ // 5. 检测结果
+ if (_steps == ESteps.CheckFile)
+ {
+ // 设置下载进度
+ DownloadProgress = 1f;
+ DownloadedBytes = (ulong)MainBundleInfo.Bundle.FileSize;
+
+ _steps = ESteps.Done;
+ if (File.Exists(FileLoadPath))
+ {
+ Status = EStatus.Succeed;
+ }
+ else
+ {
+ Status = EStatus.Failed;
+ LastError = $"Raw file not found : {FileLoadPath}";
+ }
+ }
+ }
+
+ ///
+ /// 主线程等待异步操作完毕
+ ///
+ public override void WaitForAsyncComplete()
+ {
+ if (IsDone() == false)
+ {
+ Status = EStatus.Failed;
+ LastError = $"{nameof(WaitForAsyncComplete)} failed ! WebGL platform not support sync load method !";
+ YooLogger.Error(LastError);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs.meta b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs.meta
new file mode 100644
index 0000000..6420e98
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1d16b689f73611e44bd01a4cc429a6ac
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/VirtualBundleFileLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/VirtualBundleFileLoader.cs
new file mode 100644
index 0000000..e429fbe
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/VirtualBundleFileLoader.cs
@@ -0,0 +1,82 @@
+
+namespace YooAsset
+{
+ internal class VirtualBundleFileLoader : BundleLoaderBase
+ {
+ private enum ESteps
+ {
+ None,
+ CheckFile,
+ Done,
+ }
+
+ private ESteps _steps = ESteps.None;
+
+ public VirtualBundleFileLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
+ {
+ }
+
+ ///
+ /// 轮询更新
+ ///
+ public override void Update()
+ {
+ if (_steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.None)
+ {
+ if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromEditor)
+ {
+ _steps = ESteps.CheckFile;
+ }
+ else
+ {
+ throw new System.NotImplementedException(MainBundleInfo.LoadMode.ToString());
+ }
+ }
+
+ // 1. 检测结果
+ if (_steps == ESteps.CheckFile)
+ {
+ // 设置下载进度
+ DownloadProgress = 1f;
+ DownloadedBytes = (ulong)MainBundleInfo.Bundle.FileSize;
+
+ _steps = ESteps.Done;
+ Status = EStatus.Succeed;
+ }
+ }
+
+ ///
+ /// 主线程等待异步操作完毕
+ ///
+ public override void WaitForAsyncComplete()
+ {
+ int frame = 1000;
+ while (true)
+ {
+ // 保险机制
+ // 注意:如果需要从远端下载资源,可能会触发保险机制!
+ frame--;
+ if (frame == 0)
+ {
+ if (IsDone() == false)
+ {
+ Status = EStatus.Failed;
+ LastError = $"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !";
+ YooLogger.Error(LastError);
+ }
+ break;
+ }
+
+ // 驱动流程
+ Update();
+
+ // 完成后退出
+ if (IsDone())
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/VirtualBundleFileLoader.cs.meta b/Assets/YooAsset/Runtime/AssetSystem/Loader/VirtualBundleFileLoader.cs.meta
new file mode 100644
index 0000000..c8289e1
--- /dev/null
+++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/VirtualBundleFileLoader.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7b9023a940b496549894d9d8872219fb
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Operations/InstantiateOperation.cs b/Assets/YooAsset/Runtime/AssetSystem/Operations/InstantiateOperation.cs
index 76b39b8..02f2d5a 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Operations/InstantiateOperation.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Operations/InstantiateOperation.cs
@@ -12,9 +12,11 @@ namespace YooAsset
}
private readonly AssetOperationHandle _handle;
+ private readonly bool _setPositionAndRotation;
private readonly Vector3 _position;
private readonly Quaternion _rotation;
private readonly Transform _parent;
+ private readonly bool _worldPositionStays;
private ESteps _steps = ESteps.None;
///
@@ -23,12 +25,14 @@ namespace YooAsset
public GameObject Result = null;
- internal InstantiateOperation(AssetOperationHandle handle, Vector3 position, Quaternion rotation, Transform parent)
+ internal InstantiateOperation(AssetOperationHandle handle, bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
{
_handle = handle;
+ _setPositionAndRotation = setPositionAndRotation;
_position = position;
_rotation = rotation;
_parent = parent;
+ _worldPositionStays = worldPositionStays;
}
internal override void Start()
{
@@ -61,7 +65,7 @@ namespace YooAsset
}
// 实例化游戏对象
- Result = Object.Instantiate(_handle.AssetObject as GameObject, _position, _rotation, _parent);
+ Result = InstantiateInternal(_handle.AssetObject, _setPositionAndRotation, _position, _rotation, _parent, _worldPositionStays);
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
@@ -91,5 +95,38 @@ namespace YooAsset
_handle.WaitForAsyncComplete();
Update();
}
+
+ internal static GameObject InstantiateInternal(UnityEngine.Object assetObject, bool setPositionAndRotation, Vector3 position, Quaternion rotation, Transform parent, bool worldPositionStays)
+ {
+ if (assetObject == null)
+ return null;
+
+ if (setPositionAndRotation)
+ {
+ if (parent != null)
+ {
+ GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject, position, rotation, parent);
+ return clone;
+ }
+ else
+ {
+ GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject, position, rotation);
+ return clone;
+ }
+ }
+ else
+ {
+ if (parent != null)
+ {
+ GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject, parent, worldPositionStays);
+ return clone;
+ }
+ else
+ {
+ GameObject clone = UnityEngine.Object.Instantiate(assetObject as GameObject);
+ return clone;
+ }
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAssetProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAssetProvider.cs
index 56bd186..82acd2b 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAssetProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledAssetProvider.cs
@@ -4,7 +4,7 @@ using UnityEngine;
namespace YooAsset
{
- internal sealed class BundledAssetProvider : BundledProvider
+ internal sealed class BundledAssetProvider : ProviderBase
{
private AssetBundleRequest _cacheRequest;
@@ -13,7 +13,7 @@ namespace YooAsset
}
public override void Update()
{
- DebugRecording();
+ DebugBeginRecording();
if (IsDone)
return;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledProvider.cs
deleted file mode 100644
index 340173a..0000000
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledProvider.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-
-namespace YooAsset
-{
- internal abstract class BundledProvider : ProviderBase
- {
- protected BundleLoaderBase OwnerBundle { private set; get; }
- protected DependAssetBundleGroup DependBundleGroup { private set; get; }
-
- public BundledProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo) : base(impl, providerGUID, assetInfo)
- {
- OwnerBundle = impl.CreateOwnerAssetBundleLoader(assetInfo);
- OwnerBundle.Reference();
- OwnerBundle.AddProvider(this);
-
- var dependBundles = impl.CreateDependAssetBundleLoaders(assetInfo);
- DependBundleGroup = new DependAssetBundleGroup(dependBundles);
- DependBundleGroup.Reference();
- }
- public override void Destroy()
- {
- base.Destroy();
-
- // 释放资源包
- if (OwnerBundle != null)
- {
- OwnerBundle.Release();
- OwnerBundle = null;
- }
- if (DependBundleGroup != null)
- {
- DependBundleGroup.Release();
- DependBundleGroup = null;
- }
- }
-
- ///
- /// 获取下载报告
- ///
- public override DownloadReport GetDownloadReport()
- {
- DownloadReport result = new DownloadReport();
- result.TotalSize = (ulong)OwnerBundle.MainBundleInfo.Bundle.FileSize;
- result.DownloadedBytes = OwnerBundle.DownloadedBytes;
- foreach (var dependBundle in DependBundleGroup.DependBundles)
- {
- result.TotalSize += (ulong)dependBundle.MainBundleInfo.Bundle.FileSize;
- result.DownloadedBytes += dependBundle.DownloadedBytes;
- }
- result.Progress = result.DownloadedBytes / result.TotalSize;
- return result;
- }
-
- ///
- /// 获取资源包的调试信息列表
- ///
- internal void GetBundleDebugInfos(List output)
- {
- var bundleInfo = new DebugBundleInfo();
- bundleInfo.BundleName = OwnerBundle.MainBundleInfo.Bundle.BundleName;
- bundleInfo.RefCount = OwnerBundle.RefCount;
- bundleInfo.Status = OwnerBundle.Status.ToString();
- output.Add(bundleInfo);
-
- DependBundleGroup.GetBundleDebugInfos(output);
- }
- }
-}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledRawFileProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledRawFileProvider.cs
index 80a2a9f..c8ee879 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledRawFileProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledRawFileProvider.cs
@@ -1,14 +1,14 @@
namespace YooAsset
{
- internal class BundledRawFileProvider : BundledProvider
+ internal class BundledRawFileProvider : ProviderBase
{
public BundledRawFileProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo) : base(impl, providerGUID, assetInfo)
{
}
public override void Update()
{
- DebugRecording();
+ DebugBeginRecording();
if (IsDone)
return;
@@ -18,6 +18,7 @@ namespace YooAsset
Status = EStatus.CheckBundle;
}
+ // 1. 检测资源包
if (Status == EStatus.CheckBundle)
{
if (IsWaitForAsyncComplete)
@@ -39,6 +40,7 @@ namespace YooAsset
Status = EStatus.Checking;
}
+ // 2. 检测加载结果
if (Status == EStatus.Checking)
{
RawFilePath = OwnerBundle.FileLoadPath;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs
index 6a9bd22..0364b86 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs
@@ -6,7 +6,7 @@ using UnityEngine.SceneManagement;
namespace YooAsset
{
- internal sealed class BundledSceneProvider : BundledProvider
+ internal sealed class BundledSceneProvider : ProviderBase
{
public readonly LoadSceneMode SceneMode;
private readonly string _sceneName;
@@ -23,7 +23,7 @@ namespace YooAsset
}
public override void Update()
{
- DebugRecording();
+ DebugBeginRecording();
if (IsDone)
return;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSubAssetsProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSubAssetsProvider.cs
index 800a548..36c6545 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSubAssetsProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSubAssetsProvider.cs
@@ -4,7 +4,7 @@ using UnityEngine;
namespace YooAsset
{
- internal sealed class BundledSubAssetsProvider : BundledProvider
+ internal sealed class BundledSubAssetsProvider : ProviderBase
{
private AssetBundleRequest _cacheRequest;
@@ -13,7 +13,7 @@ namespace YooAsset
}
public override void Update()
{
- DebugRecording();
+ DebugBeginRecording();
if (IsDone)
return;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAssetProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAssetProvider.cs
index 8363518..e3590a2 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAssetProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseAssetProvider.cs
@@ -28,14 +28,36 @@ namespace YooAsset
return;
}
- Status = EStatus.Loading;
+ Status = EStatus.CheckBundle;
// 注意:模拟异步加载效果提前返回
if (IsWaitForAsyncComplete == false)
return;
}
- // 1. 加载资源对象
+ // 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)
@@ -45,7 +67,7 @@ namespace YooAsset
Status = EStatus.Checking;
}
- // 2. 检测加载结果
+ // 3. 检测加载结果
if (Status == EStatus.Checking)
{
Status = AssetObject == null ? EStatus.Failed : EStatus.Succeed;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseRawFileProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseRawFileProvider.cs
index 3e609e8..167d287 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseRawFileProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseRawFileProvider.cs
@@ -25,14 +25,37 @@ namespace YooAsset
return;
}
- Status = EStatus.Checking;
+ Status = EStatus.CheckBundle;
// 注意:模拟异步加载效果提前返回
if (IsWaitForAsyncComplete == false)
return;
}
- if(Status == EStatus.Checking)
+ // 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.Checking;
+ }
+
+ // 2. 检测加载结果
+ if (Status == EStatus.Checking)
{
RawFilePath = MainAssetInfo.AssetPath;
Status = EStatus.Succeed;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs
index 962d64f..48b9497 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs
@@ -24,10 +24,32 @@ namespace YooAsset
if (Status == EStatus.None)
{
+ Status = EStatus.CheckBundle;
+ }
+
+ // 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;
}
- // 1. 加载资源对象
+ // 2. 加载资源对象
if (Status == EStatus.Loading)
{
LoadSceneParameters loadSceneParameters = new LoadSceneParameters();
@@ -49,7 +71,7 @@ namespace YooAsset
}
}
- // 2. 检测加载结果
+ // 3. 检测加载结果
if (Status == EStatus.Checking)
{
Progress = _asyncOp.progress;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSubAssetsProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSubAssetsProvider.cs
index d6d1b94..f89d3e7 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSubAssetsProvider.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSubAssetsProvider.cs
@@ -28,14 +28,36 @@ namespace YooAsset
return;
}
- Status = EStatus.Loading;
+ Status = EStatus.CheckBundle;
// 注意:模拟异步加载效果提前返回
if (IsWaitForAsyncComplete == false)
return;
}
- // 1. 加载资源对象
+ // 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)
@@ -56,7 +78,7 @@ namespace YooAsset
Status = EStatus.Checking;
}
- // 2. 检测加载结果
+ // 3. 检测加载结果
if (Status == EStatus.Checking)
{
Status = AllAssetObjects == null ? EStatus.Failed : EStatus.Succeed;
diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/ProviderBase.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/ProviderBase.cs
index 806314c..aa01530 100644
--- a/Assets/YooAsset/Runtime/AssetSystem/Provider/ProviderBase.cs
+++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/ProviderBase.cs
@@ -90,6 +90,8 @@ namespace YooAsset
}
+ protected BundleLoaderBase OwnerBundle { private set; get; }
+ protected DependAssetBundleGroup DependBundleGroup { private set; get; }
protected bool IsWaitForAsyncComplete { private set; get; } = false;
private readonly List _handles = new List();
@@ -99,6 +101,18 @@ namespace YooAsset
Impl = impl;
ProviderGUID = providerGUID;
MainAssetInfo = assetInfo;
+
+ // 创建资源包加载器
+ if (impl != null)
+ {
+ OwnerBundle = impl.CreateOwnerAssetBundleLoader(assetInfo);
+ OwnerBundle.Reference();
+ OwnerBundle.AddProvider(this);
+
+ var dependBundles = impl.CreateDependAssetBundleLoaders(assetInfo);
+ DependBundleGroup = new DependAssetBundleGroup(dependBundles);
+ DependBundleGroup.Reference();
+ }
}
///
@@ -112,14 +126,18 @@ namespace YooAsset
public virtual void Destroy()
{
IsDestroyed = true;
- }
- ///
- /// 获取下载进度
- ///
- public virtual DownloadReport GetDownloadReport()
- {
- return DownloadReport.CreateDefaultReport();
+ // 释放资源包加载器
+ if (OwnerBundle != null)
+ {
+ OwnerBundle.Release();
+ OwnerBundle = null;
+ }
+ if (DependBundleGroup != null)
+ {
+ DependBundleGroup.Release();
+ DependBundleGroup = null;
+ }
}
///
@@ -221,14 +239,17 @@ namespace YooAsset
private TaskCompletionSource