mirror of
https://github.com/tuyoogame/YooAsset.git
synced 2026-05-14 19:40:47 +00:00
Compare commits
54 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1471ca06f3 | ||
|
|
60b04c19dc | ||
|
|
4490c99eee | ||
|
|
9a84cdef9f | ||
|
|
62bbf110fb | ||
|
|
fd282d96d1 | ||
|
|
4e4da4440b | ||
|
|
5651d6dd9d | ||
|
|
e0499993a4 | ||
|
|
5c59cfe983 | ||
|
|
396ec7121c | ||
|
|
e403c80d51 | ||
|
|
aac315826e | ||
|
|
567c34d4d1 | ||
|
|
896681df87 | ||
|
|
e278883958 | ||
|
|
0d57565cae | ||
|
|
513c71398d | ||
|
|
a22c80a199 | ||
|
|
16e3001e51 | ||
|
|
3943850bc1 | ||
|
|
4fc41a449e | ||
|
|
f945508625 | ||
|
|
beaa77832c | ||
|
|
d0480edda6 | ||
|
|
de43495af5 | ||
|
|
c60cc1e84f | ||
|
|
82c83fcdf7 | ||
|
|
19221480a0 | ||
|
|
290e139346 | ||
|
|
923b0751e5 | ||
|
|
334b96f90e | ||
|
|
7ae8a6c247 | ||
|
|
18830544a6 | ||
|
|
37cab30ed7 | ||
|
|
91fe51d10a | ||
|
|
027ae02aa0 | ||
|
|
49e0d9729d | ||
|
|
15c667b043 | ||
|
|
4820d2a54a | ||
|
|
58a40ad1d1 | ||
|
|
1877a373d6 | ||
|
|
192b60f037 | ||
|
|
c40224b454 | ||
|
|
6508bf6851 | ||
|
|
96b8ced64f | ||
|
|
254da59b7a | ||
|
|
c9b775d8ff | ||
|
|
d60b0ea0ea | ||
|
|
20061983d6 | ||
|
|
ff8f8623d9 | ||
|
|
1ce1a6f0ff | ||
|
|
67d09d95fa | ||
|
|
10e04c7645 |
@@ -2,6 +2,120 @@
|
||||
|
||||
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#
|
||||
/// <summary>
|
||||
/// 向远端请求并更新清单
|
||||
/// </summary>
|
||||
public class UpdatePackageManifestOperation : AsyncOperationBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 保存当前清单的版本,用于下次启动时自动加载的版本。
|
||||
/// </summary>
|
||||
public void SavePackageVersion();
|
||||
}
|
||||
```
|
||||
|
||||
- 新增了初始化参数。
|
||||
|
||||
```c#
|
||||
/// <summary>
|
||||
/// 下载失败尝试次数
|
||||
/// 注意:默认值为MaxValue
|
||||
/// </summary>
|
||||
public int DownloadFailedTryAgain = int.MaxValue;
|
||||
```
|
||||
|
||||
- 新增了初始化参数。
|
||||
|
||||
```c#
|
||||
/// <summary>
|
||||
/// 资源加载每帧处理的最大时间片段
|
||||
/// 注意:默认值为MaxValue
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
@@ -51,10 +51,10 @@ namespace YooAsset.Editor
|
||||
new TaskCopyRawFile(), //拷贝原生文件
|
||||
new TaskVerifyBuildResult(), //验证构建结果
|
||||
new TaskEncryption(), //加密资源文件
|
||||
new TaskUpdatePatchInfo(), //更新补丁信息
|
||||
new TaskCreatePatchManifest(), //创建清单文件
|
||||
new TaskUpdateBundleInfo(), //更新资源包信息
|
||||
new TaskCreateManifest(), //创建清单文件
|
||||
new TaskCreateReport(), //创建报告文件
|
||||
new TaskCreatePatchPackage(), //制作补丁包
|
||||
new TaskCreatePackage(), //制作包裹
|
||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||
};
|
||||
}
|
||||
@@ -68,10 +68,10 @@ namespace YooAsset.Editor
|
||||
new TaskCopyRawFile(), //拷贝原生文件
|
||||
new TaskVerifyBuildResult_SBP(), //验证构建结果
|
||||
new TaskEncryption(), //加密资源文件
|
||||
new TaskUpdatePatchInfo(), //更新补丁信息
|
||||
new TaskCreatePatchManifest(), //创建清单文件
|
||||
new TaskUpdateBundleInfo(), //更新补丁信息
|
||||
new TaskCreateManifest(), //创建清单文件
|
||||
new TaskCreateReport(), //创建报告文件
|
||||
new TaskCreatePatchPackage(), //制作补丁包
|
||||
new TaskCreatePackage(), //制作补丁包
|
||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||||
};
|
||||
}
|
||||
|
||||
@@ -58,14 +58,5 @@ namespace YooAsset.Editor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取构建管线的输出目录
|
||||
/// </summary>
|
||||
public static string MakePipelineOutputDirectory(string outputRoot, string buildPackage, BuildTarget buildTarget, EBuildMode buildMode)
|
||||
{
|
||||
string outputDirectory = $"{outputRoot}/{buildPackage}/{buildTarget}/{YooAssetSettings.OutputFolderName}";
|
||||
return outputDirectory;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ namespace YooAsset.Editor
|
||||
/// </summary>
|
||||
private static void LoadSettingData()
|
||||
{
|
||||
_setting = EditorHelper.LoadSettingData<AssetBundleBuilderSetting>();
|
||||
_setting = SettingLoader.LoadSettingData<AssetBundleBuilderSetting>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace YooAsset.Editor
|
||||
[MenuItem("YooAsset/AssetBundle Builder", false, 102)]
|
||||
public static void ShowExample()
|
||||
{
|
||||
AssetBundleBuilderWindow window = GetWindow<AssetBundleBuilderWindow>("资源包构建工具", true, EditorDefine.DockedWindowTypes);
|
||||
AssetBundleBuilderWindow window = GetWindow<AssetBundleBuilderWindow>("资源包构建工具", true, WindowsDefine.DockedWindowTypes);
|
||||
window.minSize = new Vector2(800, 600);
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace YooAsset.Editor
|
||||
VisualElement root = this.rootVisualElement;
|
||||
|
||||
// 加载布局文件
|
||||
var visualAsset = EditorHelper.LoadWindowUXML<AssetBundleBuilderWindow>();
|
||||
var visualAsset = UxmlLoader.LoadWindowUXML<AssetBundleBuilderWindow>();
|
||||
if (visualAsset == null)
|
||||
return;
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace YooAsset.Editor
|
||||
{
|
||||
public class BuildBundleInfo
|
||||
{
|
||||
public class BuildPatchInfo
|
||||
public class InfoWrapper
|
||||
{
|
||||
/// <summary>
|
||||
/// 构建内容的哈希值
|
||||
@@ -18,17 +18,17 @@ namespace YooAsset.Editor
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public string PatchFileHash { set; get; }
|
||||
public string FileHash { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public string PatchFileCRC { set; get; }
|
||||
public string FileCRC { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件哈希值
|
||||
/// </summary>
|
||||
public long PatchFileSize { set; get; }
|
||||
public long FileSize { set; get; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -39,7 +39,7 @@ namespace YooAsset.Editor
|
||||
/// <summary>
|
||||
/// 补丁包输出文件路径
|
||||
/// </summary>
|
||||
public string PatchOutputFilePath { set; get; }
|
||||
public string PackageOutputFilePath { set; get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -51,12 +51,12 @@ namespace YooAsset.Editor
|
||||
/// 参与构建的资源列表
|
||||
/// 注意:不包含零依赖资源
|
||||
/// </summary>
|
||||
public readonly List<BuildAssetInfo> BuildinAssets = new List<BuildAssetInfo>();
|
||||
public readonly List<BuildAssetInfo> AllMainAssets = new List<BuildAssetInfo>();
|
||||
|
||||
/// <summary>
|
||||
/// 补丁文件信息
|
||||
/// </summary>
|
||||
public readonly BuildPatchInfo PatchInfo = new BuildPatchInfo();
|
||||
public readonly InfoWrapper BundleInfo = new InfoWrapper();
|
||||
|
||||
/// <summary>
|
||||
/// 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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -121,7 +121,7 @@ namespace YooAsset.Editor
|
||||
/// </summary>
|
||||
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
|
||||
/// </summary>
|
||||
public string[] GetBundleTags()
|
||||
{
|
||||
List<string> result = new List<string>(BuildinAssets.Count);
|
||||
foreach (var assetInfo in BuildinAssets)
|
||||
List<string> result = new List<string>(AllMainAssets.Count);
|
||||
foreach (var assetInfo in AllMainAssets)
|
||||
{
|
||||
foreach (var assetTag in assetInfo.BundleTags)
|
||||
{
|
||||
@@ -148,20 +148,43 @@ namespace YooAsset.Editor
|
||||
return result.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取该资源包内的所有资源(包括零依赖资源)
|
||||
/// </summary>
|
||||
public List<string> GetAllBuiltinAssetPaths()
|
||||
{
|
||||
var packAssets = GetAllMainAssetPaths();
|
||||
List<string> result = new List<string>(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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取构建的资源路径列表
|
||||
/// </summary>
|
||||
public string[] GetBuildinAssetPaths()
|
||||
public string[] GetAllMainAssetPaths()
|
||||
{
|
||||
return BuildinAssets.Select(t => t.AssetPath).ToArray();
|
||||
return AllMainAssets.Select(t => t.AssetPath).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有写入补丁清单的资源
|
||||
/// </summary>
|
||||
public BuildAssetInfo[] GetAllPatchAssetInfos()
|
||||
public BuildAssetInfo[] GetAllMainAssetInfos()
|
||||
{
|
||||
return BuildinAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
|
||||
return AllMainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建PatchBundle类
|
||||
/// 创建PackageBundle类
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,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;
|
||||
}
|
||||
@@ -41,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;
|
||||
}
|
||||
|
||||
@@ -53,6 +53,11 @@ namespace YooAsset.Editor
|
||||
/// </summary>
|
||||
public int[] ReferenceIDs;
|
||||
|
||||
/// <summary>
|
||||
/// 该资源包内包含的所有资源
|
||||
/// </summary>
|
||||
public List<string> AllBuiltinAssets = new List<string>();
|
||||
|
||||
/// <summary>
|
||||
/// 获取资源分类标签的字符串
|
||||
/// </summary>
|
||||
|
||||
@@ -37,14 +37,16 @@ namespace YooAsset.Editor
|
||||
{
|
||||
_buildWatch = Stopwatch.StartNew();
|
||||
var taskAttribute = task.GetType().GetCustomAttribute<TaskAttribute>();
|
||||
BuildLogger.Log($"---------------------------------------->{taskAttribute.Desc}<---------------------------------------");
|
||||
if (taskAttribute != null)
|
||||
BuildLogger.Log($"---------------------------------------->{taskAttribute.Desc}<---------------------------------------");
|
||||
task.Run(context);
|
||||
_buildWatch.Stop();
|
||||
|
||||
// 统计耗时
|
||||
int seconds = GetBuildSeconds();
|
||||
TotalSeconds += seconds;
|
||||
BuildLogger.Log($"{taskAttribute.Desc}耗时:{seconds}秒");
|
||||
if (taskAttribute != null)
|
||||
BuildLogger.Log($"{taskAttribute.Desc}耗时:{seconds}秒");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -12,13 +12,13 @@ namespace YooAsset.Editor
|
||||
void IBuildTask.Run(BuildContext context)
|
||||
{
|
||||
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||
var patchManifestContext = context.GetContextObject<PatchManifestContext>();
|
||||
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||
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
|
||||
/// <summary>
|
||||
/// 拷贝首包资源文件
|
||||
/// </summary>
|
||||
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,12 +82,12 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,10 +32,10 @@ namespace YooAsset.Editor
|
||||
if (bundleInfo.IsRawFile)
|
||||
{
|
||||
string dest = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||
foreach (var buildAsset in bundleInfo.BuildinAssets)
|
||||
foreach (var assetInfo in bundleInfo.AllMainAssets)
|
||||
{
|
||||
if (buildAsset.IsRawAsset)
|
||||
EditorTools.CopyFile(buildAsset.AssetPath, dest, true);
|
||||
if (assetInfo.IsRawAsset)
|
||||
EditorTools.CopyFile(assetInfo.AssetPath, dest, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,23 +8,23 @@ using UnityEditor.Build.Pipeline.Interfaces;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
public class PatchManifestContext : IContextObject
|
||||
public class ManifestContext : IContextObject
|
||||
{
|
||||
internal PatchManifest Manifest;
|
||||
internal PackageManifest Manifest;
|
||||
}
|
||||
|
||||
[TaskAttribute("创建补丁清单文件")]
|
||||
public class TaskCreatePatchManifest : IBuildTask
|
||||
[TaskAttribute("创建清单文件")]
|
||||
public class TaskCreateManifest : IBuildTask
|
||||
{
|
||||
void IBuildTask.Run(BuildContext context)
|
||||
{
|
||||
CreatePatchManifestFile(context);
|
||||
CreateManifestFile(context);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建补丁清单文件到输出目录
|
||||
/// </summary>
|
||||
private void CreatePatchManifestFile(BuildContext context)
|
||||
private void CreateManifestFile(BuildContext context)
|
||||
{
|
||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||
@@ -32,14 +32,14 @@ namespace YooAsset.Editor
|
||||
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);
|
||||
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)
|
||||
@@ -47,7 +47,7 @@ namespace YooAsset.Editor
|
||||
if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
|
||||
{
|
||||
var buildResultContext = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||
UpdateBuiltInBundleReference(patchManifest, buildResultContext, buildMapContext.ShadersBundleName);
|
||||
UpdateBuiltInBundleReference(manifest, buildResultContext, buildMapContext.ShadersBundleName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace YooAsset.Editor
|
||||
if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
|
||||
{
|
||||
var buildResultContext = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||
UpdateScriptPipelineReference(patchManifest, buildResultContext);
|
||||
UpdateScriptPipelineReference(manifest, buildResultContext);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace YooAsset.Editor
|
||||
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
|
||||
{
|
||||
var buildResultContext = context.GetContextObject<TaskBuilding.BuildResultContext>();
|
||||
UpdateBuiltinPipelineReference(patchManifest, buildResultContext);
|
||||
UpdateBuiltinPipelineReference(manifest, buildResultContext);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace YooAsset.Editor
|
||||
{
|
||||
string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||
string filePath = $"{packageOutputDirectory}/{fileName}";
|
||||
PatchManifestTools.SerializeToJson(filePath, patchManifest);
|
||||
ManifestTools.SerializeToJson(filePath, manifest);
|
||||
BuildLogger.Log($"创建补丁清单文件:{filePath}");
|
||||
}
|
||||
|
||||
@@ -84,14 +84,14 @@ namespace YooAsset.Editor
|
||||
{
|
||||
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||
string filePath = $"{packageOutputDirectory}/{fileName}";
|
||||
PatchManifestTools.SerializeToBinary(filePath, patchManifest);
|
||||
ManifestTools.SerializeToBinary(filePath, manifest);
|
||||
packageHash = HashUtility.FileMD5(filePath);
|
||||
BuildLogger.Log($"创建补丁清单文件:{filePath}");
|
||||
|
||||
PatchManifestContext patchManifestContext = new PatchManifestContext();
|
||||
ManifestContext manifestContext = new ManifestContext();
|
||||
byte[] bytesData = FileUtility.ReadAllBytes(filePath);
|
||||
patchManifestContext.Manifest = PatchManifestTools.DeserializeFromBinary(bytesData);
|
||||
context.SetContextObject(patchManifestContext);
|
||||
manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData);
|
||||
context.SetContextObject(manifestContext);
|
||||
}
|
||||
|
||||
// 创建补丁清单哈希文件
|
||||
@@ -114,15 +114,15 @@ namespace YooAsset.Editor
|
||||
/// <summary>
|
||||
/// 获取资源包列表
|
||||
/// </summary>
|
||||
private List<PatchBundle> GetAllPatchBundle(BuildContext context)
|
||||
private List<PackageBundle> GetAllPackageBundle(BuildContext context)
|
||||
{
|
||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||
|
||||
List<PatchBundle> result = new List<PatchBundle>(1000);
|
||||
List<PackageBundle> result = new List<PackageBundle>(1000);
|
||||
foreach (var bundleInfo in buildMapContext.Collection)
|
||||
{
|
||||
var patchBundle = bundleInfo.CreatePatchBundle();
|
||||
result.Add(patchBundle);
|
||||
var packageBundle = bundleInfo.CreatePackageBundle();
|
||||
result.Add(packageBundle);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -130,38 +130,38 @@ namespace YooAsset.Editor
|
||||
/// <summary>
|
||||
/// 获取资源列表
|
||||
/// </summary>
|
||||
private List<PatchAsset> GetAllPatchAsset(BuildContext context, PatchManifest patchManifest)
|
||||
private List<PackageAsset> GetAllPackageAsset(BuildContext context, PackageManifest manifest)
|
||||
{
|
||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||
|
||||
List<PatchAsset> result = new List<PatchAsset>(1000);
|
||||
List<PackageAsset> result = new List<PackageAsset>(1000);
|
||||
foreach (var bundleInfo in buildMapContext.Collection)
|
||||
{
|
||||
var assetInfos = bundleInfo.GetAllPatchAssetInfos();
|
||||
var assetInfos = bundleInfo.GetAllMainAssetInfos();
|
||||
foreach (var assetInfo in assetInfos)
|
||||
{
|
||||
PatchAsset patchAsset = new PatchAsset();
|
||||
PackageAsset packageAsset = new PackageAsset();
|
||||
if (buildMapContext.EnableAddressable)
|
||||
patchAsset.Address = assetInfo.Address;
|
||||
packageAsset.Address = assetInfo.Address;
|
||||
else
|
||||
patchAsset.Address = string.Empty;
|
||||
patchAsset.AssetPath = assetInfo.AssetPath;
|
||||
patchAsset.AssetTags = assetInfo.AssetTags.ToArray();
|
||||
patchAsset.BundleID = GetAssetBundleID(assetInfo.BundleName, patchManifest);
|
||||
patchAsset.DependIDs = GetAssetBundleDependIDs(patchAsset.BundleID, assetInfo, patchManifest);
|
||||
result.Add(patchAsset);
|
||||
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, PatchManifest patchManifest)
|
||||
private int[] GetAssetBundleDependIDs(int mainBundleID, BuildAssetInfo assetInfo, PackageManifest manifest)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
|
||||
{
|
||||
if (dependAssetInfo.HasBundleName())
|
||||
{
|
||||
int bundleID = GetAssetBundleID(dependAssetInfo.BundleName, patchManifest);
|
||||
int bundleID = GetAssetBundleID(dependAssetInfo.BundleName, manifest);
|
||||
if (mainBundleID != bundleID)
|
||||
{
|
||||
if (result.Contains(bundleID) == false)
|
||||
@@ -171,11 +171,11 @@ namespace YooAsset.Editor
|
||||
}
|
||||
return result.ToArray();
|
||||
}
|
||||
private int GetAssetBundleID(string bundleName, PatchManifest patchManifest)
|
||||
private int GetAssetBundleID(string bundleName, PackageManifest manifest)
|
||||
{
|
||||
for (int index = 0; index < patchManifest.BundleList.Count; index++)
|
||||
for (int index = 0; index < manifest.BundleList.Count; index++)
|
||||
{
|
||||
if (patchManifest.BundleList[index].BundleName == bundleName)
|
||||
if (manifest.BundleList[index].BundleName == bundleName)
|
||||
return index;
|
||||
}
|
||||
throw new Exception($"Not found bundle name : {bundleName}");
|
||||
@@ -184,7 +184,7 @@ namespace YooAsset.Editor
|
||||
/// <summary>
|
||||
/// 更新Unity内置资源包的引用关系
|
||||
/// </summary>
|
||||
private void UpdateBuiltInBundleReference(PatchManifest patchManifest, TaskBuilding_SBP.BuildResultContext buildResultContext, string shadersBunldeName)
|
||||
private void UpdateBuiltInBundleReference(PackageManifest manifest, TaskBuilding_SBP.BuildResultContext buildResultContext, string shadersBunldeName)
|
||||
{
|
||||
// 获取所有依赖着色器资源包的资源包列表
|
||||
List<string> shaderBundleReferenceList = new List<string>();
|
||||
@@ -199,33 +199,33 @@ namespace YooAsset.Editor
|
||||
return;
|
||||
|
||||
// 获取着色器资源包索引
|
||||
Predicate<PatchBundle> predicate = new Predicate<PatchBundle>(s => s.BundleName == shadersBunldeName);
|
||||
int shaderBundleId = patchManifest.BundleList.FindIndex(predicate);
|
||||
Predicate<PackageBundle> predicate = new Predicate<PackageBundle>(s => s.BundleName == shadersBunldeName);
|
||||
int shaderBundleId = manifest.BundleList.FindIndex(predicate);
|
||||
if (shaderBundleId == -1)
|
||||
throw new Exception("没有发现着色器资源包!");
|
||||
|
||||
// 检测依赖交集并更新依赖ID
|
||||
foreach (var patchAsset in patchManifest.AssetList)
|
||||
foreach (var packageAsset in manifest.AssetList)
|
||||
{
|
||||
List<string> dependBundles = GetPatchAssetAllDependBundles(patchManifest, patchAsset);
|
||||
List<string> dependBundles = GetPackageAssetAllDependBundles(manifest, packageAsset);
|
||||
List<string> conflictAssetPathList = dependBundles.Intersect(shaderBundleReferenceList).ToList();
|
||||
if (conflictAssetPathList.Count > 0)
|
||||
{
|
||||
List<int> newDependIDs = new List<int>(patchAsset.DependIDs);
|
||||
List<int> newDependIDs = new List<int>(packageAsset.DependIDs);
|
||||
if (newDependIDs.Contains(shaderBundleId) == false)
|
||||
newDependIDs.Add(shaderBundleId);
|
||||
patchAsset.DependIDs = newDependIDs.ToArray();
|
||||
packageAsset.DependIDs = newDependIDs.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
private List<string> GetPatchAssetAllDependBundles(PatchManifest patchManifest, PatchAsset patchAsset)
|
||||
private List<string> GetPackageAssetAllDependBundles(PackageManifest manifest, PackageAsset packageAsset)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
string mainBundle = patchManifest.BundleList[patchAsset.BundleID].BundleName;
|
||||
string mainBundle = manifest.BundleList[packageAsset.BundleID].BundleName;
|
||||
result.Add(mainBundle);
|
||||
foreach (var dependID in patchAsset.DependIDs)
|
||||
foreach (var dependID in packageAsset.DependIDs)
|
||||
{
|
||||
string dependBundle = patchManifest.BundleList[dependID].BundleName;
|
||||
string dependBundle = manifest.BundleList[dependID].BundleName;
|
||||
result.Add(dependBundle);
|
||||
}
|
||||
return result;
|
||||
@@ -235,18 +235,18 @@ namespace YooAsset.Editor
|
||||
private readonly Dictionary<string, int> _cachedBundleID = new Dictionary<string, int>(10000);
|
||||
private readonly Dictionary<string, string[]> _cachedBundleDepends = new Dictionary<string, string[]>(10000);
|
||||
|
||||
private void UpdateScriptPipelineReference(PatchManifest patchManifest, TaskBuilding_SBP.BuildResultContext buildResultContext)
|
||||
private void UpdateScriptPipelineReference(PackageManifest manifest, TaskBuilding_SBP.BuildResultContext buildResultContext)
|
||||
{
|
||||
int progressValue;
|
||||
int totalCount = patchManifest.BundleList.Count;
|
||||
int totalCount = manifest.BundleList.Count;
|
||||
|
||||
// 缓存资源包ID
|
||||
_cachedBundleID.Clear();
|
||||
progressValue = 0;
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
int bundleID = GetAssetBundleID(patchBundle.BundleName, patchManifest);
|
||||
_cachedBundleID.Add(patchBundle.BundleName, bundleID);
|
||||
int bundleID = GetAssetBundleID(packageBundle.BundleName, manifest);
|
||||
_cachedBundleID.Add(packageBundle.BundleName, bundleID);
|
||||
EditorTools.DisplayProgressBar("缓存资源包索引", ++progressValue, totalCount);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
@@ -254,43 +254,43 @@ namespace YooAsset.Editor
|
||||
// 缓存资源包依赖
|
||||
_cachedBundleDepends.Clear();
|
||||
progressValue = 0;
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
if (patchBundle.IsRawFile)
|
||||
if (packageBundle.IsRawFile)
|
||||
{
|
||||
_cachedBundleDepends.Add(patchBundle.BundleName, new string[] { });
|
||||
_cachedBundleDepends.Add(packageBundle.BundleName, new string[] { });
|
||||
continue;
|
||||
}
|
||||
|
||||
if (buildResultContext.Results.BundleInfos.ContainsKey(patchBundle.BundleName) == false)
|
||||
throw new Exception($"Not found bundle in SBP build results : {patchBundle.BundleName}");
|
||||
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[patchBundle.BundleName].Dependencies;
|
||||
_cachedBundleDepends.Add(patchBundle.BundleName, depends);
|
||||
var depends = buildResultContext.Results.BundleInfos[packageBundle.BundleName].Dependencies;
|
||||
_cachedBundleDepends.Add(packageBundle.BundleName, depends);
|
||||
EditorTools.DisplayProgressBar("缓存资源包依赖列表", ++progressValue, totalCount);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
|
||||
// 计算资源包引用列表
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
patchBundle.ReferenceIDs = GetBundleRefrenceIDs(patchManifest, patchBundle);
|
||||
packageBundle.ReferenceIDs = GetBundleRefrenceIDs(manifest, packageBundle);
|
||||
EditorTools.DisplayProgressBar("计算资源包引用关系", ++progressValue, totalCount);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
}
|
||||
private void UpdateBuiltinPipelineReference(PatchManifest patchManifest, TaskBuilding.BuildResultContext buildResultContext)
|
||||
private void UpdateBuiltinPipelineReference(PackageManifest manifest, TaskBuilding.BuildResultContext buildResultContext)
|
||||
{
|
||||
int progressValue;
|
||||
int totalCount = patchManifest.BundleList.Count;
|
||||
int totalCount = manifest.BundleList.Count;
|
||||
|
||||
// 缓存资源包ID
|
||||
_cachedBundleID.Clear();
|
||||
progressValue = 0;
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
int bundleID = GetAssetBundleID(patchBundle.BundleName, patchManifest);
|
||||
_cachedBundleID.Add(patchBundle.BundleName, bundleID);
|
||||
int bundleID = GetAssetBundleID(packageBundle.BundleName, manifest);
|
||||
_cachedBundleID.Add(packageBundle.BundleName, bundleID);
|
||||
EditorTools.DisplayProgressBar("缓存资源包索引", ++progressValue, totalCount);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
@@ -298,36 +298,36 @@ namespace YooAsset.Editor
|
||||
// 缓存资源包依赖
|
||||
_cachedBundleDepends.Clear();
|
||||
progressValue = 0;
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
if (patchBundle.IsRawFile)
|
||||
if (packageBundle.IsRawFile)
|
||||
{
|
||||
_cachedBundleDepends.Add(patchBundle.BundleName, new string[] { } );
|
||||
_cachedBundleDepends.Add(packageBundle.BundleName, new string[] { } );
|
||||
continue;
|
||||
}
|
||||
|
||||
var depends = buildResultContext.UnityManifest.GetDirectDependencies(patchBundle.BundleName);
|
||||
_cachedBundleDepends.Add(patchBundle.BundleName, depends);
|
||||
var depends = buildResultContext.UnityManifest.GetDirectDependencies(packageBundle.BundleName);
|
||||
_cachedBundleDepends.Add(packageBundle.BundleName, depends);
|
||||
EditorTools.DisplayProgressBar("缓存资源包依赖列表", ++progressValue, totalCount);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
|
||||
// 计算资源包引用列表
|
||||
progressValue = 0;
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
patchBundle.ReferenceIDs = GetBundleRefrenceIDs(patchManifest, patchBundle);
|
||||
packageBundle.ReferenceIDs = GetBundleRefrenceIDs(manifest, packageBundle);
|
||||
EditorTools.DisplayProgressBar("计算资源包引用关系", ++progressValue, totalCount);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
}
|
||||
|
||||
private int[] GetBundleRefrenceIDs(PatchManifest patchManifest, PatchBundle targetBundle)
|
||||
private int[] GetBundleRefrenceIDs(PackageManifest manifest, PackageBundle targetBundle)
|
||||
{
|
||||
List<string> referenceList = new List<string>();
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
string bundleName = patchBundle.BundleName;
|
||||
string bundleName = packageBundle.BundleName;
|
||||
if (bundleName == targetBundle.BundleName)
|
||||
continue;
|
||||
|
||||
@@ -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,14 +13,14 @@ namespace YooAsset.Editor
|
||||
var buildMode = buildParameters.Parameters.BuildMode;
|
||||
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
|
||||
{
|
||||
CopyPatchFiles(buildParameters, buildMapContext);
|
||||
CopyPackageFiles(buildParameters, buildMapContext);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 拷贝补丁文件到补丁包目录
|
||||
/// </summary>
|
||||
private void CopyPatchFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
||||
private void CopyPackageFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
||||
{
|
||||
var buildParameters = buildParametersContext.Parameters;
|
||||
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||
@@ -67,11 +67,11 @@ namespace YooAsset.Editor
|
||||
|
||||
// 拷贝所有补丁文件
|
||||
int progressValue = 0;
|
||||
int patchFileTotalCount = buildMapContext.Collection.Count;
|
||||
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();
|
||||
}
|
||||
@@ -12,21 +12,21 @@ namespace YooAsset.Editor
|
||||
{
|
||||
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||
var patchManifestContext = context.GetContextObject<PatchManifestContext>();
|
||||
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||
|
||||
var buildMode = buildParameters.Parameters.BuildMode;
|
||||
if (buildMode != EBuildMode.SimulateBuild)
|
||||
{
|
||||
CreateReportFile(buildParameters, buildMapContext, patchManifestContext);
|
||||
CreateReportFile(buildParameters, buildMapContext, manifestContext);
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
// 概述信息
|
||||
@@ -57,46 +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<ReportAssetInfo>(patchManifest.AssetList.Count);
|
||||
foreach (var patchAsset in patchManifest.AssetList)
|
||||
buildReport.AssetInfos = new List<ReportAssetInfo>(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<ReportBundleInfo>(patchManifest.BundleList.Count);
|
||||
foreach (var patchBundle in patchManifest.BundleList)
|
||||
buildReport.BundleInfos = new List<ReportBundleInfo>(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.ReferenceIDs = patchBundle.ReferenceIDs;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -110,12 +111,12 @@ namespace YooAsset.Editor
|
||||
/// <summary>
|
||||
/// 获取资源对象依赖的所有资源包
|
||||
/// </summary>
|
||||
private List<string> GetDependBundles(PatchManifest patchManifest, PatchAsset patchAsset)
|
||||
private List<string> GetDependBundles(PackageManifest manifest, PackageAsset packageAsset)
|
||||
{
|
||||
List<string> dependBundles = new List<string>(patchAsset.DependIDs.Length);
|
||||
foreach (int index in patchAsset.DependIDs)
|
||||
List<string> dependBundles = new List<string>(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,11 +131,11 @@ namespace YooAsset.Editor
|
||||
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,60 +151,69 @@ namespace YooAsset.Editor
|
||||
return result;
|
||||
}
|
||||
|
||||
private int GetMainAssetCount(PatchManifest patchManifest)
|
||||
/// <summary>
|
||||
/// 获取该资源包内的所有资源(包括零依赖资源)
|
||||
/// </summary>
|
||||
private List<string> 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;
|
||||
}
|
||||
|
||||
@@ -26,41 +26,28 @@ namespace YooAsset.Editor
|
||||
/// </summary>
|
||||
public BuildMapContext CreateBuildMap(EBuildMode buildMode, string packageName)
|
||||
{
|
||||
Dictionary<string, BuildAssetInfo> buildAssetInfoDic = new Dictionary<string, BuildAssetInfo>(1000);
|
||||
Dictionary<string, BuildAssetInfo> allBuildAssetInfoDic = new Dictionary<string, BuildAssetInfo>(1000);
|
||||
|
||||
// 1. 检测配置合法性
|
||||
AssetBundleCollectorSettingData.Setting.CheckConfigError();
|
||||
|
||||
// 2. 获取所有收集器收集的资源
|
||||
var collectResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(buildMode, packageName);
|
||||
List<CollectAssetInfo> collectAssetInfos = collectResult.CollectAssets;
|
||||
List<CollectAssetInfo> allCollectAssetInfos = collectResult.CollectAssets;
|
||||
|
||||
// 3. 剔除未被引用的依赖项资源
|
||||
List<CollectAssetInfo> removeDependList = new List<CollectAssetInfo>();
|
||||
foreach (var collectAssetInfo in collectAssetInfos)
|
||||
{
|
||||
if (collectAssetInfo.CollectorType == ECollectorType.DependAssetCollector)
|
||||
{
|
||||
if (IsRemoveDependAsset(collectAssetInfos, collectAssetInfo.AssetPath))
|
||||
removeDependList.Add(collectAssetInfo);
|
||||
}
|
||||
}
|
||||
foreach (var removeValue in removeDependList)
|
||||
{
|
||||
collectAssetInfos.Remove(removeValue);
|
||||
}
|
||||
RemoveZeroReferenceAssets(allCollectAssetInfos);
|
||||
|
||||
// 4. 录入所有收集器收集的资源
|
||||
foreach (var collectAssetInfo in collectAssetInfos)
|
||||
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||
{
|
||||
if (buildAssetInfoDic.ContainsKey(collectAssetInfo.AssetPath) == false)
|
||||
if (allBuildAssetInfoDic.ContainsKey(collectAssetInfo.AssetPath) == false)
|
||||
{
|
||||
var buildAssetInfo = new BuildAssetInfo(
|
||||
collectAssetInfo.CollectorType, collectAssetInfo.BundleName,
|
||||
var buildAssetInfo = new BuildAssetInfo(collectAssetInfo.CollectorType, collectAssetInfo.BundleName,
|
||||
collectAssetInfo.Address, collectAssetInfo.AssetPath, collectAssetInfo.IsRawAsset);
|
||||
buildAssetInfo.AddAssetTags(collectAssetInfo.AssetTags);
|
||||
buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
|
||||
buildAssetInfoDic.Add(collectAssetInfo.AssetPath, buildAssetInfo);
|
||||
allBuildAssetInfoDic.Add(collectAssetInfo.AssetPath, buildAssetInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -69,91 +56,125 @@ namespace YooAsset.Editor
|
||||
}
|
||||
|
||||
// 5. 录入所有收集资源的依赖资源
|
||||
foreach (var collectAssetInfo in collectAssetInfos)
|
||||
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||
{
|
||||
string collectAssetBundleName = collectAssetInfo.BundleName;
|
||||
foreach (var dependAssetPath in collectAssetInfo.DependAssets)
|
||||
{
|
||||
if (buildAssetInfoDic.ContainsKey(dependAssetPath))
|
||||
if (allBuildAssetInfoDic.ContainsKey(dependAssetPath))
|
||||
{
|
||||
buildAssetInfoDic[dependAssetPath].AddBundleTags(collectAssetInfo.AssetTags);
|
||||
buildAssetInfoDic[dependAssetPath].AddReferenceBundleName(collectAssetBundleName);
|
||||
allBuildAssetInfoDic[dependAssetPath].AddBundleTags(collectAssetInfo.AssetTags);
|
||||
allBuildAssetInfoDic[dependAssetPath].AddReferenceBundleName(collectAssetBundleName);
|
||||
}
|
||||
else
|
||||
{
|
||||
var buildAssetInfo = new BuildAssetInfo(dependAssetPath);
|
||||
buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags);
|
||||
buildAssetInfo.AddReferenceBundleName(collectAssetBundleName);
|
||||
buildAssetInfoDic.Add(dependAssetPath, buildAssetInfo);
|
||||
allBuildAssetInfoDic.Add(dependAssetPath, buildAssetInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 填充所有收集资源的依赖列表
|
||||
foreach (var collectAssetInfo in collectAssetInfos)
|
||||
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||
{
|
||||
var dependAssetInfos = new List<BuildAssetInfo>(collectAssetInfo.DependAssets.Count);
|
||||
foreach (var dependAssetPath in collectAssetInfo.DependAssets)
|
||||
{
|
||||
if (buildAssetInfoDic.TryGetValue(dependAssetPath, out BuildAssetInfo value))
|
||||
if (allBuildAssetInfoDic.TryGetValue(dependAssetPath, out BuildAssetInfo value))
|
||||
dependAssetInfos.Add(value);
|
||||
else
|
||||
throw new Exception("Should never get here !");
|
||||
}
|
||||
buildAssetInfoDic[collectAssetInfo.AssetPath].SetAllDependAssetInfos(dependAssetInfos);
|
||||
allBuildAssetInfoDic[collectAssetInfo.AssetPath].SetAllDependAssetInfos(dependAssetInfos);
|
||||
}
|
||||
|
||||
// 7. 记录关键信息
|
||||
BuildMapContext context = new BuildMapContext();
|
||||
context.AssetFileCount = buildAssetInfoDic.Count;
|
||||
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 (KeyValuePair<string, BuildAssetInfo> pair in buildAssetInfoDic)
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
{
|
||||
pair.Value.CalculateShareBundleName(command.UniqueBundleName, command.PackageName, command.ShadersBundleName);
|
||||
buildAssetInfo.CalculateShareBundleName(command.UniqueBundleName, command.PackageName, command.ShadersBundleName);
|
||||
}
|
||||
|
||||
// 9. 移除不参与构建的资源
|
||||
List<BuildAssetInfo> removeBuildList = new List<BuildAssetInfo>();
|
||||
foreach (KeyValuePair<string, BuildAssetInfo> pair in buildAssetInfoDic)
|
||||
foreach (var buildAssetInfo in allBuildAssetInfoDic.Values)
|
||||
{
|
||||
var buildAssetInfo = pair.Value;
|
||||
if (buildAssetInfo.HasBundleName() == false)
|
||||
removeBuildList.Add(buildAssetInfo);
|
||||
}
|
||||
foreach (var removeValue in removeBuildList)
|
||||
{
|
||||
buildAssetInfoDic.Remove(removeValue.AssetPath);
|
||||
allBuildAssetInfoDic.Remove(removeValue.AssetPath);
|
||||
}
|
||||
|
||||
// 10. 构建资源包
|
||||
var allBuildinAssets = buildAssetInfoDic.Values.ToList();
|
||||
if (allBuildinAssets.Count == 0)
|
||||
var allPackAssets = allBuildAssetInfoDic.Values.ToList();
|
||||
if (allPackAssets.Count == 0)
|
||||
throw new Exception("构建的资源列表不能为空");
|
||||
foreach (var assetInfo in allBuildinAssets)
|
||||
foreach (var assetInfo in allPackAssets)
|
||||
{
|
||||
context.PackAsset(assetInfo);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
private bool IsRemoveDependAsset(List<CollectAssetInfo> allCollectAssets, string dependAssetPath)
|
||||
private void RemoveZeroReferenceAssets(List<CollectAssetInfo> allCollectAssetInfos)
|
||||
{
|
||||
foreach (var collectAssetInfo in allCollectAssets)
|
||||
// 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<string> allDependAsset = new HashSet<string>();
|
||||
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||
{
|
||||
var collectorType = collectAssetInfo.CollectorType;
|
||||
if (collectorType == ECollectorType.MainAssetCollector || collectorType == ECollectorType.StaticAssetCollector)
|
||||
{
|
||||
if (collectAssetInfo.DependAssets.Contains(dependAssetPath))
|
||||
return false;
|
||||
foreach (var dependAsset in collectAssetInfo.DependAssets)
|
||||
{
|
||||
if (allDependAsset.Contains(dependAsset) == false)
|
||||
allDependAsset.Add(dependAsset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BuildLogger.Log($"发现未被依赖的资源并自动移除 : {dependAssetPath}");
|
||||
return true;
|
||||
// 3. 找出所有零引用的依赖资源集合
|
||||
List<CollectAssetInfo> removeList = new List<CollectAssetInfo>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -167,13 +188,13 @@ namespace YooAsset.Editor
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -51,8 +51,8 @@ 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))
|
||||
{
|
||||
BuildLogger.Log($"删除平台总目录:{platformDirectory}");
|
||||
|
||||
@@ -6,8 +6,8 @@ using UnityEditor;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
[TaskAttribute("更新补丁信息")]
|
||||
public class TaskUpdatePatchInfo : IBuildTask
|
||||
[TaskAttribute("更新资源包信息")]
|
||||
public class TaskUpdateBundleInfo : IBuildTask
|
||||
{
|
||||
void IBuildTask.Run(BuildContext context)
|
||||
{
|
||||
@@ -17,40 +17,40 @@ namespace YooAsset.Editor
|
||||
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||
int outputNameStyle = (int)buildParametersContext.Parameters.OutputNameStyle;
|
||||
|
||||
// 1.检测路径长度
|
||||
// 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.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.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.Collection)
|
||||
{
|
||||
string patchFileExtension = PatchManifestTools.GetRemoteBundleFileExtension(bundleInfo.BundleName);
|
||||
string patchFileName = PatchManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleInfo.BundleName, patchFileExtension, bundleInfo.PatchInfo.PatchFileHash);
|
||||
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}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace YooAsset.Editor
|
||||
|
||||
if (bundleInfo.IsRawFile)
|
||||
{
|
||||
string filePath = bundleInfo.PatchInfo.BuildOutputFilePath;
|
||||
string filePath = bundleInfo.BundleInfo.BuildOutputFilePath;
|
||||
return HashUtility.FileMD5(filePath);
|
||||
}
|
||||
|
||||
@@ -226,7 +226,7 @@ namespace YooAsset.Editor
|
||||
if (command.BuildMode == EBuildMode.SimulateBuild)
|
||||
collectAssetInfo.DependAssets = new List<string>();
|
||||
else
|
||||
collectAssetInfo.DependAssets = GetAllDependencies(assetPath, isRawFilePackRule);
|
||||
collectAssetInfo.DependAssets = GetAllDependencies(assetPath);
|
||||
|
||||
return collectAssetInfo;
|
||||
}
|
||||
@@ -243,8 +243,8 @@ 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;
|
||||
|
||||
// 检测原生文件是否合规
|
||||
@@ -252,27 +252,29 @@ namespace YooAsset.Editor
|
||||
{
|
||||
string extension = StringUtility.RemoveFirstChar(System.IO.Path.GetExtension(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())
|
||||
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 (type == typeof(UnityEditor.DefaultAsset))
|
||||
if (assetType == typeof(UnityEditor.DefaultAsset))
|
||||
{
|
||||
UnityEngine.Debug.LogWarning($"Cannot pack default asset : {assetPath}");
|
||||
return false;
|
||||
@@ -331,13 +333,13 @@ namespace YooAsset.Editor
|
||||
tags.AddRange(temper);
|
||||
return tags;
|
||||
}
|
||||
private List<string> GetAllDependencies(string mainAssetPath, bool isRawFilePackRule)
|
||||
private List<string> GetAllDependencies(string mainAssetPath)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
string[] depends = AssetDatabase.GetDependencies(mainAssetPath, true);
|
||||
List<string> result = new List<string>(depends.Length);
|
||||
foreach (string assetPath in depends)
|
||||
{
|
||||
if (IsValidateAsset(assetPath, isRawFilePackRule))
|
||||
if (IsValidateAsset(assetPath, false))
|
||||
{
|
||||
// 注意:排除主资源对象
|
||||
if (assetPath != mainAssetPath)
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace YooAsset.Editor
|
||||
{
|
||||
public class AssetBundleCollectorConfig
|
||||
{
|
||||
public const string ConfigVersion = "2.3";
|
||||
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";
|
||||
|
||||
@@ -108,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)
|
||||
@@ -116,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);
|
||||
@@ -157,6 +161,12 @@ namespace YooAsset.Editor
|
||||
}
|
||||
}
|
||||
|
||||
// 检测配置错误
|
||||
foreach(var package in packages)
|
||||
{
|
||||
package.CheckConfigError();
|
||||
}
|
||||
|
||||
// 保存配置数据
|
||||
AssetBundleCollectorSettingData.ClearAll();
|
||||
AssetBundleCollectorSettingData.Setting.EnableAddressable = enableAddressable;
|
||||
@@ -208,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);
|
||||
@@ -347,6 +358,23 @@ namespace YooAsset.Editor
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载配置文件
|
||||
/// </summary>
|
||||
private static void LoadSettingData()
|
||||
{
|
||||
_setting = EditorHelper.LoadSettingData<AssetBundleCollectorSetting>();
|
||||
|
||||
// IPackRule
|
||||
{
|
||||
// 清空缓存集合
|
||||
@@ -108,6 +92,7 @@ namespace YooAsset.Editor
|
||||
List<Type> types = new List<Type>(100)
|
||||
{
|
||||
typeof(AddressByFileName),
|
||||
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<AssetBundleCollectorSetting>();
|
||||
return _setting;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 存储配置文件
|
||||
/// </summary>
|
||||
@@ -183,9 +179,6 @@ namespace YooAsset.Editor
|
||||
|
||||
public static List<RuleDisplayName> GetActiveRuleNames()
|
||||
{
|
||||
if (_setting == null)
|
||||
LoadSettingData();
|
||||
|
||||
List<RuleDisplayName> names = new List<RuleDisplayName>();
|
||||
foreach (var pair in _cacheActiveRuleTypes)
|
||||
{
|
||||
@@ -198,9 +191,6 @@ namespace YooAsset.Editor
|
||||
}
|
||||
public static List<RuleDisplayName> GetAddressRuleNames()
|
||||
{
|
||||
if (_setting == null)
|
||||
LoadSettingData();
|
||||
|
||||
List<RuleDisplayName> names = new List<RuleDisplayName>();
|
||||
foreach (var pair in _cacheAddressRuleTypes)
|
||||
{
|
||||
@@ -213,9 +203,6 @@ namespace YooAsset.Editor
|
||||
}
|
||||
public static List<RuleDisplayName> GetPackRuleNames()
|
||||
{
|
||||
if (_setting == null)
|
||||
LoadSettingData();
|
||||
|
||||
List<RuleDisplayName> names = new List<RuleDisplayName>();
|
||||
foreach (var pair in _cachePackRuleTypes)
|
||||
{
|
||||
@@ -228,9 +215,6 @@ namespace YooAsset.Editor
|
||||
}
|
||||
public static List<RuleDisplayName> GetFilterRuleNames()
|
||||
{
|
||||
if (_setting == null)
|
||||
LoadSettingData();
|
||||
|
||||
List<RuleDisplayName> names = new List<RuleDisplayName>();
|
||||
foreach (var pair in _cacheFilterRuleTypes)
|
||||
{
|
||||
@@ -243,7 +227,7 @@ namespace YooAsset.Editor
|
||||
}
|
||||
private static string GetRuleDisplayName(string name, Type type)
|
||||
{
|
||||
var attribute = EditorAttribute.GetAttribute<DisplayNameAttribute>(type);
|
||||
var attribute = DisplayNameAttributeHelper.GetAttribute<DisplayNameAttribute>(type);
|
||||
if (attribute != null && string.IsNullOrEmpty(attribute.DisplayName) == false)
|
||||
return attribute.DisplayName;
|
||||
else
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace YooAsset.Editor
|
||||
[MenuItem("YooAsset/AssetBundle Collector", false, 101)]
|
||||
public static void ShowExample()
|
||||
{
|
||||
AssetBundleCollectorWindow window = GetWindow<AssetBundleCollectorWindow>("资源包收集工具", true, EditorDefine.DockedWindowTypes);
|
||||
AssetBundleCollectorWindow window = GetWindow<AssetBundleCollectorWindow>("资源包收集工具", true, WindowsDefine.DockedWindowTypes);
|
||||
window.minSize = new Vector2(800, 600);
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace YooAsset.Editor
|
||||
VisualElement root = this.rootVisualElement;
|
||||
|
||||
// 加载布局文件
|
||||
var visualAsset = EditorHelper.LoadWindowUXML<AssetBundleCollectorWindow>();
|
||||
var visualAsset = UxmlLoader.LoadWindowUXML<AssetBundleCollectorWindow>();
|
||||
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();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -11,6 +11,15 @@ namespace YooAsset.Editor
|
||||
}
|
||||
}
|
||||
|
||||
[DisplayName("定位地址: 文件路径")]
|
||||
public class AddressByFilePath : IAddressRule
|
||||
{
|
||||
string IAddressRule.GetAssetAddress(AddressRuleData data)
|
||||
{
|
||||
return data.AssetPath;
|
||||
}
|
||||
}
|
||||
|
||||
[DisplayName("定位地址: 分组名+文件名")]
|
||||
public class AddressByGroupAndFileName : IAddressRule
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace YooAsset.Editor
|
||||
}
|
||||
}
|
||||
|
||||
public static class EditorAttribute
|
||||
public static class DisplayNameAttributeHelper
|
||||
{
|
||||
internal static T GetAttribute<T>(Type type) where T : Attribute
|
||||
{
|
||||
@@ -15,7 +15,7 @@ namespace YooAsset.Editor
|
||||
[MenuItem("YooAsset/AssetBundle Debugger", false, 104)]
|
||||
public static void ShowExample()
|
||||
{
|
||||
AssetBundleDebuggerWindow wnd = GetWindow<AssetBundleDebuggerWindow>("资源包调试工具", true, EditorDefine.DockedWindowTypes);
|
||||
AssetBundleDebuggerWindow wnd = GetWindow<AssetBundleDebuggerWindow>("资源包调试工具", true, WindowsDefine.DockedWindowTypes);
|
||||
wnd.minSize = new Vector2(800, 600);
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace YooAsset.Editor
|
||||
VisualElement root = rootVisualElement;
|
||||
|
||||
// 加载布局文件
|
||||
var visualAsset = EditorHelper.LoadWindowUXML<AssetBundleDebuggerWindow>();
|
||||
var visualAsset = UxmlLoader.LoadWindowUXML<AssetBundleDebuggerWindow>();
|
||||
if (visualAsset == null)
|
||||
return;
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace YooAsset.Editor
|
||||
public void InitViewer()
|
||||
{
|
||||
// 加载布局文件
|
||||
_visualAsset = EditorHelper.LoadWindowUXML<DebuggerAssetListViewer>();
|
||||
_visualAsset = UxmlLoader.LoadWindowUXML<DebuggerAssetListViewer>();
|
||||
if (_visualAsset == null)
|
||||
return;
|
||||
|
||||
@@ -45,6 +45,10 @@ namespace YooAsset.Editor
|
||||
_dependListView = _root.Q<ListView>("BottomListView");
|
||||
_dependListView.makeItem = MakeDependListViewItem;
|
||||
_dependListView.bindItem = BindDependListViewItem;
|
||||
|
||||
#if UNITY_2020_3_OR_NEWER
|
||||
SplitView.Adjuster(_root);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace YooAsset.Editor
|
||||
public void InitViewer()
|
||||
{
|
||||
// 加载布局文件
|
||||
_visualAsset = EditorHelper.LoadWindowUXML<DebuggerBundleListViewer>();
|
||||
_visualAsset = UxmlLoader.LoadWindowUXML<DebuggerBundleListViewer>();
|
||||
if (_visualAsset == null)
|
||||
return;
|
||||
|
||||
@@ -45,6 +45,10 @@ namespace YooAsset.Editor
|
||||
_usingListView = _root.Q<ListView>("BottomListView");
|
||||
_usingListView.makeItem = MakeIncludeListViewItem;
|
||||
_usingListView.bindItem = BindIncludeListViewItem;
|
||||
|
||||
#if UNITY_2020_3_OR_NEWER
|
||||
SplitView.Adjuster(_root);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace YooAsset.Editor
|
||||
[MenuItem("YooAsset/AssetBundle Reporter", false, 103)]
|
||||
public static void ShowExample()
|
||||
{
|
||||
AssetBundleReporterWindow window = GetWindow<AssetBundleReporterWindow>("资源包报告工具", true, EditorDefine.DockedWindowTypes);
|
||||
AssetBundleReporterWindow window = GetWindow<AssetBundleReporterWindow>("资源包报告工具", true, WindowsDefine.DockedWindowTypes);
|
||||
window.minSize = new Vector2(800, 600);
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace YooAsset.Editor
|
||||
VisualElement root = this.rootVisualElement;
|
||||
|
||||
// 加载布局文件
|
||||
var visualAsset = EditorHelper.LoadWindowUXML<AssetBundleReporterWindow>();
|
||||
var visualAsset = UxmlLoader.LoadWindowUXML<AssetBundleReporterWindow>();
|
||||
if (visualAsset == null)
|
||||
return;
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace YooAsset.Editor
|
||||
public void InitViewer()
|
||||
{
|
||||
// 加载布局文件
|
||||
_visualAsset = EditorHelper.LoadWindowUXML<ReporterAssetListViewer>();
|
||||
_visualAsset = UxmlLoader.LoadWindowUXML<ReporterAssetListViewer>();
|
||||
if (_visualAsset == null)
|
||||
return;
|
||||
|
||||
@@ -68,6 +68,10 @@ namespace YooAsset.Editor
|
||||
_dependListView = _root.Q<ListView>("BottomListView");
|
||||
_dependListView.makeItem = MakeDependListViewItem;
|
||||
_dependListView.bindItem = BindDependListViewItem;
|
||||
|
||||
#if UNITY_2020_3_OR_NEWER
|
||||
SplitView.Adjuster(_root);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace YooAsset.Editor
|
||||
public void InitViewer()
|
||||
{
|
||||
// 加载布局文件
|
||||
_visualAsset = EditorHelper.LoadWindowUXML<ReporterBundleListViewer>();
|
||||
_visualAsset = UxmlLoader.LoadWindowUXML<ReporterBundleListViewer>();
|
||||
if (_visualAsset == null)
|
||||
return;
|
||||
|
||||
@@ -76,6 +76,10 @@ namespace YooAsset.Editor
|
||||
_includeListView = _root.Q<ListView>("BottomListView");
|
||||
_includeListView.makeItem = MakeIncludeListViewItem;
|
||||
_includeListView.bindItem = BindIncludeListViewItem;
|
||||
|
||||
#if UNITY_2020_3_OR_NEWER
|
||||
SplitView.Adjuster(_root);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
|
||||
<ui:VisualElement name="Viewer" style="flex-grow: 1; display: flex;">
|
||||
<ui:VisualElement name="TopGroup" style="flex-grow: 1; border-left-width: 1px; border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); margin-left: 0; margin-right: 0; margin-top: 2px; margin-bottom: 1px; display: flex;">
|
||||
<uie:Toolbar name="TopBar" style="height: 25px; margin-left: 1px; margin-right: 1px;">
|
||||
<uie:ToolbarButton text="Bundle Name" display-tooltip-when-elided="true" name="TopBar1" style="width: 280px; -unity-text-align: middle-left; flex-grow: 1;" />
|
||||
<uie:ToolbarButton text="Size" display-tooltip-when-elided="true" name="TopBar2" style="width: 100px; -unity-text-align: middle-left; flex-grow: 0;" />
|
||||
<uie:ToolbarButton text="Hash" display-tooltip-when-elided="true" name="TopBar3" style="width: 280px; -unity-text-align: middle-left;" />
|
||||
<uie:ToolbarButton text="LoadMethod" display-tooltip-when-elided="true" name="TopBar4" style="width: 150px; -unity-text-align: middle-left; flex-grow: 0;" />
|
||||
<uie:ToolbarButton text="Tags" display-tooltip-when-elided="true" name="TopBar5" style="width: 80px; -unity-text-align: middle-left; flex-grow: 1;" />
|
||||
</uie:Toolbar>
|
||||
<ui:ListView focusable="true" name="TopListView" item-height="18" virtualization-method="DynamicHeight" style="flex-grow: 1; flex-basis: 60px;" />
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement name="BottomGroup" style="height: 200px; border-left-width: 1px; border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); margin-left: 0; margin-right: 0; margin-top: 1px; margin-bottom: 1px; display: flex;">
|
||||
<uie:Toolbar name="BottomBar" style="height: 25px; margin-left: 1px; margin-right: 1px;">
|
||||
<uie:ToolbarButton text="Include Assets" display-tooltip-when-elided="true" name="BottomBar1" style="width: 280px; -unity-text-align: middle-left; flex-grow: 1;" />
|
||||
<uie:ToolbarButton text="GUID" display-tooltip-when-elided="true" name="BottomBar2" style="width: 280px; -unity-text-align: middle-left;" />
|
||||
</uie:Toolbar>
|
||||
<ui:ListView focusable="true" name="BottomListView" item-height="18" virtualization-method="DynamicHeight" style="flex-grow: 1;" />
|
||||
</ui:VisualElement>
|
||||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" editor-extension-mode="False">
|
||||
<ui:VisualElement name="TopGroup" style="flex-grow: 1; border-left-width: 1px; border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); margin-left: 0; margin-right: 0; margin-top: 2px; margin-bottom: 1px; display: flex;">
|
||||
<uie:Toolbar name="TopBar" style="height: 25px; margin-left: 1px; margin-right: 1px;">
|
||||
<uie:ToolbarButton text="Bundle Name" display-tooltip-when-elided="true" name="TopBar1" style="width: 280px; -unity-text-align: middle-left; flex-grow: 1;" />
|
||||
<uie:ToolbarButton text="Size" display-tooltip-when-elided="true" name="TopBar2" style="width: 100px; -unity-text-align: middle-left; flex-grow: 0;" />
|
||||
<uie:ToolbarButton text="Hash" display-tooltip-when-elided="true" name="TopBar3" style="width: 280px; -unity-text-align: middle-left;" />
|
||||
<uie:ToolbarButton text="LoadMethod" display-tooltip-when-elided="true" name="TopBar4" style="width: 150px; -unity-text-align: middle-left; flex-grow: 0;" />
|
||||
<uie:ToolbarButton text="Tags" display-tooltip-when-elided="true" name="TopBar5" style="width: 80px; -unity-text-align: middle-left; flex-grow: 1;" />
|
||||
</uie:Toolbar>
|
||||
<ui:ListView focusable="true" name="TopListView" item-height="18" virtualization-method="DynamicHeight" style="flex-grow: 1; flex-basis: 60px;" />
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement name="BottomGroup" style="height: 200px; border-left-width: 1px; border-right-width: 1px; border-top-width: 1px; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); margin-left: 0; margin-right: 0; margin-top: 1px; margin-bottom: 1px; display: flex;">
|
||||
<uie:Toolbar name="BottomBar" style="height: 25px; margin-left: 1px; margin-right: 1px;">
|
||||
<uie:ToolbarButton text="Include Assets" display-tooltip-when-elided="true" name="BottomBar1" style="width: 280px; -unity-text-align: middle-left; flex-grow: 1;" />
|
||||
<uie:ToolbarButton text="GUID" display-tooltip-when-elided="true" name="BottomBar2" style="width: 280px; -unity-text-align: middle-left;" />
|
||||
</uie:Toolbar>
|
||||
<ui:ListView focusable="true" name="BottomListView" item-height="18" virtualization-method="DynamicHeight" style="flex-grow: 1;" />
|
||||
</ui:VisualElement>
|
||||
</ui:UXML>
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace YooAsset.Editor
|
||||
public void InitViewer()
|
||||
{
|
||||
// 加载布局文件
|
||||
_visualAsset = EditorHelper.LoadWindowUXML<ReporterSummaryViewer>();
|
||||
_visualAsset = UxmlLoader.LoadWindowUXML<ReporterSummaryViewer>();
|
||||
if (_visualAsset == null)
|
||||
return;
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
public class EditorDefine
|
||||
public class WindowsDefine
|
||||
{
|
||||
#if UNITY_2019_4_OR_NEWER
|
||||
/// <summary>
|
||||
/// 停靠窗口类型集合
|
||||
/// </summary>
|
||||
public static readonly Type[] DockedWindowTypes =
|
||||
public static readonly Type[] DockedWindowTypes =
|
||||
{
|
||||
typeof(AssetBundleBuilderWindow),
|
||||
typeof(AssetBundleCollectorWindow),
|
||||
|
||||
@@ -582,7 +582,7 @@ namespace YooAsset.Editor
|
||||
/// <param name="key">关键字</param>
|
||||
/// <param name="includeKey">分割的结果里是否包含关键字</param>
|
||||
/// <param name="searchBegin">是否使用初始匹配的位置,否则使用末尾匹配的位置</param>
|
||||
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;
|
||||
|
||||
45
Assets/YooAsset/Editor/SettingLoader.cs
Normal file
45
Assets/YooAsset/Editor/SettingLoader.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
public class SettingLoader
|
||||
{
|
||||
/// <summary>
|
||||
/// 加载相关的配置文件
|
||||
/// </summary>
|
||||
public static TSetting LoadSettingData<TSetting>() 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<TSetting>();
|
||||
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<TSetting>(filePath);
|
||||
return setting;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置数据是否被修改
|
||||
/// </summary>
|
||||
public static bool IsDirty { set; get; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 加载配置文件
|
||||
/// </summary>
|
||||
private static void LoadSettingData()
|
||||
{
|
||||
_setting = EditorHelper.LoadSettingData<ShaderVariantCollectorSetting>();
|
||||
_setting = SettingLoader.LoadSettingData<ShaderVariantCollectorSetting>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -35,6 +39,7 @@ namespace YooAsset.Editor
|
||||
{
|
||||
if (Setting != null)
|
||||
{
|
||||
IsDirty = false;
|
||||
EditorUtility.SetDirty(Setting);
|
||||
AssetDatabase.SaveAssets();
|
||||
Debug.Log($"{nameof(ShaderVariantCollectorSetting)}.asset is saved!");
|
||||
|
||||
@@ -14,12 +14,13 @@ namespace YooAsset.Editor
|
||||
[MenuItem("YooAsset/ShaderVariant Collector", false, 201)]
|
||||
public static void ShowExample()
|
||||
{
|
||||
ShaderVariantCollectorWindow window = GetWindow<ShaderVariantCollectorWindow>("着色器变种收集工具", true, EditorDefine.DockedWindowTypes);
|
||||
ShaderVariantCollectorWindow window = GetWindow<ShaderVariantCollectorWindow>("着色器变种收集工具", true, WindowsDefine.DockedWindowTypes);
|
||||
window.minSize = new Vector2(800, 600);
|
||||
}
|
||||
|
||||
private List<string> _packageNames;
|
||||
|
||||
private Button _saveButton;
|
||||
private Button _collectButton;
|
||||
private TextField _collectOutputField;
|
||||
private Label _currentShaderCountField;
|
||||
@@ -34,12 +35,16 @@ namespace YooAsset.Editor
|
||||
VisualElement root = this.rootVisualElement;
|
||||
|
||||
// 加载布局文件
|
||||
var visualAsset = EditorHelper.LoadWindowUXML<ShaderVariantCollectorWindow>();
|
||||
var visualAsset = UxmlLoader.LoadWindowUXML<ShaderVariantCollectorWindow>();
|
||||
if (visualAsset == null)
|
||||
return;
|
||||
|
||||
visualAsset.CloneTree(root);
|
||||
|
||||
// 配置保存按钮
|
||||
_saveButton = root.Q<Button>("SaveButton");
|
||||
_saveButton.clicked += SaveBtn_clicked;
|
||||
|
||||
// 包裹名称列表
|
||||
_packageNames = GetBuildPackageNames();
|
||||
|
||||
@@ -48,6 +53,7 @@ namespace YooAsset.Editor
|
||||
_collectOutputField.SetValueWithoutNotify(ShaderVariantCollectorSettingData.Setting.SavePath);
|
||||
_collectOutputField.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
ShaderVariantCollectorSettingData.IsDirty = true;
|
||||
ShaderVariantCollectorSettingData.Setting.SavePath = _collectOutputField.value;
|
||||
});
|
||||
|
||||
@@ -61,6 +67,7 @@ namespace YooAsset.Editor
|
||||
_packageField.style.width = 350;
|
||||
_packageField.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
ShaderVariantCollectorSettingData.IsDirty = true;
|
||||
ShaderVariantCollectorSettingData.Setting.CollectPackage = _packageField.value;
|
||||
});
|
||||
packageContainer.Add(_packageField);
|
||||
@@ -80,12 +87,14 @@ namespace YooAsset.Editor
|
||||
_processCapacitySlider.label = $"Capacity ({_processCapacitySlider.value})";
|
||||
_processCapacitySlider.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
ShaderVariantCollectorSettingData.IsDirty = true;
|
||||
ShaderVariantCollectorSettingData.Setting.ProcessCapacity = _processCapacitySlider.value;
|
||||
_processCapacitySlider.label = $"Capacity ({_processCapacitySlider.value})";
|
||||
});
|
||||
#else
|
||||
_processCapacitySlider.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
ShaderVariantCollectorSettingData.IsDirty = true;
|
||||
ShaderVariantCollectorSettingData.Setting.ProcessCapacity = _processCapacitySlider.value;
|
||||
});
|
||||
#endif
|
||||
@@ -102,8 +111,27 @@ namespace YooAsset.Editor
|
||||
Debug.LogError(e.ToString());
|
||||
}
|
||||
}
|
||||
public void OnDestroy()
|
||||
{
|
||||
if (ShaderVariantCollectorSettingData.IsDirty)
|
||||
ShaderVariantCollectorSettingData.SaveFile();
|
||||
}
|
||||
private void Update()
|
||||
{
|
||||
if (_saveButton != null)
|
||||
{
|
||||
if (ShaderVariantCollectorSettingData.IsDirty)
|
||||
{
|
||||
if (_saveButton.enabledSelf == false)
|
||||
_saveButton.SetEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_saveButton.enabledSelf)
|
||||
_saveButton.SetEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (_currentShaderCountField != null)
|
||||
{
|
||||
int currentShaderCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionShaderCount();
|
||||
@@ -117,6 +145,10 @@ namespace YooAsset.Editor
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveBtn_clicked()
|
||||
{
|
||||
ShaderVariantCollectorSettingData.SaveFile();
|
||||
}
|
||||
private void CollectButton_clicked()
|
||||
{
|
||||
string savePath = ShaderVariantCollectorSettingData.Setting.SavePath;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
|
||||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" editor-extension-mode="False">
|
||||
<uie:Toolbar name="Toolbar" style="display: flex; flex-direction: row-reverse;">
|
||||
<ui:Button text="Save" display-tooltip-when-elided="true" name="SaveButton" style="background-color: rgb(40, 106, 42);" />
|
||||
</uie:Toolbar>
|
||||
<ui:VisualElement name="CollectContainer">
|
||||
<uie:Toolbar name="Toolbar" style="display: flex; flex-direction: row-reverse;" />
|
||||
<ui:TextField picking-mode="Ignore" label="文件保存路径" name="CollectOutput" style="height: 22px;" />
|
||||
<ui:VisualElement name="PackageContainer" style="height: 24px;" />
|
||||
<ui:Label text="Current Shader Count" display-tooltip-when-elided="true" name="CurrentShaderCount" style="height: 20px; padding-left: 4px;" />
|
||||
|
||||
39
Assets/YooAsset/Editor/UxmlDefine.cs
Normal file
39
Assets/YooAsset/Editor/UxmlDefine.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
#if UNITY_2020_3_OR_NEWER
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
/// <summary>
|
||||
/// 分屏控件
|
||||
/// </summary>
|
||||
public class SplitView : TwoPaneSplitView
|
||||
{
|
||||
public new class UxmlFactory : UxmlFactory<SplitView, TwoPaneSplitView.UxmlTraits>
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 窗口分屏适配
|
||||
/// </summary>
|
||||
public static void Adjuster(VisualElement root)
|
||||
{
|
||||
var topGroup = root.Q<VisualElement>("TopGroup");
|
||||
var bottomGroup = root.Q<VisualElement>("BottomGroup");
|
||||
topGroup.style.minHeight = 100f;
|
||||
bottomGroup.style.minHeight = 100f;
|
||||
root.Remove(topGroup);
|
||||
root.Remove(bottomGroup);
|
||||
var spliteView = new SplitView();
|
||||
spliteView.fixedPaneInitialDimension = 300;
|
||||
spliteView.orientation = TwoPaneSplitViewOrientation.Vertical;
|
||||
spliteView.contentContainer.Add(topGroup);
|
||||
spliteView.contentContainer.Add(bottomGroup);
|
||||
root.Add(spliteView);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4eacb00a7e3873740b599112dfcf0123
|
||||
guid: 0c3f4136cf7142346ae33e8a82cbdb27
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -1,13 +1,15 @@
|
||||
using System.Collections;
|
||||
#if UNITY_2019_4_OR_NEWER
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace YooAsset.Editor
|
||||
{
|
||||
public class EditorHelper
|
||||
public class UxmlLoader
|
||||
{
|
||||
#if UNITY_2019_4_OR_NEWER
|
||||
private readonly static Dictionary<System.Type, string> _uxmlDic = new Dictionary<System.Type, string>();
|
||||
|
||||
/// <summary>
|
||||
@@ -48,41 +50,6 @@ namespace YooAsset.Editor
|
||||
}
|
||||
throw new System.Exception($"Not found UXML file : {windowType.Name}");
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// 加载相关的配置文件
|
||||
/// </summary>
|
||||
public static TSetting LoadSettingData<TSetting>() 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<TSetting>();
|
||||
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<TSetting>(filePath);
|
||||
return setting;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b6c8230c0d097534e950f4e84ce01e96
|
||||
guid: ed843f102c2467845b34fdce5d537e47
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
public class AssetReference
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
@@ -20,22 +21,37 @@ namespace YooAsset
|
||||
private bool _isUnloadSafe = true;
|
||||
private string _packageName;
|
||||
private bool _simulationOnEditor;
|
||||
private int _loadingMaxNumber;
|
||||
private long _loadingMaxTimeSlice;
|
||||
public int DownloadFailedTryAgain { private set; get; }
|
||||
public IDecryptionServices DecryptionServices { private set; get; }
|
||||
public IBundleServices BundleServices { private set; get; }
|
||||
|
||||
// 计时器相关
|
||||
private Stopwatch _watch;
|
||||
private long _frameTime;
|
||||
private bool IsBusy
|
||||
{
|
||||
get
|
||||
{
|
||||
return _watch.ElapsedMilliseconds - _frameTime >= _loadingMaxTimeSlice;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化
|
||||
/// 注意:在使用AssetSystem之前需要初始化
|
||||
/// </summary>
|
||||
public void Initialize(string packageName, bool simulationOnEditor, int loadingMaxNumber, IDecryptionServices decryptionServices, IBundleServices bundleServices)
|
||||
public void Initialize(string packageName, bool simulationOnEditor, long loadingMaxTimeSlice, int downloadFailedTryAgain,
|
||||
IDecryptionServices decryptionServices, IBundleServices bundleServices)
|
||||
{
|
||||
_packageName = packageName;
|
||||
_simulationOnEditor = simulationOnEditor;
|
||||
_loadingMaxNumber = loadingMaxNumber;
|
||||
_loadingMaxTimeSlice = loadingMaxTimeSlice;
|
||||
DownloadFailedTryAgain = downloadFailedTryAgain;
|
||||
DecryptionServices = decryptionServices;
|
||||
BundleServices = bundleServices;
|
||||
_watch = Stopwatch.StartNew();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -43,6 +59,8 @@ namespace YooAsset
|
||||
/// </summary>
|
||||
public void Update()
|
||||
{
|
||||
_frameTime = _watch.ElapsedMilliseconds;
|
||||
|
||||
// 更新加载器
|
||||
foreach (var loader in _loaderList)
|
||||
{
|
||||
@@ -51,24 +69,12 @@ namespace YooAsset
|
||||
|
||||
// 更新资源提供者
|
||||
// 注意:循环更新的时候,可能会扩展列表
|
||||
// 注意:不能限制场景对象的加载
|
||||
_isUnloadSafe = false;
|
||||
int loadingCount = 0;
|
||||
for (int i = 0; i < _providerList.Count; i++)
|
||||
{
|
||||
var provider = _providerList[i];
|
||||
if (provider.IsSceneProvider())
|
||||
{
|
||||
provider.Update();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (loadingCount < _loadingMaxNumber)
|
||||
provider.Update();
|
||||
|
||||
if (provider.IsDone == false)
|
||||
loadingCount++;
|
||||
}
|
||||
if (IsBusy)
|
||||
break;
|
||||
_providerList[i].Update();
|
||||
}
|
||||
_isUnloadSafe = true;
|
||||
}
|
||||
@@ -117,36 +123,21 @@ namespace YooAsset
|
||||
}
|
||||
private void UnloadUnusedAssetsInternal()
|
||||
{
|
||||
if (_simulationOnEditor)
|
||||
for (int i = _loaderList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
for (int i = _providerList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var provider = _providerList[i];
|
||||
if (provider.CanDestroy())
|
||||
{
|
||||
provider.Destroy();
|
||||
_providerList.RemoveAt(i);
|
||||
_providerDic.Remove(provider.ProviderGUID);
|
||||
}
|
||||
}
|
||||
BundleLoaderBase loader = _loaderList[i];
|
||||
loader.TryDestroyAllProviders();
|
||||
}
|
||||
else
|
||||
|
||||
for (int i = _loaderList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
for (int i = _loaderList.Count - 1; i >= 0; i--)
|
||||
BundleLoaderBase loader = _loaderList[i];
|
||||
if (loader.CanDestroy())
|
||||
{
|
||||
BundleLoaderBase loader = _loaderList[i];
|
||||
loader.TryDestroyAllProviders();
|
||||
}
|
||||
for (int i = _loaderList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
BundleLoaderBase loader = _loaderList[i];
|
||||
if (loader.CanDestroy())
|
||||
{
|
||||
string bundleName = loader.MainBundleInfo.Bundle.BundleName;
|
||||
loader.Destroy(false);
|
||||
_loaderList.RemoveAt(i);
|
||||
_loaderDic.Remove(bundleName);
|
||||
}
|
||||
string bundleName = loader.MainBundleInfo.Bundle.BundleName;
|
||||
loader.Destroy(false);
|
||||
_loaderList.RemoveAt(i);
|
||||
_loaderDic.Remove(bundleName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -306,9 +297,6 @@ namespace YooAsset
|
||||
// 释放子场景句柄
|
||||
_sceneHandles[providerGUID].ReleaseInternal();
|
||||
_sceneHandles.Remove(providerGUID);
|
||||
|
||||
// 卸载未被使用的资源(包括场景)
|
||||
UnloadUnusedAssets();
|
||||
}
|
||||
internal void UnloadAllScene()
|
||||
{
|
||||
@@ -318,9 +306,6 @@ namespace YooAsset
|
||||
valuePair.Value.ReleaseInternal();
|
||||
}
|
||||
_sceneHandles.Clear();
|
||||
|
||||
// 卸载未被使用的资源(包括场景)
|
||||
UnloadUnusedAssets();
|
||||
}
|
||||
internal void ClearSceneHandle()
|
||||
{
|
||||
@@ -385,17 +370,24 @@ namespace YooAsset
|
||||
return loader;
|
||||
|
||||
// 新增下载需求
|
||||
if (_simulationOnEditor)
|
||||
{
|
||||
loader = new VirtualBundleFileLoader(this, bundleInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
#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);
|
||||
if (bundleInfo.Bundle.IsRawFile)
|
||||
loader = new RawBundleFileLoader(this, bundleInfo);
|
||||
else
|
||||
loader = new AssetBundleFileLoader(this, bundleInfo);
|
||||
#endif
|
||||
}
|
||||
|
||||
_loaderList.Add(loader);
|
||||
_loaderDic.Add(bundleName, loader);
|
||||
@@ -430,13 +422,8 @@ namespace YooAsset
|
||||
providerInfo.RefCount = provider.RefCount;
|
||||
providerInfo.Status = provider.Status.ToString();
|
||||
providerInfo.DependBundleInfos = new List<DebugBundleInfo>();
|
||||
provider.GetBundleDebugInfos(providerInfo.DependBundleInfos);
|
||||
result.Add(providerInfo);
|
||||
|
||||
if (provider is BundledProvider)
|
||||
{
|
||||
BundledProvider temp = provider as BundledProvider;
|
||||
temp.GetBundleDebugInfos(providerInfo.DependBundleInfos);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -92,58 +92,63 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 同步初始化游戏对象
|
||||
/// </summary>
|
||||
/// <param name="parent">父类对象</param>
|
||||
/// <returns></returns>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步初始化游戏对象
|
||||
/// </summary>
|
||||
/// <param name="position">坐标</param>
|
||||
/// <param name="rotation">角度</param>
|
||||
/// <param name="parent">父类对象</param>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步初始化游戏对象
|
||||
/// </summary>
|
||||
/// <param name="parent">父类对象</param>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步初始化游戏对象
|
||||
/// </summary>
|
||||
/// <param name="position">坐标</param>
|
||||
/// <param name="rotation">角度</param>
|
||||
/// <param name="parent">父类对象</param>
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -70,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;
|
||||
}
|
||||
|
||||
@@ -63,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;
|
||||
}
|
||||
@@ -92,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;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace YooAsset
|
||||
// 1. 下载远端文件
|
||||
if (_steps == ESteps.Download)
|
||||
{
|
||||
int failedTryAgain = int.MaxValue;
|
||||
int failedTryAgain = Impl.DownloadFailedTryAgain;
|
||||
_downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
|
||||
_steps = ESteps.CheckDownload;
|
||||
}
|
||||
@@ -90,7 +90,7 @@ namespace YooAsset
|
||||
if (_steps == ESteps.Website)
|
||||
{
|
||||
int failedTryAgain = 1;
|
||||
var bundleInfo = PatchManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
|
||||
var bundleInfo = ManifestTools.GetUnpackInfo(MainBundleInfo.Bundle);
|
||||
_website = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
|
||||
_steps = ESteps.CheckWebsite;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 轮询更新
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 主线程等待异步操作完毕
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7b9023a940b496549894d9d8872219fb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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;
|
||||
|
||||
/// <summary>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal sealed class BundledAssetProvider : BundledProvider
|
||||
internal sealed class BundledAssetProvider : ProviderBase
|
||||
{
|
||||
private AssetBundleRequest _cacheRequest;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载报告
|
||||
/// </summary>
|
||||
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 = (float)result.DownloadedBytes / result.TotalSize;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取资源包的调试信息列表
|
||||
/// </summary>
|
||||
internal void GetBundleDebugInfos(List<DebugBundleInfo> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal class BundledRawFileProvider : BundledProvider
|
||||
internal class BundledRawFileProvider : ProviderBase
|
||||
{
|
||||
public BundledRawFileProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo) : base(impl, providerGUID, assetInfo)
|
||||
{
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -4,7 +4,7 @@ using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal sealed class BundledSubAssetsProvider : BundledProvider
|
||||
internal sealed class BundledSubAssetsProvider : ProviderBase
|
||||
{
|
||||
private AssetBundleRequest _cacheRequest;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<OperationHandleBase> _handles = new List<OperationHandleBase>();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -112,14 +126,18 @@ namespace YooAsset
|
||||
public virtual void Destroy()
|
||||
{
|
||||
IsDestroyed = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载进度
|
||||
/// </summary>
|
||||
public virtual DownloadReport GetDownloadReport()
|
||||
{
|
||||
return DownloadReport.CreateDefaultReport();
|
||||
// 释放资源包加载器
|
||||
if (OwnerBundle != null)
|
||||
{
|
||||
OwnerBundle.Release();
|
||||
OwnerBundle = null;
|
||||
}
|
||||
if (DependBundleGroup != null)
|
||||
{
|
||||
DependBundleGroup.Release();
|
||||
DependBundleGroup = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -227,6 +245,7 @@ namespace YooAsset
|
||||
Progress = 1f;
|
||||
|
||||
// 注意:创建临时列表是为了防止外部逻辑在回调函数内创建或者释放资源句柄。
|
||||
// 注意:回调方法如果发生异常,会阻断列表里的后续回调方法!
|
||||
List<OperationHandleBase> tempers = new List<OperationHandleBase>(_handles);
|
||||
foreach (var hande in tempers)
|
||||
{
|
||||
@@ -292,6 +311,37 @@ namespace YooAsset
|
||||
_watch = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载报告
|
||||
/// </summary>
|
||||
internal 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 = (float)result.DownloadedBytes / result.TotalSize;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取资源包的调试信息列表
|
||||
/// </summary>
|
||||
internal void GetBundleDebugInfos(List<DebugBundleInfo> 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);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -133,7 +133,7 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 获取未被使用的缓存文件
|
||||
/// </summary>
|
||||
public static List<string> GetUnusedCacheGUIDs(AssetsPackage package)
|
||||
public static List<string> GetUnusedCacheGUIDs(ResourcePackage package)
|
||||
{
|
||||
var cache = GetOrCreateCache(package.PackageName);
|
||||
var keys = cache.GetAllKeys();
|
||||
|
||||
@@ -17,12 +17,12 @@ namespace YooAsset
|
||||
Done,
|
||||
}
|
||||
|
||||
private readonly AssetsPackage _package;
|
||||
private readonly ResourcePackage _package;
|
||||
private List<string> _unusedCacheGUIDs;
|
||||
private int _unusedFileTotalCount = 0;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
internal ClearUnusedCacheFilesOperation(AssetsPackage package)
|
||||
internal ClearUnusedCacheFilesOperation(ResourcePackage package)
|
||||
{
|
||||
_package = package;
|
||||
}
|
||||
|
||||
@@ -39,10 +39,16 @@ namespace YooAsset
|
||||
public IDecryptionServices DecryptionServices = null;
|
||||
|
||||
/// <summary>
|
||||
/// 资源加载的最大数量
|
||||
/// 资源加载每帧处理的最大时间片段
|
||||
/// 注意:默认值为MaxValue
|
||||
/// </summary>
|
||||
public int AssetLoadingMaxNumber = int.MaxValue;
|
||||
public long LoadingMaxTimeSlice = long.MaxValue;
|
||||
|
||||
/// <summary>
|
||||
/// 下载失败尝试次数
|
||||
/// 注意:默认值为MaxValue
|
||||
/// </summary>
|
||||
public int DownloadFailedTryAgain = int.MaxValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -53,7 +59,7 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 用于模拟运行的资源清单路径
|
||||
/// </summary>
|
||||
public string SimulatePatchManifestPath = string.Empty;
|
||||
public string SimulateManifestFilePath = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace YooAsset
|
||||
foreach (var operation in _operations)
|
||||
{
|
||||
if (IsBusy)
|
||||
return;
|
||||
break;
|
||||
|
||||
operation.Update();
|
||||
if (operation.IsDone)
|
||||
|
||||
@@ -3,7 +3,7 @@ namespace YooAsset
|
||||
{
|
||||
public class AssetInfo
|
||||
{
|
||||
private readonly PatchAsset _patchAsset;
|
||||
private readonly PackageAsset _packageAsset;
|
||||
private string _providerGUID;
|
||||
|
||||
/// <summary>
|
||||
@@ -42,7 +42,7 @@ namespace YooAsset
|
||||
{
|
||||
get
|
||||
{
|
||||
return _patchAsset == null;
|
||||
return _packageAsset == null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,9 +53,9 @@ namespace YooAsset
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_patchAsset == null)
|
||||
if (_packageAsset == null)
|
||||
return string.Empty;
|
||||
return _patchAsset.Address;
|
||||
return _packageAsset.Address;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,9 +66,9 @@ namespace YooAsset
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_patchAsset == null)
|
||||
if (_packageAsset == null)
|
||||
return string.Empty;
|
||||
return _patchAsset.AssetPath;
|
||||
return _packageAsset.AssetPath;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,30 +77,30 @@ namespace YooAsset
|
||||
{
|
||||
// 注意:禁止从外部创建该类
|
||||
}
|
||||
internal AssetInfo(PatchAsset patchAsset, System.Type assetType)
|
||||
internal AssetInfo(PackageAsset packageAsset, System.Type assetType)
|
||||
{
|
||||
if (patchAsset == null)
|
||||
if (packageAsset == null)
|
||||
throw new System.Exception("Should never get here !");
|
||||
|
||||
_providerGUID = string.Empty;
|
||||
_patchAsset = patchAsset;
|
||||
_packageAsset = packageAsset;
|
||||
AssetType = assetType;
|
||||
Error = string.Empty;
|
||||
}
|
||||
internal AssetInfo(PatchAsset patchAsset)
|
||||
internal AssetInfo(PackageAsset packageAsset)
|
||||
{
|
||||
if (patchAsset == null)
|
||||
if (packageAsset == null)
|
||||
throw new System.Exception("Should never get here !");
|
||||
|
||||
_providerGUID = string.Empty;
|
||||
_patchAsset = patchAsset;
|
||||
_packageAsset = packageAsset;
|
||||
AssetType = null;
|
||||
Error = string.Empty;
|
||||
}
|
||||
internal AssetInfo(string error)
|
||||
{
|
||||
_providerGUID = string.Empty;
|
||||
_patchAsset = null;
|
||||
_packageAsset = null;
|
||||
AssetType = null;
|
||||
Error = error;
|
||||
}
|
||||
@@ -12,7 +12,7 @@ namespace YooAsset
|
||||
LoadFromEditor,
|
||||
}
|
||||
|
||||
public readonly PatchBundle Bundle;
|
||||
public readonly PackageBundle Bundle;
|
||||
public readonly ELoadMode LoadMode;
|
||||
|
||||
/// <summary>
|
||||
@@ -34,25 +34,25 @@ namespace YooAsset
|
||||
private BundleInfo()
|
||||
{
|
||||
}
|
||||
public BundleInfo(PatchBundle patchBundle, ELoadMode loadMode, string mainURL, string fallbackURL)
|
||||
public BundleInfo(PackageBundle bundle, ELoadMode loadMode, string mainURL, string fallbackURL)
|
||||
{
|
||||
Bundle = patchBundle;
|
||||
Bundle = bundle;
|
||||
LoadMode = loadMode;
|
||||
RemoteMainURL = mainURL;
|
||||
RemoteFallbackURL = fallbackURL;
|
||||
EditorAssetPath = string.Empty;
|
||||
}
|
||||
public BundleInfo(PatchBundle patchBundle, ELoadMode loadMode, string editorAssetPath)
|
||||
public BundleInfo(PackageBundle bundle, ELoadMode loadMode, string editorAssetPath)
|
||||
{
|
||||
Bundle = patchBundle;
|
||||
Bundle = bundle;
|
||||
LoadMode = loadMode;
|
||||
RemoteMainURL = string.Empty;
|
||||
RemoteFallbackURL = string.Empty;
|
||||
EditorAssetPath = editorAssetPath;
|
||||
}
|
||||
public BundleInfo(PatchBundle patchBundle, ELoadMode loadMode)
|
||||
public BundleInfo(PackageBundle bundle, ELoadMode loadMode)
|
||||
{
|
||||
Bundle = patchBundle;
|
||||
Bundle = bundle;
|
||||
LoadMode = loadMode;
|
||||
RemoteMainURL = string.Empty;
|
||||
RemoteFallbackURL = string.Empty;
|
||||
201
Assets/YooAsset/Runtime/PackageSystem/ManifestTools.cs
Normal file
201
Assets/YooAsset/Runtime/PackageSystem/ManifestTools.cs
Normal file
@@ -0,0 +1,201 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace YooAsset
|
||||
{
|
||||
internal static class ManifestTools
|
||||
{
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// 序列化(JSON文件)
|
||||
/// </summary>
|
||||
public static void SerializeToJson(string savePath, PackageManifest manifest)
|
||||
{
|
||||
string json = JsonUtility.ToJson(manifest, true);
|
||||
FileUtility.CreateFile(savePath, json);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 序列化(二进制文件)
|
||||
/// </summary>
|
||||
public static void SerializeToBinary(string savePath, PackageManifest manifest)
|
||||
{
|
||||
using (FileStream fs = new FileStream(savePath, FileMode.Create))
|
||||
{
|
||||
// 创建缓存器
|
||||
BufferWriter buffer = new BufferWriter(YooAssetSettings.ManifestFileMaxSize);
|
||||
|
||||
// 写入文件标记
|
||||
buffer.WriteUInt32(YooAssetSettings.ManifestFileSign);
|
||||
|
||||
// 写入文件版本
|
||||
buffer.WriteUTF8(manifest.FileVersion);
|
||||
|
||||
// 写入文件头信息
|
||||
buffer.WriteBool(manifest.EnableAddressable);
|
||||
buffer.WriteInt32(manifest.OutputNameStyle);
|
||||
buffer.WriteUTF8(manifest.PackageName);
|
||||
buffer.WriteUTF8(manifest.PackageVersion);
|
||||
|
||||
// 写入资源列表
|
||||
buffer.WriteInt32(manifest.AssetList.Count);
|
||||
for (int i = 0; i < manifest.AssetList.Count; i++)
|
||||
{
|
||||
var packageAsset = manifest.AssetList[i];
|
||||
buffer.WriteUTF8(packageAsset.Address);
|
||||
buffer.WriteUTF8(packageAsset.AssetPath);
|
||||
buffer.WriteUTF8Array(packageAsset.AssetTags);
|
||||
buffer.WriteInt32(packageAsset.BundleID);
|
||||
buffer.WriteInt32Array(packageAsset.DependIDs);
|
||||
}
|
||||
|
||||
// 写入资源包列表
|
||||
buffer.WriteInt32(manifest.BundleList.Count);
|
||||
for (int i = 0; i < manifest.BundleList.Count; i++)
|
||||
{
|
||||
var packageBundle = manifest.BundleList[i];
|
||||
buffer.WriteUTF8(packageBundle.BundleName);
|
||||
buffer.WriteUTF8(packageBundle.FileHash);
|
||||
buffer.WriteUTF8(packageBundle.FileCRC);
|
||||
buffer.WriteInt64(packageBundle.FileSize);
|
||||
buffer.WriteBool(packageBundle.IsRawFile);
|
||||
buffer.WriteByte(packageBundle.LoadMethod);
|
||||
buffer.WriteUTF8Array(packageBundle.Tags);
|
||||
buffer.WriteInt32Array(packageBundle.ReferenceIDs);
|
||||
}
|
||||
|
||||
// 写入文件流
|
||||
buffer.WriteToStream(fs);
|
||||
fs.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 反序列化(JSON文件)
|
||||
/// </summary>
|
||||
public static PackageManifest DeserializeFromJson(string jsonContent)
|
||||
{
|
||||
return JsonUtility.FromJson<PackageManifest>(jsonContent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 反序列化(二进制文件)
|
||||
/// </summary>
|
||||
public static PackageManifest DeserializeFromBinary(byte[] binaryData)
|
||||
{
|
||||
// 创建缓存器
|
||||
BufferReader buffer = new BufferReader(binaryData);
|
||||
|
||||
// 读取文件标记
|
||||
uint fileSign = buffer.ReadUInt32();
|
||||
if (fileSign != YooAssetSettings.ManifestFileSign)
|
||||
throw new Exception("Invalid manifest file !");
|
||||
|
||||
// 读取文件版本
|
||||
string fileVersion = buffer.ReadUTF8();
|
||||
if (fileVersion != YooAssetSettings.ManifestFileVersion)
|
||||
throw new Exception($"The manifest file version are not compatible : {fileVersion} != {YooAssetSettings.ManifestFileVersion}");
|
||||
|
||||
PackageManifest manifest = new PackageManifest();
|
||||
{
|
||||
// 读取文件头信息
|
||||
manifest.FileVersion = fileVersion;
|
||||
manifest.EnableAddressable = buffer.ReadBool();
|
||||
manifest.OutputNameStyle = buffer.ReadInt32();
|
||||
manifest.PackageName = buffer.ReadUTF8();
|
||||
manifest.PackageVersion = buffer.ReadUTF8();
|
||||
|
||||
// 读取资源列表
|
||||
int packageAssetCount = buffer.ReadInt32();
|
||||
manifest.AssetList = new List<PackageAsset>(packageAssetCount);
|
||||
for (int i = 0; i < packageAssetCount; i++)
|
||||
{
|
||||
var packageAsset = new PackageAsset();
|
||||
packageAsset.Address = buffer.ReadUTF8();
|
||||
packageAsset.AssetPath = buffer.ReadUTF8();
|
||||
packageAsset.AssetTags = buffer.ReadUTF8Array();
|
||||
packageAsset.BundleID = buffer.ReadInt32();
|
||||
packageAsset.DependIDs = buffer.ReadInt32Array();
|
||||
manifest.AssetList.Add(packageAsset);
|
||||
}
|
||||
|
||||
// 读取资源包列表
|
||||
int packageBundleCount = buffer.ReadInt32();
|
||||
manifest.BundleList = new List<PackageBundle>(packageBundleCount);
|
||||
for (int i = 0; i < packageBundleCount; i++)
|
||||
{
|
||||
var packageBundle = new PackageBundle();
|
||||
packageBundle.BundleName = buffer.ReadUTF8();
|
||||
packageBundle.FileHash = buffer.ReadUTF8();
|
||||
packageBundle.FileCRC = buffer.ReadUTF8();
|
||||
packageBundle.FileSize = buffer.ReadInt64();
|
||||
packageBundle.IsRawFile = buffer.ReadBool();
|
||||
packageBundle.LoadMethod = buffer.ReadByte();
|
||||
packageBundle.Tags = buffer.ReadUTF8Array();
|
||||
packageBundle.ReferenceIDs = buffer.ReadInt32Array();
|
||||
manifest.BundleList.Add(packageBundle);
|
||||
}
|
||||
}
|
||||
|
||||
// BundleDic
|
||||
manifest.BundleDic = new Dictionary<string, PackageBundle>(manifest.BundleList.Count);
|
||||
foreach (var packageBundle in manifest.BundleList)
|
||||
{
|
||||
packageBundle.ParseBundle(manifest.PackageName, manifest.OutputNameStyle);
|
||||
manifest.BundleDic.Add(packageBundle.BundleName, packageBundle);
|
||||
}
|
||||
|
||||
// AssetDic
|
||||
manifest.AssetDic = new Dictionary<string, PackageAsset>(manifest.AssetList.Count);
|
||||
foreach (var packageAsset in manifest.AssetList)
|
||||
{
|
||||
// 注意:我们不允许原始路径存在重名
|
||||
string assetPath = packageAsset.AssetPath;
|
||||
if (manifest.AssetDic.ContainsKey(assetPath))
|
||||
throw new Exception($"AssetPath have existed : {assetPath}");
|
||||
else
|
||||
manifest.AssetDic.Add(assetPath, packageAsset);
|
||||
}
|
||||
|
||||
return manifest;
|
||||
}
|
||||
#endif
|
||||
|
||||
public static string GetRemoteBundleFileExtension(string bundleName)
|
||||
{
|
||||
string fileExtension = Path.GetExtension(bundleName);
|
||||
return fileExtension;
|
||||
}
|
||||
public static string GetRemoteBundleFileName(int nameStyle, string bundleName, string fileExtension, string fileHash)
|
||||
{
|
||||
if (nameStyle == 1) //HashName
|
||||
{
|
||||
return StringUtility.Format("{0}{1}", fileHash, fileExtension);
|
||||
}
|
||||
else if (nameStyle == 4) //BundleName_HashName
|
||||
{
|
||||
string fileName = bundleName.Remove(bundleName.LastIndexOf('.'));
|
||||
return StringUtility.Format("{0}_{1}{2}", fileName, fileHash, fileExtension);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException($"Invalid name style : {nameStyle}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取解压BundleInfo
|
||||
/// </summary>
|
||||
public static BundleInfo GetUnpackInfo(PackageBundle packageBundle)
|
||||
{
|
||||
// 注意:我们把流加载路径指定为远端下载地址
|
||||
string streamingPath = PathHelper.ConvertToWWWPath(packageBundle.StreamingFilePath);
|
||||
BundleInfo bundleInfo = new BundleInfo(packageBundle, BundleInfo.ELoadMode.LoadFromStreaming, streamingPath, streamingPath);
|
||||
return bundleInfo;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,9 +94,9 @@ namespace YooAsset
|
||||
if (downloadList != null)
|
||||
{
|
||||
TotalDownloadCount = downloadList.Count;
|
||||
foreach (var patchBundle in downloadList)
|
||||
foreach (var packageBundle in downloadList)
|
||||
{
|
||||
TotalDownloadBytes += patchBundle.Bundle.FileSize;
|
||||
TotalDownloadBytes += packageBundle.Bundle.FileSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -249,9 +249,9 @@ namespace YooAsset
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PatchDownloaderOperation : DownloaderOperation
|
||||
public sealed class ResourceDownloaderOperation : DownloaderOperation
|
||||
{
|
||||
internal PatchDownloaderOperation(List<BundleInfo> downloadList, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
internal ResourceDownloaderOperation(List<BundleInfo> downloadList, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
: base(downloadList, downloadingMaxNumber, failedTryAgain, timeout)
|
||||
{
|
||||
}
|
||||
@@ -259,16 +259,16 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 创建空的下载器
|
||||
/// </summary>
|
||||
internal static PatchDownloaderOperation CreateEmptyDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
internal static ResourceDownloaderOperation CreateEmptyDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> downloadList = new List<BundleInfo>();
|
||||
var operation = new PatchDownloaderOperation(downloadList, downloadingMaxNumber, failedTryAgain, timeout);
|
||||
var operation = new ResourceDownloaderOperation(downloadList, downloadingMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
}
|
||||
public sealed class PatchUnpackerOperation : DownloaderOperation
|
||||
public sealed class ResourceUnpackerOperation : DownloaderOperation
|
||||
{
|
||||
internal PatchUnpackerOperation(List<BundleInfo> downloadList, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
internal ResourceUnpackerOperation(List<BundleInfo> downloadList, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
: base(downloadList, downloadingMaxNumber, failedTryAgain, timeout)
|
||||
{
|
||||
}
|
||||
@@ -276,10 +276,10 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 创建空的解压器
|
||||
/// </summary>
|
||||
internal static PatchUnpackerOperation CreateEmptyUnpacker(int upackingMaxNumber, int failedTryAgain, int timeout)
|
||||
internal static ResourceUnpackerOperation CreateEmptyUnpacker(int upackingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> downloadList = new List<BundleInfo>();
|
||||
var operation = new PatchUnpackerOperation(downloadList, upackingMaxNumber, failedTryAgain, int.MaxValue);
|
||||
var operation = new ResourceUnpackerOperation(downloadList, upackingMaxNumber, failedTryAgain, int.MaxValue);
|
||||
return operation;
|
||||
}
|
||||
}
|
||||
@@ -26,14 +26,14 @@ namespace YooAsset
|
||||
}
|
||||
|
||||
private readonly EditorSimulateModeImpl _impl;
|
||||
private readonly string _simulateManifestPath;
|
||||
private readonly string _simulateManifestFilePath;
|
||||
private LoadEditorManifestOperation _loadEditorManifestOp;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
internal EditorSimulateModeInitializationOperation(EditorSimulateModeImpl impl, string simulateManifestPath)
|
||||
internal EditorSimulateModeInitializationOperation(EditorSimulateModeImpl impl, string simulateManifestFilePath)
|
||||
{
|
||||
_impl = impl;
|
||||
_simulateManifestPath = simulateManifestPath;
|
||||
_simulateManifestFilePath = simulateManifestFilePath;
|
||||
}
|
||||
internal override void Start()
|
||||
{
|
||||
@@ -45,7 +45,7 @@ namespace YooAsset
|
||||
{
|
||||
if (_loadEditorManifestOp == null)
|
||||
{
|
||||
_loadEditorManifestOp = new LoadEditorManifestOperation(_simulateManifestPath);
|
||||
_loadEditorManifestOp = new LoadEditorManifestOperation(_simulateManifestFilePath);
|
||||
OperationSystem.StartOperation(_loadEditorManifestOp);
|
||||
}
|
||||
|
||||
@@ -18,15 +18,15 @@ namespace YooAsset
|
||||
}
|
||||
|
||||
private readonly BufferReader _buffer;
|
||||
private int _patchAssetCount;
|
||||
private int _patchBundleCount;
|
||||
private int _packageAssetCount;
|
||||
private int _packageBundleCount;
|
||||
private int _progressTotalValue;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
/// <summary>
|
||||
/// 解析的清单实例
|
||||
/// </summary>
|
||||
public PatchManifest Manifest { private set; get; }
|
||||
public PackageManifest Manifest { private set; get; }
|
||||
|
||||
public DeserializeManifestOperation(byte[] binaryData)
|
||||
{
|
||||
@@ -55,7 +55,7 @@ namespace YooAsset
|
||||
|
||||
// 读取文件标记
|
||||
uint fileSign = _buffer.ReadUInt32();
|
||||
if (fileSign != YooAssetSettings.PatchManifestFileSign)
|
||||
if (fileSign != YooAssetSettings.ManifestFileSign)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
@@ -65,16 +65,16 @@ namespace YooAsset
|
||||
|
||||
// 读取文件版本
|
||||
string fileVersion = _buffer.ReadUTF8();
|
||||
if (fileVersion != YooAssetSettings.PatchManifestFileVersion)
|
||||
if (fileVersion != YooAssetSettings.ManifestFileVersion)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = $"The manifest file version are not compatible : {fileVersion} != {YooAssetSettings.PatchManifestFileVersion}";
|
||||
Error = $"The manifest file version are not compatible : {fileVersion} != {YooAssetSettings.ManifestFileVersion}";
|
||||
return;
|
||||
}
|
||||
|
||||
// 读取文件头信息
|
||||
Manifest = new PatchManifest();
|
||||
Manifest = new PackageManifest();
|
||||
Manifest.FileVersion = fileVersion;
|
||||
Manifest.EnableAddressable = _buffer.ReadBool();
|
||||
Manifest.OutputNameStyle = _buffer.ReadInt32();
|
||||
@@ -86,38 +86,38 @@ namespace YooAsset
|
||||
|
||||
if (_steps == ESteps.PrepareAssetList)
|
||||
{
|
||||
_patchAssetCount = _buffer.ReadInt32();
|
||||
Manifest.AssetList = new List<PatchAsset>(_patchAssetCount);
|
||||
Manifest.AssetDic = new Dictionary<string, PatchAsset>(_patchAssetCount);
|
||||
_progressTotalValue = _patchAssetCount;
|
||||
_packageAssetCount = _buffer.ReadInt32();
|
||||
Manifest.AssetList = new List<PackageAsset>(_packageAssetCount);
|
||||
Manifest.AssetDic = new Dictionary<string, PackageAsset>(_packageAssetCount);
|
||||
_progressTotalValue = _packageAssetCount;
|
||||
_steps = ESteps.DeserializeAssetList;
|
||||
}
|
||||
if (_steps == ESteps.DeserializeAssetList)
|
||||
{
|
||||
while (_patchAssetCount > 0)
|
||||
while (_packageAssetCount > 0)
|
||||
{
|
||||
var patchAsset = new PatchAsset();
|
||||
patchAsset.Address = _buffer.ReadUTF8();
|
||||
patchAsset.AssetPath = _buffer.ReadUTF8();
|
||||
patchAsset.AssetTags = _buffer.ReadUTF8Array();
|
||||
patchAsset.BundleID = _buffer.ReadInt32();
|
||||
patchAsset.DependIDs = _buffer.ReadInt32Array();
|
||||
Manifest.AssetList.Add(patchAsset);
|
||||
var packageAsset = new PackageAsset();
|
||||
packageAsset.Address = _buffer.ReadUTF8();
|
||||
packageAsset.AssetPath = _buffer.ReadUTF8();
|
||||
packageAsset.AssetTags = _buffer.ReadUTF8Array();
|
||||
packageAsset.BundleID = _buffer.ReadInt32();
|
||||
packageAsset.DependIDs = _buffer.ReadInt32Array();
|
||||
Manifest.AssetList.Add(packageAsset);
|
||||
|
||||
// 注意:我们不允许原始路径存在重名
|
||||
string assetPath = patchAsset.AssetPath;
|
||||
string assetPath = packageAsset.AssetPath;
|
||||
if (Manifest.AssetDic.ContainsKey(assetPath))
|
||||
throw new System.Exception($"AssetPath have existed : {assetPath}");
|
||||
else
|
||||
Manifest.AssetDic.Add(assetPath, patchAsset);
|
||||
Manifest.AssetDic.Add(assetPath, packageAsset);
|
||||
|
||||
_patchAssetCount--;
|
||||
Progress = 1f - _patchAssetCount / _progressTotalValue;
|
||||
_packageAssetCount--;
|
||||
Progress = 1f - _packageAssetCount / _progressTotalValue;
|
||||
if (OperationSystem.IsBusy)
|
||||
break;
|
||||
}
|
||||
|
||||
if (_patchAssetCount <= 0)
|
||||
if (_packageAssetCount <= 0)
|
||||
{
|
||||
_steps = ESteps.PrepareBundleList;
|
||||
}
|
||||
@@ -125,37 +125,37 @@ namespace YooAsset
|
||||
|
||||
if (_steps == ESteps.PrepareBundleList)
|
||||
{
|
||||
_patchBundleCount = _buffer.ReadInt32();
|
||||
Manifest.BundleList = new List<PatchBundle>(_patchBundleCount);
|
||||
Manifest.BundleDic = new Dictionary<string, PatchBundle>(_patchBundleCount);
|
||||
_progressTotalValue = _patchBundleCount;
|
||||
_packageBundleCount = _buffer.ReadInt32();
|
||||
Manifest.BundleList = new List<PackageBundle>(_packageBundleCount);
|
||||
Manifest.BundleDic = new Dictionary<string, PackageBundle>(_packageBundleCount);
|
||||
_progressTotalValue = _packageBundleCount;
|
||||
_steps = ESteps.DeserializeBundleList;
|
||||
}
|
||||
if (_steps == ESteps.DeserializeBundleList)
|
||||
{
|
||||
while (_patchBundleCount > 0)
|
||||
while (_packageBundleCount > 0)
|
||||
{
|
||||
var patchBundle = new PatchBundle();
|
||||
patchBundle.BundleName = _buffer.ReadUTF8();
|
||||
patchBundle.FileHash = _buffer.ReadUTF8();
|
||||
patchBundle.FileCRC = _buffer.ReadUTF8();
|
||||
patchBundle.FileSize = _buffer.ReadInt64();
|
||||
patchBundle.IsRawFile = _buffer.ReadBool();
|
||||
patchBundle.LoadMethod = _buffer.ReadByte();
|
||||
patchBundle.Tags = _buffer.ReadUTF8Array();
|
||||
patchBundle.ReferenceIDs = _buffer.ReadInt32Array();
|
||||
Manifest.BundleList.Add(patchBundle);
|
||||
var packageBundle = new PackageBundle();
|
||||
packageBundle.BundleName = _buffer.ReadUTF8();
|
||||
packageBundle.FileHash = _buffer.ReadUTF8();
|
||||
packageBundle.FileCRC = _buffer.ReadUTF8();
|
||||
packageBundle.FileSize = _buffer.ReadInt64();
|
||||
packageBundle.IsRawFile = _buffer.ReadBool();
|
||||
packageBundle.LoadMethod = _buffer.ReadByte();
|
||||
packageBundle.Tags = _buffer.ReadUTF8Array();
|
||||
packageBundle.ReferenceIDs = _buffer.ReadInt32Array();
|
||||
Manifest.BundleList.Add(packageBundle);
|
||||
|
||||
patchBundle.ParseBundle(Manifest.PackageName, Manifest.OutputNameStyle);
|
||||
Manifest.BundleDic.Add(patchBundle.BundleName, patchBundle);
|
||||
packageBundle.ParseBundle(Manifest.PackageName, Manifest.OutputNameStyle);
|
||||
Manifest.BundleDic.Add(packageBundle.BundleName, packageBundle);
|
||||
|
||||
_patchBundleCount--;
|
||||
Progress = 1f - _patchBundleCount / _progressTotalValue;
|
||||
_packageBundleCount--;
|
||||
Progress = 1f - _packageBundleCount / _progressTotalValue;
|
||||
if (OperationSystem.IsBusy)
|
||||
break;
|
||||
}
|
||||
|
||||
if (_patchBundleCount <= 0)
|
||||
if (_packageBundleCount <= 0)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Succeed;
|
||||
@@ -20,7 +20,7 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 加载的清单实例
|
||||
/// </summary>
|
||||
public PatchManifest Manifest { private set; get; }
|
||||
public PackageManifest Manifest { private set; get; }
|
||||
|
||||
|
||||
public LoadBuildinManifestOperation(string buildinPackageName, string buildinPackageVersion)
|
||||
@@ -24,7 +24,7 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 加载的清单实例
|
||||
/// </summary>
|
||||
public PatchManifest Manifest { private set; get; }
|
||||
public PackageManifest Manifest { private set; get; }
|
||||
|
||||
|
||||
public LoadCacheManifestOperation(string packageName, string packageVersion)
|
||||
@@ -19,7 +19,7 @@ namespace YooAsset
|
||||
/// <summary>
|
||||
/// 加载的清单实例
|
||||
/// </summary>
|
||||
public PatchManifest Manifest { private set; get; }
|
||||
public PackageManifest Manifest { private set; get; }
|
||||
|
||||
|
||||
public LoadEditorManifestOperation(string manifestFilePath)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user