這篇博客講解了在UE4中,反射機制的實現。
反射機制
反射機制指的是程序可以在運行期間進行檢測和修改自己狀態的能力。
UE4引擎使用C++語言編寫,C++語言本質上不支持反射機制,但是UE4提供了反射機制的實現。
FindFunction
函數
在UE4中提供了FindFunction
函數,用於在UObject
或者AActor
中查找某個函數名的函數並且返回其函數指針。
使用方法如下:
UFunction *Injured = this->FindFunction(TEXT("Injured"));
- 1
因此我們可以在Runtime時根據函數名的不同來進行函數的查找並且觸發。
使用ProcessEvent
函數來進行函數的觸發
在UE4中提供了ProcessEvent函數來進行觸發函數指針對應的函數,具體使用方法如下:
UFunction *Injured = this->FindFunction(TEXT("Injured"));
if (Injured)
{
ProcessEvent(Injured, nullptr);
}
- 1
- 2
- 3
- 4
- 5
ProcessEvent函數第一個參數是函數指針,第二個參數指的是參數列表,其類型爲void*
類型。
使用CallFunction
函數進行觸發
還可以使用CallFunction函數來進行對應函數的觸發,但是需要進行FFrame
的建立。
並且爲了避免內存泄漏,需要注意在使用過後銷燬FFrame
。
使用方法如下:
UFunction *Injured = this->FindFunction(TEXT("Injured"));
if (Injured)
{
void* params = nullptr;
FFrame* frame = new Frame(this, Injured, params);
CallFunction(*frame, params, Injured);
delete frame;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
額外功效
使用如下的兩種方法還可以有一個額外的功能 —— 在C++中進行BP函數的調用。當需要在C++與BP進行通信時,一個做法是在關卡中進行通信,另一個做法則是使用上面的方法進行函數調用。