Utilizing Unreal Engine’s reflection system

В этом посте мы собираемся использовать встроенную систему «отражения» в UE4 в для выполнения изменений во время игры. Отражения являются способностью программы проверять свой код (или другой соответствующий) и изменять его во время выполнения. По умолчанию, С++ не способен на это, однако в Unreal Engine создал эту способность для нас!
В этом посте мы собираемся создать одну BlueprintCallable функцию, которая будет принимать один параметр Fstring. Эта функция будет искать все доступные функции нашего объекта, и если ему удается найти функцию, имя которой совпадает с нашим параметром, она будет выполнять ее. Это наиболее распространенный способ использования «отражения».
Давайте двинемся дальше и используем эту систему в движке!

Utilizing UE’s reflection system

Я создал шаблон Thrid Person C++, и внутри .h файла моего персонажа я добавил следующие заявления:

Code


public:

/*This function will search which function to execute*/
UFUNCTION(BlueprintCallable, Category = Reflection)
void ExecuteFunction(FString FunctionToExecute);

UFUNCTION()
void DoSomething();

[свернуть]
Затем я реализовал следующую логику (.cpp)
Code


void AReflectionCharacter::ExecuteFunction(FString FunctionToExecute)
{
//FindFunction will return a pointer to a UFunction based on a
//given FName. We use an asterisk before our FString in order to
//convert the FString variable to FName
UFunction* Function = FindFunction(*FunctionToExecute);

//When you're using a pointer - make sure to check if it's valid first!
if (Function)
{
//The following pointer is a void pointer,
//this means that it can point to anything - from raw memory to all the known types -
void* locals = nullptr;

//In order to execute our function we need to reserve a chunk of memory in
//the execution stack for it.
FFrame* frame = new FFrame(this, Function, locals);

//Unfortunately the source code of the engine doesn't explain what the locals
//pointer is used for.
//After some trial and error I ended up on this code which actually works without any problem.

//Actual call of our UFunction
CallFunction(*frame, locals, Function);

//delete our pointer to avoid memory leaks!
delete frame;
}
}

[свернуть]
Сохраняем и компилируем код. Когда вы закончите с этим, добавьте следующий код Blueprint для вашего персонажа.
Image

[свернуть]
А вот и результат нашей работы:
Image

[свернуть]
Original page


Читайте также: