跨 C++ 和蓝图边界调用函数
(主要内容来自官方文档,加入了一些自己的理解)
下面都假设C++中有个函数名称为SomeFunction.
-
C++调用蓝图函数:
在C++函数声明前加入BlueprintImplementableEvent标签,则SomeFunction在蓝图中以事件的方式出现,可以调用该事件。
UFUNCTION(BlueprintImplementableEvent, Category="SomeCategory") void SomeFunction();
注意,该函数在C++中不能有实现(定义),不然编译会报错。
这种跨边界调用方式的意义在于:可以在C++中其他位置调用一个目前没有任何功能的函数(事件),而该函数的具体实现交给使用蓝图的设计师来决定。
-
给上述的函数添加默认的C++实现:
要想添加默认的C++实现,就不能使用BlueprintImplementableEvent标签,而是对该函数使用BlueprintNativeEvent,另外,需要手动再添加一个函数声明,函数名称有固定的格式:SomeFunction_Implementation。
SomeFunction不能有实现(定义),SomeFunction_Implementation必须有实现(定义)。
//.h文件******************************** UFUNCTION(BlueprintNativeEvent, Category = "SomeCategory") void SomeFunction(); void SomeFunction_Implementation(); //.cpp文件******************************** void AMyActor::SomeFunction_Implementation() { UE_LOG(LogTemp, Warning, TEXT("Implenetaion in C++")); } //在Tick中调用SomeFunction(),会自动优先调用Somefunction_Implementation() void AMyActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); SomeFunction(); }
调用方式:在调用了SomeFunction()的地方有限调用SomeFunction_Implementation的实现,但如果在蓝图中定义了SomeFunction事件(即在蓝图的SomeCategory分类中选择Event Some Function事件,即使后面不连接任何内容),则会忽略SomeFunction_Implementation中的实现,只采用蓝图中的实现。
阅读引擎源代码发现SomeFunction_Implementation也可以不需要声明,直接在CPP文件中写其实现即可