Support fast build mode.

支持快速构建模式,真实的实现EditorPlayMode的运行时环境。
pull/9/head
hevinci 2022-05-02 23:15:09 +08:00
parent 8d02406211
commit 665a16fe60
39 changed files with 492 additions and 383 deletions

View File

@ -28,8 +28,10 @@ namespace YooAsset.Editor
Parameters = parameters;
PipelineOutputDirectory = AssetBundleBuilderHelper.MakePipelineOutputDirectory(parameters.OutputRoot, parameters.BuildTarget);
if (parameters.DryRunBuild)
PipelineOutputDirectory += "_DryRunBuild";
if (parameters.BuildMode == EBuildMode.DryRunBuild)
PipelineOutputDirectory += $"_{EBuildMode.DryRunBuild}";
else if(parameters.BuildMode == EBuildMode.FastRunBuild)
PipelineOutputDirectory += $"_{EBuildMode.FastRunBuild}";
}
/// <summary>
@ -51,7 +53,12 @@ namespace YooAsset.Editor
BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
opt |= BuildAssetBundleOptions.StrictMode; //Do not allow the build to succeed if any errors are reporting during it.
if (Parameters.DryRunBuild)
if (Parameters.BuildMode == EBuildMode.FastRunBuild)
{
throw new Exception("Should never get here !");
}
if (Parameters.BuildMode == EBuildMode.DryRunBuild)
{
opt |= BuildAssetBundleOptions.DryRunBuild;
return opt;
@ -62,7 +69,7 @@ namespace YooAsset.Editor
else if (Parameters.CompressOption == ECompressOption.LZ4)
opt |= BuildAssetBundleOptions.ChunkBasedCompression;
if (Parameters.ForceRebuild)
if (Parameters.BuildMode == EBuildMode.ForceRebuild)
opt |= BuildAssetBundleOptions.ForceRebuildAssetBundle; //Force rebuild the asset bundles
if (Parameters.AppendHash)
opt |= BuildAssetBundleOptions.AppendHashToAssetBundleName; //Append the hash to the assetBundle name
@ -125,11 +132,16 @@ namespace YooAsset.Editor
new TaskCopyBuildinFiles(), //拷贝内置文件
};
if (buildParameters.BuildMode == EBuildMode.FastRunBuild)
BuildRunner.EnableLog = false;
else
BuildRunner.EnableLog = true;
bool succeed = BuildRunner.Run(pipeline, _buildContext);
if (succeed)
Debug.Log($"构建成功!");
Debug.Log($"{buildParameters.BuildMode}模式构建成功!");
else
Debug.LogWarning($"构建失败!");
Debug.LogWarning($"{buildParameters.BuildMode}模式构建失败!");
return succeed;
}
}

View File

@ -10,6 +10,16 @@ namespace YooAsset.Editor
/// </summary>
public int BuildVersion = 0;
/// <summary>
/// 构建模式
/// </summary>
public EBuildMode BuildMode = EBuildMode.ForceRebuild;
/// <summary>
/// 内置资源标签
/// </summary>
public string BuildTags = string.Empty;
/// <summary>
/// 压缩方式
/// </summary>
@ -24,20 +34,5 @@ namespace YooAsset.Editor
/// 附加后缀格式
/// </summary>
public bool AppendExtension = false;
/// <summary>
/// 强制构建
/// </summary>
public bool ForceRebuild = false;
/// <summary>
/// 演练构建
/// </summary>
public bool DryRunBuild = false;
/// <summary>
/// 内置标签
/// </summary>
public string BuildTags = string.Empty;
}
}

View File

@ -22,15 +22,13 @@ namespace YooAsset.Editor
private List<Type> _encryptionServicesClassTypes;
private List<string> _encryptionServicesClassNames;
private TextField _buildOutputTxt;
private TextField _buildOutputField;
private IntegerField _buildVersionField;
private EnumField _compressionField;
private EnumField _buildModeField;
private TextField _buildTagsField;
private PopupField<string> _encryptionField;
private EnumField _compressionField;
private Toggle _appendExtensionToggle;
private Toggle _forceRebuildToggle;
private Toggle _dryRunBuildToggle;
private TextField _buildTagsTxt;
public void CreateGUI()
{
@ -56,9 +54,9 @@ namespace YooAsset.Editor
// 输出目录
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
string pipelineOutputDirectory = AssetBundleBuilderHelper.MakePipelineOutputDirectory(defaultOutputRoot, _buildTarget);
_buildOutputTxt = root.Q<TextField>("BuildOutput");
_buildOutputTxt.SetValueWithoutNotify(pipelineOutputDirectory);
_buildOutputTxt.SetEnabled(false);
_buildOutputField = root.Q<TextField>("BuildOutput");
_buildOutputField.SetValueWithoutNotify(pipelineOutputDirectory);
_buildOutputField.SetEnabled(false);
// 构建版本
_buildVersionField = root.Q<IntegerField>("BuildVersion");
@ -68,34 +66,33 @@ namespace YooAsset.Editor
AssetBundleBuilderSettingData.Setting.BuildVersion = _buildVersionField.value;
});
// 压缩方式
_compressionField = root.Q<EnumField>("Compression");
_compressionField.Init(AssetBundleBuilderSettingData.Setting.CompressOption);
_compressionField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CompressOption);
_compressionField.style.width = 300;
_compressionField.SetEnabled(AssetBundleBuilderSettingData.Setting.DryRunBuild == false);
_compressionField.RegisterValueChangedCallback(evt =>
// 构建模式
_buildModeField = root.Q<EnumField>("BuildMode");
_buildModeField.Init(AssetBundleBuilderSettingData.Setting.BuildMode);
_buildModeField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildMode);
_buildModeField.style.width = 300;
_buildModeField.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.CompressOption = (ECompressOption)_compressionField.value;
AssetBundleBuilderSettingData.Setting.BuildMode = (EBuildMode)_buildModeField.value;
RefreshWindow();
});
// 内置资源标签
_buildTagsField = root.Q<TextField>("BuildinTags");
_buildTagsField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildTags);
_buildTagsField.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.BuildTags = _buildTagsField.value;
});
// 加密方法
var encryptionContainer = root.Q("EncryptionContainer");
if (_encryptionServicesClassNames.Count > 0)
{
int defaultIndex = 0;
for (int index = 0; index < _encryptionServicesClassNames.Count; index++)
{
if (_encryptionServicesClassNames[index] == AssetBundleBuilderSettingData.Setting.EncyptionClassName)
{
defaultIndex = index;
break;
}
}
int defaultIndex = GetEncryptionDefaultIndex(AssetBundleBuilderSettingData.Setting.EncyptionClassName);
_encryptionField = new PopupField<string>(_encryptionServicesClassNames, defaultIndex);
_encryptionField.label = "Encryption";
_encryptionField.style.width = 300;
_encryptionField.SetEnabled(AssetBundleBuilderSettingData.Setting.DryRunBuild == false);
_encryptionField.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.EncyptionClassName = _encryptionField.value;
@ -107,53 +104,32 @@ namespace YooAsset.Editor
_encryptionField = new PopupField<string>();
_encryptionField.label = "Encryption";
_encryptionField.style.width = 300;
_encryptionField.SetEnabled(AssetBundleBuilderSettingData.Setting.DryRunBuild == false);
encryptionContainer.Add(_encryptionField);
}
// 压缩方式
_compressionField = root.Q<EnumField>("Compression");
_compressionField.Init(AssetBundleBuilderSettingData.Setting.CompressOption);
_compressionField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CompressOption);
_compressionField.style.width = 300;
_compressionField.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.CompressOption = (ECompressOption)_compressionField.value;
});
// 附加后缀格式
_appendExtensionToggle = root.Q<Toggle>("AppendExtension");
_appendExtensionToggle.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.AppendExtension);
_appendExtensionToggle.SetEnabled(AssetBundleBuilderSettingData.Setting.DryRunBuild == false);
_appendExtensionToggle.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.AppendExtension = _appendExtensionToggle.value;
});
// 强制构建
_forceRebuildToggle = root.Q<Toggle>("ForceRebuild");
_forceRebuildToggle.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.ForceRebuild);
_forceRebuildToggle.SetEnabled(AssetBundleBuilderSettingData.Setting.DryRunBuild == false);
_forceRebuildToggle.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.ForceRebuild = _forceRebuildToggle.value;
_buildTagsTxt.SetEnabled(_forceRebuildToggle.value);
});
// 演练构建
_dryRunBuildToggle = root.Q<Toggle>("DryRunBuild");
_dryRunBuildToggle.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.DryRunBuild);
_dryRunBuildToggle.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.DryRunBuild = _dryRunBuildToggle.value;
_compressionField.SetEnabled(_dryRunBuildToggle.value == false);
_encryptionField.SetEnabled(_dryRunBuildToggle.value == false);
_appendExtensionToggle.SetEnabled(_dryRunBuildToggle.value == false);
_forceRebuildToggle.SetEnabled(_dryRunBuildToggle.value == false);
});
// 内置标签
_buildTagsTxt = root.Q<TextField>("BuildinTags");
_buildTagsTxt.SetEnabled(_forceRebuildToggle.value);
_buildTagsTxt.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildTags);
_buildTagsTxt.RegisterValueChangedCallback(evt =>
{
AssetBundleBuilderSettingData.Setting.BuildTags = _buildTagsTxt.value;
});
// 构建按钮
var buildButton = root.Q<Button>("Build");
buildButton.clicked += BuildButton_clicked; ;
RefreshWindow();
}
catch (Exception e)
{
@ -165,21 +141,18 @@ namespace YooAsset.Editor
AssetBundleBuilderSettingData.SaveFile();
}
private void RefreshWindow()
{
bool enableElement = AssetBundleBuilderSettingData.Setting.BuildMode == EBuildMode.ForceRebuild;
_buildTagsField.SetEnabled(enableElement);
_encryptionField.SetEnabled(enableElement);
_compressionField.SetEnabled(enableElement);
_appendExtensionToggle.SetEnabled(enableElement);
}
private void BuildButton_clicked()
{
string title;
string content;
if (_forceRebuildToggle.value)
{
title = "警告";
content = "确定开始强制构建吗,这样会删除所有已有构建的文件";
}
else
{
title = "提示";
content = "确定开始增量构建吗";
}
if (EditorUtility.DisplayDialog(title, content, "Yes", "No"))
var buildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
if (EditorUtility.DisplayDialog("提示", $"通过构建模式【{buildMode}】来构建!", "Yes", "No"))
{
EditorTools.ClearUnityConsole();
EditorApplication.delayCall += ExecuteBuild;
@ -197,35 +170,39 @@ namespace YooAsset.Editor
{
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
BuildParameters buildParameters = new BuildParameters();
buildParameters.VerifyBuildingResult = true;
buildParameters.OutputRoot = defaultOutputRoot;
buildParameters.BuildTarget = _buildTarget;
buildParameters.BuildMode = (EBuildMode)_buildModeField.value;
buildParameters.BuildVersion = _buildVersionField.value;
buildParameters.BuildinTags = _buildTagsField.value;
buildParameters.VerifyBuildingResult = true;
buildParameters.EnableAddressable = AssetBundleGrouperSettingData.Setting.EnableAddressable;
buildParameters.CompressOption = (ECompressOption)_compressionField.value;
buildParameters.AppendFileExtension = _appendExtensionToggle.value;
buildParameters.EncryptionServices = CreateEncryptionServicesInstance();
buildParameters.ForceRebuild = _forceRebuildToggle.value;
buildParameters.DryRunBuild = _dryRunBuildToggle.value;
buildParameters.BuildinTags = _buildTagsTxt.value;
buildParameters.CompressOption = (ECompressOption)_compressionField.value;
AssetBundleBuilder builder = new AssetBundleBuilder();
builder.Run(buildParameters);
}
/// <summary>
/// 获取加密类的类型列表
/// </summary>
// 加密类相关
private int GetEncryptionDefaultIndex(string className)
{
for (int index = 0; index < _encryptionServicesClassNames.Count; index++)
{
if (_encryptionServicesClassNames[index] == className)
{
return index;
}
}
return 0;
}
private List<Type> GetEncryptionServicesClassTypes()
{
TypeCache.TypeCollection collection = TypeCache.GetTypesDerivedFrom<IEncryptionServices>();
List<Type> classTypes = collection.ToList();
return classTypes;
}
/// <summary>
/// 创建加密类的实例
/// </summary>
private IEncryptionServices CreateEncryptionServicesInstance()
{
if (_encryptionField.index < 0)

View File

@ -3,11 +3,10 @@
<ui:VisualElement name="BuildContainer">
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
<uie:IntegerField label="Build Version" value="0" name="BuildVersion" />
<uie:EnumField label="Compression" value="Center" name="Compression" />
<uie:EnumField label="Build Mode" name="BuildMode" />
<ui:VisualElement name="EncryptionContainer" style="height: 24px;" />
<uie:EnumField label="Compression" value="Center" name="Compression" />
<ui:Toggle label="Append Extension" name="AppendExtension" style="height: 15px;" />
<ui:Toggle label="Force Rebuild" name="ForceRebuild" />
<ui:Toggle label="Dry Run Build" name="DryRunBuild" />
<ui:TextField picking-mode="Ignore" label="Buildin Tags" name="BuildinTags" />
<ui:Button text="构建" display-tooltip-when-elided="true" name="Build" style="height: 50px; background-color: rgb(40, 106, 42); margin-top: 10px;" />
</ui:VisualElement>

View File

@ -0,0 +1,45 @@
using System;
using UnityEditor;
namespace YooAsset.Editor
{
public static class AssetBundleRuntimeBuilder
{
private static string _manifestFilePath = string.Empty;
/// <summary>
/// 快速模式构建
/// </summary>
public static void FastBuild()
{
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
BuildParameters buildParameters = new BuildParameters();
buildParameters.OutputRoot = defaultOutputRoot;
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
buildParameters.BuildMode = EBuildMode.FastRunBuild;
buildParameters.BuildVersion = AssetBundleBuilderSettingData.Setting.BuildVersion;
buildParameters.BuildinTags = AssetBundleBuilderSettingData.Setting.BuildTags;
buildParameters.EnableAddressable = AssetBundleGrouperSettingData.Setting.EnableAddressable;
AssetBundleBuilder builder = new AssetBundleBuilder();
bool buildResult = builder.Run(buildParameters);
if (buildResult)
{
string pipelineOutputDirectory = AssetBundleBuilderHelper.MakePipelineOutputDirectory(buildParameters.OutputRoot, buildParameters.BuildTarget);
_manifestFilePath = $"{pipelineOutputDirectory}_{EBuildMode.FastRunBuild}/{YooAssetSettingsData.GetPatchManifestFileName(buildParameters.BuildVersion)}";
}
else
{
_manifestFilePath = null;
}
}
/// <summary>
/// 获取构建的补丁清单文件路径
/// </summary>
public static string GetPatchManifestFilePath()
{
return _manifestFilePath;
}
}
}

View File

@ -127,7 +127,7 @@ namespace YooAsset.Editor
}
}
UnityEngine.Debug.Log($"发现未被依赖的资源并自动移除 : {dependAssetPath}");
BuildRunner.Log($"发现未被依赖的资源并自动移除 : {dependAssetPath}");
return true;
}
}

View File

@ -9,11 +9,6 @@ namespace YooAsset.Editor
/// </summary>
public class BuildParameters
{
/// <summary>
/// 验证构建结果
/// </summary>
public bool VerifyBuildingResult = false;
/// <summary>
/// 输出的根目录
/// </summary>
@ -24,11 +19,28 @@ namespace YooAsset.Editor
/// </summary>
public BuildTarget BuildTarget;
/// <summary>
/// 构建模式
/// </summary>
public EBuildMode BuildMode;
/// <summary>
/// 构建的版本(资源版本号)
/// </summary>
public int BuildVersion;
/// <summary>
/// 内置资源的标记列表
/// 注意:分号为分隔符
/// </summary>
public string BuildinTags;
/// <summary>
/// 验证构建结果
/// </summary>
public bool VerifyBuildingResult = false;
/// <summary>
/// 启用可寻址资源定位
/// </summary>
@ -45,32 +57,16 @@ namespace YooAsset.Editor
/// </summary>
public bool AppendFileExtension = false;
/// <summary>
/// 加密类
/// </summary>
public IEncryptionServices EncryptionServices;
/// <summary>
/// 演练构建模式
/// </summary>
public bool DryRunBuild;
/// <summary>
/// 强制重新构建整个项目如果为FALSE则是增量打包
/// </summary>
public bool ForceRebuild;
/// <summary>
/// 内置资源的标记列表
/// 注意:分号为分隔符
/// </summary>
public string BuildinTags;
public IEncryptionServices EncryptionServices = null;
/// <summary>
/// 压缩选项
/// </summary>
public ECompressOption CompressOption;
public ECompressOption CompressOption = ECompressOption.Uncompressed;
/// <summary>
/// 文件名附加上哈希值

View File

@ -28,11 +28,21 @@ namespace YooAsset.Editor
/// </summary>
public BuildTarget BuildTarget;
/// <summary>
/// 构建模式
/// </summary>
public EBuildMode BuildMode;
/// <summary>
/// 构建版本
/// </summary>
public int BuildVersion;
/// <summary>
/// 内置资源标签
/// </summary>
public string BuildinTags;
/// <summary>
/// 启用可寻址资源定位
/// </summary>
@ -64,9 +74,6 @@ namespace YooAsset.Editor
public string EncryptionServicesClassName;
// 构建参数
public bool DryRunBuild;
public bool ForceRebuild;
public string BuildinTags;
public ECompressOption CompressOption;
public bool AppendHash;
public bool DisableWriteTypeTree;

View File

@ -8,6 +8,8 @@ namespace YooAsset.Editor
{
public class BuildRunner
{
public static bool EnableLog = true;
/// <summary>
/// 执行构建流程
/// </summary>
@ -26,7 +28,7 @@ namespace YooAsset.Editor
try
{
var taskAttribute = task.GetType().GetCustomAttribute<TaskAttribute>();
Debug.Log($"---------------------------------------->{taskAttribute.Desc}");
Log($"---------------------------------------->{taskAttribute.Desc}");
task.Run(context);
}
catch (Exception e)
@ -41,5 +43,16 @@ namespace YooAsset.Editor
// 返回运行结果
return succeed;
}
/// <summary>
/// 普通日志输出
/// </summary>
public static void Log(string info)
{
if (EnableLog)
{
UnityEngine.Debug.Log(info);
}
}
}
}

View File

@ -21,18 +21,23 @@ namespace YooAsset.Editor
var buildParametersContext = context.GetContextObject<AssetBundleBuilder.BuildParametersContext>();
var buildMapContext = context.GetContextObject<BuildMapContext>();
// 快速构建模式下跳过引擎构建
var buildMode = buildParametersContext.Parameters.BuildMode;
if (buildMode == EBuildMode.FastRunBuild)
return;
BuildAssetBundleOptions opt = buildParametersContext.GetPipelineBuildOptions();
AssetBundleManifest unityManifest = BuildPipeline.BuildAssetBundles(buildParametersContext.PipelineOutputDirectory, buildMapContext.GetPipelineBuilds(), opt, buildParametersContext.Parameters.BuildTarget);
if (unityManifest == null)
throw new Exception("构建过程中发生错误!");
Debug.Log("Unity引擎打包成功");
BuildRunner.Log("Unity引擎打包成功");
UnityManifestContext unityManifestContext = new UnityManifestContext();
unityManifestContext.UnityManifest = unityManifest;
context.SetContextObject(unityManifestContext);
// 拷贝原生文件
if (buildParametersContext.Parameters.DryRunBuild == false)
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
{
CopyRawBundle(buildMapContext, buildParametersContext);
}

View File

@ -13,7 +13,7 @@ namespace YooAsset.Editor
{
// 注意:我们只有在强制重建的时候才会拷贝
var buildParameters = context.GetContextObject<AssetBundleBuilder.BuildParametersContext>();
if (buildParameters.Parameters.DryRunBuild == false && buildParameters.Parameters.ForceRebuild)
if (buildParameters.Parameters.BuildMode == EBuildMode.ForceRebuild)
{
// 清空流目录
AssetBundleBuilderHelper.ClearStreamingAssetsFolder();
@ -62,7 +62,7 @@ namespace YooAsset.Editor
// 刷新目录
AssetDatabase.Refresh();
Debug.Log($"内置文件拷贝完成:{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}");
BuildRunner.Log($"内置文件拷贝完成:{AssetBundleBuilderHelper.GetStreamingAssetsFolderPath()}");
}
}
}

View File

@ -34,19 +34,19 @@ namespace YooAsset.Editor
// 创建补丁清单文件
string manifestFilePath = $"{buildParameters.PipelineOutputDirectory}/{YooAssetSettingsData.GetPatchManifestFileName(resourceVersion)}";
UnityEngine.Debug.Log($"创建补丁清单文件:{manifestFilePath}");
BuildRunner.Log($"创建补丁清单文件:{manifestFilePath}");
PatchManifest.Serialize(manifestFilePath, patchManifest);
// 创建补丁清单哈希文件
string manifestHashFilePath = $"{buildParameters.PipelineOutputDirectory}/{YooAssetSettingsData.GetPatchManifestHashFileName(resourceVersion)}";
string manifestHash = HashUtility.FileMD5(manifestFilePath);
UnityEngine.Debug.Log($"创建补丁清单哈希文件:{manifestHashFilePath}");
BuildRunner.Log($"创建补丁清单哈希文件:{manifestHashFilePath}");
FileUtility.CreateFile(manifestHashFilePath, manifestHash);
// 创建静态版本文件
string staticVersionFilePath = $"{buildParameters.PipelineOutputDirectory}/{YooAssetSettings.VersionFileName}";
string staticVersion = resourceVersion.ToString();
UnityEngine.Debug.Log($"创建静态版本文件:{staticVersionFilePath}");
BuildRunner.Log($"创建静态版本文件:{staticVersionFilePath}");
FileUtility.CreateFile(staticVersionFilePath, staticVersion);
}
@ -61,14 +61,15 @@ namespace YooAsset.Editor
// 内置标记列表
List<string> buildinTags = buildParameters.Parameters.GetBuildinTags();
bool dryRunBuild = buildParameters.Parameters.DryRunBuild;
var buildMode = buildParameters.Parameters.BuildMode;
bool standardBuild = buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild;
foreach (var bundleInfo in buildMapContext.BundleInfos)
{
var bundleName = bundleInfo.BundleName;
string filePath = $"{buildParameters.PipelineOutputDirectory}/{bundleName}";
string hash = GetFileHash(filePath, dryRunBuild);
string crc32 = GetFileCRC(filePath, dryRunBuild);
long size = GetFileSize(filePath, dryRunBuild);
string hash = GetFileHash(filePath, standardBuild);
string crc32 = GetFileCRC(filePath, standardBuild);
long size = GetFileSize(filePath, standardBuild);
string[] tags = buildMapContext.GetAssetTags(bundleName);
bool isEncrypted = encryptionContext.IsEncryptFile(bundleName);
bool isBuildin = IsBuildinBundle(tags, buildinTags);
@ -100,26 +101,26 @@ namespace YooAsset.Editor
}
return false;
}
private string GetFileHash(string filePath, bool dryRunBuild)
private string GetFileHash(string filePath, bool standardBuild)
{
if (dryRunBuild)
return "00000000000000000000000000000000"; //32位
else
if (standardBuild)
return HashUtility.FileMD5(filePath);
}
private string GetFileCRC(string filePath, bool dryRunBuild)
{
if (dryRunBuild)
return "00000000"; //8位
else
return "00000000000000000000000000000000"; //32位
}
private string GetFileCRC(string filePath, bool standardBuild)
{
if (standardBuild)
return HashUtility.FileCRC32(filePath);
}
private long GetFileSize(string filePath, bool dryRunBuild)
{
if (dryRunBuild)
return 0;
else
return "00000000"; //8位
}
private long GetFileSize(string filePath, bool standardBuild)
{
if (standardBuild)
return FileUtility.GetFileSize(filePath);
else
return 0;
}
/// <summary>

View File

@ -9,7 +9,8 @@ namespace YooAsset.Editor
void IBuildTask.Run(BuildContext context)
{
var buildParameters = context.GetContextObject<AssetBundleBuilder.BuildParametersContext>();
if (buildParameters.Parameters.DryRunBuild == false)
var buildMode = buildParameters.Parameters.BuildMode;
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
{
CopyPatchFiles(buildParameters);
}
@ -22,7 +23,7 @@ namespace YooAsset.Editor
{
int resourceVersion = buildParameters.Parameters.BuildVersion;
string packageDirectory = buildParameters.GetPackageDirectory();
UnityEngine.Debug.Log($"开始拷贝补丁文件到补丁包目录:{packageDirectory}");
BuildRunner.Log($"开始拷贝补丁文件到补丁包目录:{packageDirectory}");
// 拷贝Report文件
{

View File

@ -26,7 +26,9 @@ namespace YooAsset.Editor
buildReport.Summary.BuildTime = DateTime.Now.ToString();
buildReport.Summary.BuildSeconds = buildParameters.GetBuildingSeconds();
buildReport.Summary.BuildTarget = buildParameters.Parameters.BuildTarget;
buildReport.Summary.BuildMode = buildParameters.Parameters.BuildMode;
buildReport.Summary.BuildVersion = buildParameters.Parameters.BuildVersion;
buildReport.Summary.BuildinTags = buildParameters.Parameters.BuildinTags;
buildReport.Summary.EnableAddressable = buildParameters.Parameters.EnableAddressable;
buildReport.Summary.EnableAutoCollect = buildParameters.Parameters.EnableAutoCollect;
buildReport.Summary.AppendFileExtension = buildParameters.Parameters.AppendFileExtension;
@ -36,9 +38,6 @@ namespace YooAsset.Editor
"null" : buildParameters.Parameters.EncryptionServices.GetType().FullName;
// 构建参数
buildReport.Summary.DryRunBuild = buildParameters.Parameters.DryRunBuild;
buildReport.Summary.ForceRebuild = buildParameters.Parameters.ForceRebuild;
buildReport.Summary.BuildinTags = buildParameters.Parameters.BuildinTags;
buildReport.Summary.CompressOption = buildParameters.Parameters.CompressOption;
buildReport.Summary.AppendHash = buildParameters.Parameters.AppendHash;
buildReport.Summary.DisableWriteTypeTree = buildParameters.Parameters.DisableWriteTypeTree;
@ -91,7 +90,7 @@ namespace YooAsset.Editor
// 序列化文件
BuildReport.Serialize(filePath, buildReport);
UnityEngine.Debug.Log($"资源构建报告文件创建完成:{filePath}");
BuildRunner.Log($"资源构建报告文件创建完成:{filePath}");
}
/// <summary>

View File

@ -27,16 +27,17 @@ namespace YooAsset.Editor
var buildParameters = context.GetContextObject<AssetBundleBuilder.BuildParametersContext>();
var buildMapContext = context.GetContextObject<BuildMapContext>();
if (buildParameters.Parameters.DryRunBuild)
var buildMode = buildParameters.Parameters.BuildMode;
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
{
EncryptionContext encryptionContext = new EncryptionContext();
encryptionContext.EncryptList = new List<string>();
encryptionContext.EncryptList = EncryptFiles(buildParameters, buildMapContext);
context.SetContextObject(encryptionContext);
}
else
{
EncryptionContext encryptionContext = new EncryptionContext();
encryptionContext.EncryptList = EncryptFiles(buildParameters, buildMapContext);
encryptionContext.EncryptList = new List<string>();
context.SetContextObject(encryptionContext);
}
}
@ -75,7 +76,7 @@ namespace YooAsset.Editor
{
byte[] bytes = encryptionServices.Encrypt(fileData);
File.WriteAllBytes(filePath, bytes);
UnityEngine.Debug.Log($"文件加密完成:{filePath}");
BuildRunner.Log($"文件加密完成:{filePath}");
}
}

View File

@ -14,7 +14,7 @@ namespace YooAsset.Editor
{
var buildMapContext = BuildMapCreater.CreateBuildMap();
context.SetContextObject(buildMapContext);
UnityEngine.Debug.Log("构建内容准备完毕!");
BuildRunner.Log("构建内容准备完毕!");
// 检测构建结果
CheckBuildMapContent(buildMapContext);

View File

@ -27,7 +27,8 @@ namespace YooAsset.Editor
throw new Exception("输出目录不能为空");
// 增量更新时候的必要检测
if (buildParameters.Parameters.DryRunBuild == false && buildParameters.Parameters.ForceRebuild == false)
var buildMode = buildParameters.Parameters.BuildMode;
if (buildMode == EBuildMode.IncrementalBuild)
{
// 检测历史版本是否存在
if (AssetBundleBuilderHelper.HasAnyPackageVersion(buildParameters.Parameters.BuildTarget, buildParameters.Parameters.OutputRoot) == false)
@ -50,20 +51,20 @@ namespace YooAsset.Editor
}
// 如果是强制重建
if (buildParameters.Parameters.DryRunBuild == false && buildParameters.Parameters.ForceRebuild)
if (buildMode == EBuildMode.ForceRebuild)
{
// 删除平台总目录
string platformDirectory = $"{buildParameters.Parameters.OutputRoot}/{buildParameters.Parameters.BuildTarget}";
if (EditorTools.DeleteDirectory(platformDirectory))
{
UnityEngine.Debug.Log($"删除平台总目录:{platformDirectory}");
BuildRunner.Log($"删除平台总目录:{platformDirectory}");
}
}
// 如果输出目录不存在
if (EditorTools.CreateDirectory(buildParameters.PipelineOutputDirectory))
{
UnityEngine.Debug.Log($"创建输出目录:{buildParameters.PipelineOutputDirectory}");
BuildRunner.Log($"创建输出目录:{buildParameters.PipelineOutputDirectory}");
}
}
}

View File

@ -14,11 +14,15 @@ namespace YooAsset.Editor
void IBuildTask.Run(BuildContext context)
{
var buildParametersContext = context.GetContextObject<AssetBundleBuilder.BuildParametersContext>();
var unityManifestContext = context.GetContextObject<TaskBuilding.UnityManifestContext>();
// 快速构建模式下跳过验证
if (buildParametersContext.Parameters.BuildMode == EBuildMode.FastRunBuild)
return;
// 验证构建结果
if (buildParametersContext.Parameters.VerifyBuildingResult)
{
var unityManifestContext = context.GetContextObject<TaskBuilding.UnityManifestContext>();
VerifyingBuildingResult(context, unityManifestContext.UnityManifest);
}
}
@ -80,7 +84,8 @@ namespace YooAsset.Editor
}
// 5. 验证Asset
if(buildParameters.Parameters.DryRunBuild == false)
var buildMode = buildParameters.Parameters.BuildMode;
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
{
int progressValue = 0;
foreach (var buildedBundle in buildedBundles)
@ -133,7 +138,7 @@ namespace YooAsset.Editor
}
// 卸载所有加载的Bundle
Debug.Log("构建结果验证成功!");
BuildRunner.Log("构建结果验证成功!");
}
/// <summary>

View File

@ -0,0 +1,29 @@

namespace YooAsset.Editor
{
/// <summary>
/// 资源包流水线的构建模式
/// </summary>
public enum EBuildMode
{
/// <summary>
/// 强制重建模式
/// </summary>
ForceRebuild,
/// <summary>
/// 增量构建模式
/// </summary>
IncrementalBuild,
/// <summary>
/// 快速构建模式
/// </summary>
FastRunBuild,
/// <summary>
/// 演练构建模式
/// </summary>
DryRunBuild,
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b39dcdab07554ca4ab4ace5ca97aee78
guid: 0b6f2523a865e454d8fa3f48a2852d5a
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -96,6 +96,9 @@ namespace YooAsset.Editor
if (isRawAsset && CollectorType != ECollectorType.MainAssetCollector)
throw new Exception($"The raw file must be set to {nameof(ECollectorType)}.{ECollectorType.MainAssetCollector} : {CollectPath}");
if (string.IsNullOrEmpty(CollectPath))
throw new Exception($"The collect path is null or empty in grouper : {grouper.GrouperName}");
// 收集打包资源
if (AssetDatabase.IsValidFolder(CollectPath))
{

View File

@ -1,99 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using UnityEditor;
namespace YooAsset.Editor
{
/// <summary>
/// 编辑器下运行时支持
/// </summary>
public static class AssetBundleGrouperRuntimeSupport
{
private static readonly Dictionary<string, CollectAssetInfo> _locationDic = new Dictionary<string, CollectAssetInfo>(1000);
public static void InitEditorPlayMode(bool enableAddressable)
{
_locationDic.Clear();
if (enableAddressable)
{
var collectAssetList = AssetBundleGrouperSettingData.Setting.GetAllCollectAssets();
foreach (var collectAsset in collectAssetList)
{
if(collectAsset.CollectorType == ECollectorType.MainAssetCollector)
{
string address = collectAsset.Address;
if (_locationDic.ContainsKey(address))
throw new Exception($"The address is existed : {address} in grouper setting.");
else
_locationDic.Add(address, collectAsset);
}
}
}
else
{
var collectAssetList = AssetBundleGrouperSettingData.Setting.GetAllCollectAssets();
foreach (var collectAsset in collectAssetList)
{
if (collectAsset.CollectorType == ECollectorType.MainAssetCollector)
{
// 添加原始路径
// 注意:我们不允许原始路径存在重名
string assetPath = collectAsset.AssetPath;
if (_locationDic.ContainsKey(assetPath))
throw new Exception($"Asset path have existed : {assetPath}");
else
_locationDic.Add(assetPath, collectAsset);
// 添加去掉后缀名的路径
if (Path.HasExtension(assetPath))
{
string assetPathWithoutExtension = StringUtility.RemoveExtension(assetPath);
if (_locationDic.ContainsKey(assetPathWithoutExtension))
UnityEngine.Debug.LogWarning($"Asset path have existed : {assetPathWithoutExtension}");
else
_locationDic.Add(assetPathWithoutExtension, collectAsset);
}
}
}
}
}
public static string ConvertLocationToAssetPath(string location)
{
// 检测地址合法性
CheckLocation(location);
if (_locationDic.ContainsKey(location))
{
return _locationDic[location].AssetPath;
}
else
{
UnityEngine.Debug.LogWarning($"Not found asset in grouper setting : {location}");
return string.Empty;
}
}
private static void CheckLocation(string location)
{
if (string.IsNullOrEmpty(location))
{
UnityEngine.Debug.LogError("location param is null or empty!");
}
else
{
// 检查路径末尾是否有空格
int index = location.LastIndexOf(" ");
if (index != -1)
{
if (location.Length == index + 1)
UnityEngine.Debug.LogWarning($"Found blank character in location : \"{location}\"");
}
if (location.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
UnityEngine.Debug.LogWarning($"Found illegal character in location : \"{location}\"");
}
}
}
}

View File

@ -310,7 +310,7 @@ namespace YooAsset.Editor
{
var objectField = new ObjectField();
objectField.name = "ObjectField1";
objectField.label = "Collecter";
objectField.label = "Collector";
objectField.objectType = typeof(UnityEngine.Object);
objectField.style.unityTextAlign = TextAnchor.MiddleLeft;
objectField.style.flexGrow = 1f;

View File

@ -66,7 +66,10 @@ namespace YooAsset.Editor
_items.Add(new ItemWrapper("构建时间", buildReport.Summary.BuildTime));
_items.Add(new ItemWrapper("构建耗时", $"{buildReport.Summary.BuildSeconds}秒"));
_items.Add(new ItemWrapper("构建平台", $"{buildReport.Summary.BuildTarget}"));
_items.Add(new ItemWrapper("构建模式", $"{buildReport.Summary.BuildMode}"));
_items.Add(new ItemWrapper("构建版本", $"{buildReport.Summary.BuildVersion}"));
_items.Add(new ItemWrapper("内置资源标签", $"{buildReport.Summary.BuildinTags}"));
_items.Add(new ItemWrapper("启用可寻址资源定位", $"{buildReport.Summary.EnableAddressable}"));
_items.Add(new ItemWrapper("启用自动分包机制", $"{buildReport.Summary.EnableAutoCollect}"));
_items.Add(new ItemWrapper("追加文件扩展名", $"{buildReport.Summary.AppendFileExtension}"));
@ -76,9 +79,6 @@ namespace YooAsset.Editor
_items.Add(new ItemWrapper(string.Empty, string.Empty));
_items.Add(new ItemWrapper("构建参数", string.Empty));
_items.Add(new ItemWrapper("DryRunBuild", $"{buildReport.Summary.DryRunBuild}"));
_items.Add(new ItemWrapper("ForceRebuild", $"{buildReport.Summary.ForceRebuild}"));
_items.Add(new ItemWrapper("BuildinTags", $"{buildReport.Summary.BuildinTags}"));
_items.Add(new ItemWrapper("CompressOption", $"{buildReport.Summary.CompressOption}"));
_items.Add(new ItemWrapper("AppendHash", $"{buildReport.Summary.AppendHash}"));
_items.Add(new ItemWrapper("DisableWriteTypeTree", $"{buildReport.Summary.DisableWriteTypeTree}"));

View File

@ -79,7 +79,7 @@ namespace YooAsset
// 1. 准备工作
if (_steps == ESteps.Prepare)
{
if (_bundleInfo.LoadMode == BundleInfo.ELoadMode.None)
if (_bundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromEditor)
{
_steps = ESteps.CheckAndCopyFile;
return; // 模拟实现异步操作
@ -130,7 +130,7 @@ namespace YooAsset
{
if (_bundleInfo == null)
return string.Empty;
return _bundleInfo.BundleName;
return _bundleInfo.EditorAssetPath;
}
}

View File

@ -9,6 +9,7 @@ namespace YooAsset
LoadFromStreaming,
LoadFromCache,
LoadFromRemote,
LoadFromEditor,
}
private readonly PatchBundle _patchBundle;
@ -32,6 +33,11 @@ namespace YooAsset
/// </summary>
internal string RemoteFallbackURL { private set; get; }
/// <summary>
/// 编辑器资源路径
/// </summary>
public string EditorAssetPath { private set; get; }
/// <summary>
/// 文件哈希值
/// </summary>
@ -113,6 +119,16 @@ namespace YooAsset
BundleName = patchBundle.BundleName;
RemoteMainURL = mainURL;
RemoteFallbackURL = fallbackURL;
EditorAssetPath = string.Empty;
}
internal BundleInfo(PatchBundle patchBundle, ELoadMode loadMode, string editorAssetPath)
{
_patchBundle = patchBundle;
LoadMode = loadMode;
BundleName = patchBundle.BundleName;
RemoteMainURL = string.Empty;
RemoteFallbackURL = string.Empty;
EditorAssetPath = editorAssetPath;
}
internal BundleInfo(PatchBundle patchBundle, ELoadMode loadMode)
{
@ -121,6 +137,7 @@ namespace YooAsset
BundleName = patchBundle.BundleName;
RemoteMainURL = string.Empty;
RemoteFallbackURL = string.Empty;
EditorAssetPath = string.Empty;
}
internal BundleInfo(string bundleName)
{
@ -129,6 +146,7 @@ namespace YooAsset
BundleName = bundleName;
RemoteMainURL = string.Empty;
RemoteFallbackURL = string.Empty;
EditorAssetPath = string.Empty;
}
/// <summary>

View File

@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace YooAsset
@ -16,12 +17,50 @@ namespace YooAsset
/// </summary>
internal sealed class EditorPlayModeInitializationOperation : InitializationOperation
{
private enum ESteps
{
None,
Builder,
Done,
}
private readonly EditorPlayModeImpl _impl;
private ESteps _steps = ESteps.None;
internal EditorPlayModeInitializationOperation(EditorPlayModeImpl impl)
{
_impl = impl;
}
internal override void Start()
{
Status = EOperationStatus.Succeed;
_steps = ESteps.Builder;
}
internal override void Update()
{
if (_steps == ESteps.Builder)
{
string manifestFilePath = EditorPlayModeHelper.DryRunBuild();
if (string.IsNullOrEmpty(manifestFilePath))
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = "Dry run build failed, see the detail info on the console window.";
return;
}
if (File.Exists(manifestFilePath) == false)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = $"Manifest file not found : {manifestFilePath}";
return;
}
YooLogger.Log($"Load manifest file in editor play mode : {manifestFilePath}");
string jsonContent = FileUtility.ReadFile(manifestFilePath);
_impl.AppPatchManifest = PatchManifest.Deserialize(jsonContent);
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
}
}
}
@ -152,6 +191,7 @@ namespace YooAsset
}
}
/// <summary>
/// 内置补丁清单加载器
/// </summary>

View File

@ -51,10 +51,10 @@ namespace YooAsset
public readonly Dictionary<string, PatchAsset> Assets = new Dictionary<string, PatchAsset>();
/// <summary>
/// 可寻址地址映射集合
/// 资源路径映射集合
/// </summary>
[NonSerialized]
public readonly Dictionary<string, string> AddressDic = new Dictionary<string, string>();
public readonly Dictionary<string, string> AssetPathMapping = new Dictionary<string, string>();
/// <summary>
@ -120,17 +120,39 @@ namespace YooAsset
}
/// <summary>
/// 可寻址地址转换为资源路径
/// 尝试获取资源包的主资源路径
/// </summary>
public string ConvertAddress(string address)
public string TryGetBundleMainAssetPath(string bundleName)
{
if (AddressDic.TryGetValue(address, out string assetPath))
foreach (var patchAsset in AssetList)
{
int bundleID = patchAsset.BundleID;
if (bundleID >= 0 && bundleID < BundleList.Count)
{
var patchBundle = BundleList[bundleID];
if (patchBundle.BundleName == bundleName)
return patchAsset.AssetPath;
}
else
{
throw new Exception($"Invalid depend id : {bundleID} Asset path : {patchAsset.AssetPath}");
}
}
return string.Empty;
}
/// <summary>
/// 映射为资源路径
/// </summary>
public string MappingToAssetPath(string location)
{
if (AssetPathMapping.TryGetValue(location, out string assetPath))
{
return assetPath;
}
else
{
YooLogger.Warning($"Not found address in patch manifest : {address}");
YooLogger.Warning($"Failed to mapping location to asset path : {location}");
return string.Empty;
}
}
@ -162,36 +184,47 @@ namespace YooAsset
// AssetList
foreach (var patchAsset in patchManifest.AssetList)
{
string assetPath = patchAsset.AssetPath;
// 添加原始路径
// 注意:我们不允许原始路径存在重名
string assetPath = patchAsset.AssetPath;
if (patchManifest.Assets.ContainsKey(assetPath))
throw new Exception($"Asset path have existed : {assetPath}");
throw new Exception($"AssetPath have existed : {assetPath}");
else
patchManifest.Assets.Add(assetPath, patchAsset);
// 添加去掉后缀名的路径
if (Path.HasExtension(assetPath))
{
string assetPathWithoutExtension = StringUtility.RemoveExtension(assetPath);
if (patchManifest.Assets.ContainsKey(assetPathWithoutExtension))
YooLogger.Warning($"Asset path have existed : {assetPathWithoutExtension}");
else
patchManifest.Assets.Add(assetPathWithoutExtension, patchAsset);
}
}
// Address
// AssetPathMapping
if (patchManifest.EnableAddressable)
{
foreach (var patchAsset in patchManifest.AssetList)
{
string address = patchAsset.Address;
if (patchManifest.AddressDic.ContainsKey(address))
if (patchManifest.AssetPathMapping.ContainsKey(address))
throw new Exception($"Address have existed : {address}");
else
patchManifest.AddressDic.Add(address, patchAsset.AssetPath);
patchManifest.AssetPathMapping.Add(address, patchAsset.AssetPath);
}
}
else
{
foreach (var patchAsset in patchManifest.AssetList)
{
string assetPath = patchAsset.AssetPath;
// 添加原生路径的映射
if (patchManifest.AssetPathMapping.ContainsKey(assetPath))
throw new Exception($"AssetPath have existed : {assetPath}");
else
patchManifest.AssetPathMapping.Add(assetPath, assetPath);
// 添加无后缀名路径的映射
if (Path.HasExtension(assetPath))
{
string assetPathWithoutExtension = StringUtility.RemoveExtension(assetPath);
if (patchManifest.AssetPathMapping.ContainsKey(assetPathWithoutExtension))
YooLogger.Warning($"AssetPath have existed : {assetPathWithoutExtension}");
else
patchManifest.AssetPathMapping.Add(assetPathWithoutExtension, assetPath);
}
}
}

View File

@ -3,18 +3,19 @@ using System.Reflection;
namespace YooAsset
{
internal static class LocationServicesHelper
internal static class EditorPlayModeHelper
{
private static System.Type _classType;
public static void InitEditorPlayMode(bool enableAddressable)
public static string DryRunBuild()
{
_classType = Assembly.Load("YooAsset.Editor").GetType("YooAsset.Editor.AssetBundleGrouperRuntimeSupport");
InvokePublicStaticMethod(_classType, "InitEditorPlayMode", enableAddressable);
_classType = Assembly.Load("YooAsset.Editor").GetType("YooAsset.Editor.AssetBundleRuntimeBuilder");
InvokePublicStaticMethod(_classType, "FastBuild");
return GetPatchManifestFilePath();
}
public static string ConvertLocationToAssetPath(string location)
private static string GetPatchManifestFilePath()
{
return (string)InvokePublicStaticMethod(_classType, "ConvertLocationToAssetPath", location);
return (string)InvokePublicStaticMethod(_classType, "GetPatchManifestFilePath");
}
private static object InvokePublicStaticMethod(System.Type type, string method, params object[] parameters)
{
@ -28,4 +29,9 @@ namespace YooAsset
}
}
}
#else
internal static class EditorPlayModeHelper
{
public static string DryRunBuild() { throw new System.Exception("Only support in unity editor !"); }
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5b09fe4b7aa2d2143bc538976541b039
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -6,12 +6,14 @@ namespace YooAsset
{
internal class EditorPlayModeImpl : IBundleServices
{
internal PatchManifest AppPatchManifest;
/// <summary>
/// 异步初始化
/// </summary>
public InitializationOperation InitializeAsync()
{
var operation = new EditorPlayModeInitializationOperation();
var operation = new EditorPlayModeInitializationOperation(this);
OperationSystem.ProcessOperaiton(operation);
return operation;
}
@ -21,27 +23,41 @@ namespace YooAsset
/// </summary>
public int GetResourceVersion()
{
if (AppPatchManifest == null)
return 0;
return AppPatchManifest.ResourceVersion;
}
#region IBundleServices接口
BundleInfo IBundleServices.GetBundleInfo(string bundleName)
{
YooLogger.Warning($"Editor play mode can not get bundle info.");
if (string.IsNullOrEmpty(bundleName))
return new BundleInfo(string.Empty);
if (AppPatchManifest.Bundles.TryGetValue(bundleName, out PatchBundle patchBundle))
{
string mainAssetPath = AppPatchManifest.TryGetBundleMainAssetPath(bundleName);
BundleInfo bundleInfo = new BundleInfo(patchBundle, BundleInfo.ELoadMode.LoadFromEditor, mainAssetPath);
return bundleInfo;
}
else
{
YooLogger.Warning($"Not found bundle in patch manifest : {bundleName}");
BundleInfo bundleInfo = new BundleInfo(bundleName);
return bundleInfo;
}
string IBundleServices.ConvertAddress(string address)
}
string IBundleServices.MappingToAssetPath(string location)
{
throw new Exception($"Editor play mode not support addressable.");
return AppPatchManifest.MappingToAssetPath(location);
}
string IBundleServices.GetBundleName(string assetPath)
{
return assetPath;
return AppPatchManifest.GetBundleName(assetPath);
}
string[] IBundleServices.GetAllDependencies(string assetPath)
{
return new string[] { };
return AppPatchManifest.GetAllDependencies(assetPath);
}
#endregion
}

View File

@ -309,9 +309,9 @@ namespace YooAsset
return bundleInfo;
}
}
string IBundleServices.ConvertAddress(string address)
string IBundleServices.MappingToAssetPath(string location)
{
return LocalPatchManifest.ConvertAddress(address);
return LocalPatchManifest.MappingToAssetPath(location);
}
string IBundleServices.GetBundleName(string assetPath)
{

View File

@ -56,9 +56,9 @@ namespace YooAsset
return bundleInfo;
}
}
string IBundleServices.ConvertAddress(string address)
string IBundleServices.MappingToAssetPath(string location)
{
return AppPatchManifest.ConvertAddress(address);
return AppPatchManifest.MappingToAssetPath(location);
}
string IBundleServices.GetBundleName(string assetPath)
{

View File

@ -9,9 +9,9 @@ namespace YooAsset
BundleInfo GetBundleInfo(string bundleName);
/// <summary>
/// 可寻址地址转换为资源路径
/// 映射为资源路径
/// </summary>
string ConvertAddress(string address);
string MappingToAssetPath(string location);
/// <summary>
/// 获取资源所属的资源包名称

View File

@ -6,6 +6,6 @@ namespace YooAsset
/// <summary>
/// 定位地址转换为资源路径
/// </summary>
string ConvertLocationToAssetPath(YooAssets.EPlayMode playMode, string location);
string ConvertLocationToAssetPath(string location);
}
}

View File

@ -3,27 +3,9 @@ namespace YooAsset
{
public class AddressLocationServices : ILocationServices
{
public AddressLocationServices()
public string ConvertLocationToAssetPath(string location)
{
#if UNITY_EDITOR
LocationServicesHelper.InitEditorPlayMode(true);
#endif
}
public string ConvertLocationToAssetPath(YooAssets.EPlayMode playMode, string location)
{
if (playMode == YooAssets.EPlayMode.EditorPlayMode)
{
#if UNITY_EDITOR
return LocationServicesHelper.ConvertLocationToAssetPath(location);
#else
throw new System.NotImplementedException();
#endif
}
else
{
return YooAssets.ConvertAddress(location);
}
return YooAssets.MappingToAssetPath(location);
}
}
}

View File

@ -9,34 +9,19 @@ namespace YooAsset
{
if (string.IsNullOrEmpty(resourceRoot) == false)
_resourceRoot = PathHelper.GetRegularPath(resourceRoot);
#if UNITY_EDITOR
LocationServicesHelper.InitEditorPlayMode(false);
#endif
}
public string ConvertLocationToAssetPath(YooAssets.EPlayMode playMode, string location)
public string ConvertLocationToAssetPath(string location)
{
location = CombineAssetPath(_resourceRoot, location);
if (playMode == YooAssets.EPlayMode.EditorPlayMode)
if (string.IsNullOrEmpty(_resourceRoot))
{
#if UNITY_EDITOR
return LocationServicesHelper.ConvertLocationToAssetPath(location);
#else
throw new System.NotImplementedException();
#endif
return YooAssets.MappingToAssetPath(location);
}
else
{
return location;
}
}
private string CombineAssetPath(string root, string location)
{
if (string.IsNullOrEmpty(root))
return location;
else
return $"{root}/{location}";
string tempLocation = $"{_resourceRoot}/{location}";
return YooAssets.MappingToAssetPath(tempLocation);
}
}
}
}

View File

@ -310,7 +310,7 @@ namespace YooAsset
/// </summary>
public static BundleInfo GetBundleInfo(string location)
{
string assetPath = _locationServices.ConvertLocationToAssetPath(_playMode, location);
string assetPath = _locationServices.ConvertLocationToAssetPath(location);
string bundleName = _bundleServices.GetBundleName(assetPath);
return _bundleServices.GetBundleInfo(bundleName);
}
@ -353,7 +353,7 @@ namespace YooAsset
/// <param name="priority">优先级</param>
public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100)
{
string scenePath = _locationServices.ConvertLocationToAssetPath(_playMode, location);
string scenePath = _locationServices.ConvertLocationToAssetPath(location);
var handle = AssetSystem.LoadSceneAsync(scenePath, sceneMode, activateOnLoad, priority);
return handle;
}
@ -367,10 +367,11 @@ namespace YooAsset
/// <param name="copyPath">拷贝路径</param>
public static RawFileOperation GetRawFileAsync(string location, string copyPath = null)
{
string assetPath = _locationServices.ConvertLocationToAssetPath(_playMode, location);
string assetPath = _locationServices.ConvertLocationToAssetPath(location);
if (_playMode == EPlayMode.EditorPlayMode)
{
BundleInfo bundleInfo = new BundleInfo(assetPath);
string bundleName = _bundleServices.GetBundleName(assetPath);
BundleInfo bundleInfo = _bundleServices.GetBundleInfo(bundleName);
RawFileOperation operation = new EditorPlayModeRawFileOperation(bundleInfo, copyPath);
OperationSystem.ProcessOperaiton(operation);
return operation;
@ -482,7 +483,7 @@ namespace YooAsset
private static AssetOperationHandle LoadAssetInternal(string location, System.Type assetType, bool waitForAsyncComplete)
{
string assetPath = _locationServices.ConvertLocationToAssetPath(_playMode, location);
string assetPath = _locationServices.ConvertLocationToAssetPath(location);
var handle = AssetSystem.LoadAssetAsync(assetPath, assetType);
if (waitForAsyncComplete)
handle.WaitForAsyncComplete();
@ -490,7 +491,7 @@ namespace YooAsset
}
private static SubAssetsOperationHandle LoadSubAssetsInternal(string location, System.Type assetType, bool waitForAsyncComplete)
{
string assetPath = _locationServices.ConvertLocationToAssetPath(_playMode, location);
string assetPath = _locationServices.ConvertLocationToAssetPath(location);
var handle = AssetSystem.LoadSubAssetsAsync(assetPath, assetType);
if (waitForAsyncComplete)
handle.WaitForAsyncComplete();
@ -583,7 +584,7 @@ namespace YooAsset
List<string> assetPaths = new List<string>(locations.Length);
foreach (var location in locations)
{
string assetPath = _locationServices.ConvertLocationToAssetPath(_playMode, location);
string assetPath = _locationServices.ConvertLocationToAssetPath(location);
assetPaths.Add(assetPath);
}
return _hostPlayModeImpl.CreatePatchDownloaderByPaths(assetPaths, downloadingMaxNumber, failedTryAgain);
@ -731,10 +732,37 @@ namespace YooAsset
}
}
}
internal static string ConvertAddress(string address)
internal static string MappingToAssetPath(string location)
{
return _bundleServices.ConvertAddress(address);
#if UNITY_EDITOR
CheckLocation(location);
#endif
return _bundleServices.MappingToAssetPath(location);
}
#if UNITY_EDITOR
private static void CheckLocation(string location)
{
if (string.IsNullOrEmpty(location))
{
UnityEngine.Debug.LogError("location param is null or empty!");
}
else
{
// 检查路径末尾是否有空格
int index = location.LastIndexOf(" ");
if (index != -1)
{
if (location.Length == index + 1)
UnityEngine.Debug.LogWarning($"Found blank character in location : \"{location}\"");
}
if (location.IndexOfAny(System.IO.Path.GetInvalidPathChars()) >= 0)
UnityEngine.Debug.LogWarning($"Found illegal character in location : \"{location}\"");
}
}
#endif
#endregion
}
}