Files
BusyRabbit/Plugins/UnrealSharp/Source/UnrealSharpManagedGlue/Exporters/DelegateExporter.cs
wyatt 648386cd73 Lua向C#逻辑迁移 一期 #13
将整个插件代码上传
2025-10-26 21:48:39 +08:00

60 lines
2.3 KiB
C#

using EpicGames.Core;
using EpicGames.UHT.Types;
using UnrealSharpScriptGenerator.PropertyTranslators;
using UnrealSharpScriptGenerator.Utilities;
namespace UnrealSharpScriptGenerator.Exporters;
public static class DelegateExporter
{
public static void ExportDelegate(UhtFunction function)
{
string delegateName = DelegateBasePropertyTranslator.GetDelegateName(function);
string delegateNamespace = function.GetNamespace();
GeneratorStringBuilder builder = new();
builder.GenerateTypeSkeleton(delegateNamespace);
builder.AppendLine();
string superClass;
if (function.HasAllFlags(EFunctionFlags.MulticastDelegate))
{
superClass = $"MulticastDelegate<{delegateName}>";
}
else
{
superClass = $"Delegate<{delegateName}>";
}
FunctionExporter functionExporter = FunctionExporter.ExportDelegateSignature(builder, function, delegateName);
builder.DeclareType(function, "class", $"U{delegateName}", superClass);
FunctionExporter.ExportDelegateGlue(builder, functionExporter);
builder.AppendLine("static public void InitializeUnrealDelegate(IntPtr nativeDelegateProperty)");
builder.OpenBrace();
ExportDelegateFunctionStaticConstruction(builder, function);
builder.CloseBrace();
builder.CloseBrace();
FileExporter.SaveGlueToDisk(function, builder);
}
private static void ExportDelegateFunctionStaticConstruction(GeneratorStringBuilder builder, UhtFunction function)
{
string delegateName = function.SourceName;
builder.AppendLine($"{delegateName}_NativeFunction = FMulticastDelegatePropertyExporter.CallGetSignatureFunction(nativeDelegateProperty);");
if (function.HasParameters)
{
builder.AppendLine($"{delegateName}_ParamsSize = {ExporterCallbacks.UFunctionCallbacks}.CallGetNativeFunctionParamsSize({delegateName}_NativeFunction);");
}
foreach (UhtProperty parameter in function.Properties)
{
PropertyTranslator propertyTranslator = PropertyTranslatorManager.GetTranslator(parameter)!;
propertyTranslator.ExportParameterStaticConstructor(builder, parameter, function, parameter.SourceName, delegateName);
}
}
}