update package invoke builder

新增包裹构建器,运行时构建资源包裹
pull/455/head
何冠峰 2025-01-03 19:15:29 +08:00
parent 2a8761c29e
commit bc7c6c1f33
11 changed files with 114 additions and 79 deletions

View File

@ -8,7 +8,7 @@ namespace YooAsset.Editor
/// <summary>
/// 模拟构建
/// </summary>
public static EditorSimulateBuildResult SimulateBuild(EditorSimulateBuildParam buildParam)
public static PackageInvokeBuildResult SimulateBuild(PackageInvokeBuildParam buildParam)
{
string packageName = buildParam.PackageName;
string buildPipelineName = buildParam.BuildPipelineName;
@ -31,7 +31,7 @@ namespace YooAsset.Editor
BuildResult buildResult = pipeline.Run(buildParameters, false);
if (buildResult.Success)
{
var reulst = new EditorSimulateBuildResult();
var reulst = new PackageInvokeBuildResult();
reulst.PackageRootDirectory = buildResult.OutputPackageDirectory;
return reulst;
}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0c4881e782cbf0d4aa6f8309efd22865
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,38 @@

namespace YooAsset
{
public class PackageInvokeBuildParam
{
/// <summary>
/// 包裹名称
/// </summary>
public readonly string PackageName;
/// <summary>
/// 构建管线名称
/// </summary>
public string BuildPipelineName;
/// <summary>
/// 构建类所属程序集名称
/// </summary>
public string InvokeAssmeblyName;
/// <summary>
/// 构建执行的类名全称
/// 注意:类名必须包含命名空间!
/// </summary>
public string InvokeClassFullName;
/// <summary>
/// 构建执行的方法名称
/// 注意:执行方法必须满足 BindingFlags.Public | BindingFlags.Static
/// </summary>
public string InvokeMethodName;
public PackageInvokeBuildParam(string packageName)
{
PackageName = packageName;
}
}
}

View File

@ -1,7 +1,7 @@

namespace YooAsset
{
public class EditorSimulateBuildResult
public class PackageInvokeBuildResult
{
public string PackageRootDirectory;
}

View File

@ -0,0 +1,43 @@
#if UNITY_EDITOR
using System.Reflection;
namespace YooAsset
{
public static class PakcageInvokeBuilder
{
/// <summary>
/// 调用Editro类来执行构建资源包任务
/// </summary>
public static PackageInvokeBuildResult InvokeBuilder(PackageInvokeBuildParam buildParam)
{
var assemblyName = buildParam.InvokeAssmeblyName;
var className = buildParam.InvokeClassFullName;
var methodName = buildParam.InvokeMethodName;
var classType = Assembly.Load(assemblyName).GetType(className);
return (PackageInvokeBuildResult)InvokePublicStaticMethod(classType, methodName, buildParam);
}
private static object InvokePublicStaticMethod(System.Type type, string method, params object[] parameters)
{
var methodInfo = type.GetMethod(method, BindingFlags.Public | BindingFlags.Static);
if (methodInfo == null)
{
UnityEngine.Debug.LogError($"{type.FullName} not found method : {method}");
return null;
}
return methodInfo.Invoke(null, parameters);
}
}
}
#else
namespace YooAsset
{
public static class PakcageInvokeBuilder
{
public static PackageInvokeBuildResult InvokeBuilder(PackageInvokeBuildParam buildParam)
{
throw new System.Exception("Only support in unity editor platform !");
}
}
}
#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

@ -1,38 +0,0 @@

namespace YooAsset
{
public class EditorSimulateBuildParam
{
/// <summary>
/// 包裹名称
/// </summary>
public readonly string PackageName;
/// <summary>
/// 模拟构建管线名称
/// </summary>
public string BuildPipelineName = "EditorSimulateBuildPipeline";
/// <summary>
/// 模拟构建类所属程序集名称
/// </summary>
public string InvokeAssmeblyName = "YooAsset.Editor";
/// <summary>
/// 模拟构建执行的类名全称
/// 注意:类名必须包含命名空间!
/// </summary>
public string InvokeClassFullName = "YooAsset.Editor.AssetBundleSimulateBuilder";
/// <summary>
/// 模拟构建执行的方法名称
/// 注意:执行方法必须满足 BindingFlags.Public | BindingFlags.Static
/// </summary>
public string InvokeMethodName = "SimulateBuild";
public EditorSimulateBuildParam(string packageName)
{
PackageName = packageName;
}
}
}

View File

@ -1,43 +1,16 @@
#if UNITY_EDITOR
using System.Reflection;

namespace YooAsset
{
public static class EditorSimulateModeHelper
public class EditorSimulateModeHelper
{
/// <summary>
/// 编辑器下模拟构建清单
/// </summary>
public static EditorSimulateBuildResult SimulateBuild(EditorSimulateBuildParam buildParam)
public static PackageInvokeBuildResult SimulateBuild(string packageName)
{
var assemblyName = buildParam.InvokeAssmeblyName;
var className = buildParam.InvokeClassFullName;
var methodName = buildParam.InvokeMethodName;
var classType = Assembly.Load(assemblyName).GetType(className);
return (EditorSimulateBuildResult)InvokePublicStaticMethod(classType, methodName, buildParam);
}
private static object InvokePublicStaticMethod(System.Type type, string method, params object[] parameters)
{
var methodInfo = type.GetMethod(method, BindingFlags.Public | BindingFlags.Static);
if (methodInfo == null)
{
UnityEngine.Debug.LogError($"{type.FullName} not found method : {method}");
return null;
}
return methodInfo.Invoke(null, parameters);
var buildParam = new PackageInvokeBuildParam(packageName);
buildParam.BuildPipelineName = "EditorSimulateBuildPipeline";
buildParam.InvokeAssmeblyName = "YooAsset.Editor";
buildParam.InvokeClassFullName = "YooAsset.Editor.AssetBundleSimulateBuilder";
buildParam.InvokeMethodName = "SimulateBuild";
return PakcageInvokeBuilder.InvokeBuilder(buildParam);
}
}
}
#else
namespace YooAsset
{
public static class EditorSimulateModeHelper
{
public static EditorSimulateBuildResult SimulateBuild(EditorSimulateBuildParam buildParam)
{
throw new System.Exception("Only support in unity editor !");
}
}
}
#endif
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 5b09fe4b7aa2d2143bc538976541b039
guid: b0a23f529c8bf4943a371ee6b360e698
MonoImporter:
externalObjects: {}
serializedVersion: 2