在虚幻引擎中,我用C++创建了一系列结构,使我能够生成TMap结构的复制版本。它依赖于许多引擎资源,如快速数组序列化,并且结构需要像普通的USTRUCT一样被引擎识别。
例如,这里有一个结构的起始部分:
USTRUCT(BlueprintType)
struct FReplicatedTMap_GuidToGuid_Array : public FFastArraySerializer
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly, NotReplicated, VisibleAnywhere)
TMap<FGuid, FGuid> ReplicatedMap;
长话短说,我的实现工作。然而,由于UHT(Unreal Header Tool(的限制,我无法使用模板
USTRUCT(BlueprintType)
template<>
因为引擎不支持它,而且我不能使用宏
#define
USTRUCT(BlueprintType)
因为UHT预处理器在寻找自己的宏(如USTRUCT(((之前不会展开宏,这会阻止引擎评估预处理器生成的代码。
在第一个代码示例中,您可以看到每组结构/函数定义只适用于一个键类型-值类型对。代码本身只有大约150行,但我不想每次需要调整这些结构模板时都要更改几十个定义,更不用说在需要新类型时创建额外的副本了。
在Unreal或使用C++中有解决方案吗?自动生成所需代码的最佳方式是什么?
如果有人无意中发现这篇文章,我发现最好的解决方案是使用Visual Studio的T4文本模板引擎,尽管它没有包含在C++项目文件中。在UE4的情况下,可以使用UProject文件来预构建文本模板。
重要资源:
C中的T4++UE4预构建
我的UProject代码添加到使用VS2019运行T4引擎:
"PreBuildSteps":
{
"Win64": [
""C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\TextTransform.exe"
$(ProjectDir)\Source\<YOUR_FILE_LOCATION>\<YOUR_TEMPLATE_FILE>.tt","echo T4 Executions Complete"
]
}