====== Поддержка блупринт-нативизации ======
[[ue>ProgrammingAndScripting/Blueprints/TechnicalGuide/NativizingBlueprints|Blueprint nativization]] конвертирует визуализированный блупринт-код какой-нибудь ноды в её C++ реализацию, что досрочно компилируется, а не интерпретируется в процессе игры. Для сложных сценариев это может работать гораздо быстрее, так как C++ компиляторы
богаты на оптимизации.
К несчастью, Unreal Engine не поддерживает нативизацию функций, выполняющих манипуляции с виртуальной машиной блупринтов. Apparatus - достаточно низкоуровневый инструмент с набором функций конкретно такого рода, поэтому, когда вы помечаете свою механику как нативизируемую (nativized) и затем пакуете сборку, вы можете получить примерно такое сообщение в консоли
UATHelper: Packaging (Windows (64-bit)): .../Intermediate/Plugins/NativizedAssets/Windows/Game/Source/NativizedAssets/Private/...cpp(657): error C3861: 'GetChunkChainTraitAt': identifier not found
UATHelper: Packaging (Windows (64-bit)): .../Intermediate/Plugins/NativizedAssets/Windows/Game/Source/NativizedAssets/Private/...cpp(783): error C2039: 'SetSubjectTrait': is not a member of 'FCustomThunkTemplates'
Нам повезло: есть довольно лёгкие обходные пути, чтобы избежать этой проблемы.
На самом деле, вы можете вполне безболезненно поменять один заголовочный файл в папке Unreal. Он находится по пути: ''C:\Program Files\Epic Games\UE_4.26\Engine\Source\Runtime\Engine\Public\GeneratedCodeHelpers.h''
Откройте этот файл в предпочитаемом текстовом редакторе и добавьте следующий код в конец структуры ''FCustomThunkTemplates''. В версии 4.26 структура объявлена в строчке 89. Вы можете добавить вот этот фрагмент в публичную секцию структуры ''public:''.
#pragma region Apparatus Nativization Support
template
static void
SetSubjectTrait(TSubjectHandle& SubjectHandle,
UScriptStruct* TraitType,
void* InTraitData)
{
SubjectHandle.SetTrait(TraitType, InTraitData);
}
template
static void
SetSubjectTrait(TSubjectHandle& SubjectHandle,
UScriptStruct* TraitType,
const T& InTraitData)
{
SubjectHandle.SetTrait(TraitType, (const void* const)&InTraitData);
}
template
static void
ObtainSubjectTrait(TSubjectHandle& SubjectHandle,
UScriptStruct* TraitType,
void* const OutTraitData)
{
SubjectHandle.ObtainTrait(TraitType, OutTraitData);
}
template
static void
ObtainSubjectTrait(TSubjectHandle& SubjectHandle,
UScriptStruct* TraitType,
T* OutTraitData)
{
SubjectHandle.ObtainTrait(TraitType, (void* const)&OutTraitData);
}
template
static void
GetSubjectTrait(TSubjectHandle& SubjectHandle,
UScriptStruct* TraitType,
void* const OutTraitData)
{
SubjectHandle.GetTrait(TraitType, OutTraitData);
}
template
static void
GetSubjectTrait(TSubjectHandle& SubjectHandle,
UScriptStruct* TraitType,
T& OutTraitData)
{
SubjectHandle.GetTrait(TraitType, (void* const)&OutTraitData);
}
template
static void
GetChunkChainTraitAt(const int32& ChunkChainId,
const int32 TraitIndex,
T& OutTraitData)
{
ensure(UMachine::ObtainChunkChain(ChunkChainId).GetTraitAt(TraitIndex, (void* const)&OutTraitData)
>= EApparatusStatus::Success);
}
template
static void
GetChunkChainTraitAt(const int32& ChunkChainId,
const int32 TraitIndex,
T* const OutTraitData)
{
ensure(UMachine::ObtainChunkChain(ChunkChainId).GetTraitAt(TraitIndex, (void* const)OutTraitData)
>= EApparatusStatus::Success);
}
#pragma endregion Apparatus Nativization Support