如果蓝图在每个 tick 都执行大量操作和复杂的数学计算,则需要考虑使用本地 C++ 代码。蓝图最适合创建事件驱动的功能,如处理伤害接收、控制,或其他非每帧调用的操作。
蓝图类是在项目中实现可重用行为的最佳方式。创建蓝图类后,可将其添加到任意关卡,还可随意添加任意数量的副本到关卡中,无需四处复制脚本。
公开函数到蓝图:UFUNCTION宏
1. BlueprintCallable 蓝图可调用,C++函数可以在蓝图中被调用
UFUNCTION(BlueprintCallable,Category = "Test|BlueprintCallable",meta = (DisplayName = "整型转字符串"))
//有一个返回值的函数
FString IntTofsTing(int32 input)
{
return FString::FromInt(input);
}
2.BlueprintPure(蓝图纯函数) ,纯函数必须有返回值
UFUNCTION(BlueprintPure,Category = "Test|BlueprintPure",meta = (DisplayName = "有多个返回值的纯函数"))
void IntTofsTing(int32 input,FString &output1,int32 &output2,bool &output3)
{
output1 = FString::FromInt(input);
output2 = input + 5;
output3 = true;
}
(没输入输出引脚的)
3.BlueprintImplementableEvent(蓝图可实现事件)
C++中声明且调用函数(不定义函数),蓝图中定义函数(Functions中进行override),红色无流入引脚的形式存在
//声明函数
UFUNCTION(BlueprintImplementableEvent,Category = "Test|BlueprintImplementableEvent",meta = (DisplayName = "C++负责声明,蓝图负责定义"))
void CppDefinitionFun();
有无返回值的区别:无返回值以事件形式存在,有返回值以函数形式存在
4.BlueprintNativeEvent(蓝图原生事件)
a.C++中声明函数,C++和蓝图中都可以定义函数(C++必须实现),如果蓝图不定义,会执行C++中的定义,如果蓝图和C++都定义,蓝图则会覆盖C++定义,只执行蓝图定义.
(2)C++函数声明,需要额外声明一个名为:函数名+_Implementation的返回值和参数列表都一致的函数.
(3)BlueprintNativeEvent需要配合BlueprintCallable一起使用,否则蓝图中不可调用
(4)与BlueprintImplementableEvent 一样,有返回值的在蓝图以函数形式存在,无返回值的在蓝图中以事件形式存在.
//声明函数,无返回值
UFUNCTION(BlueprintNativeEvent,BlueprintCallable = "Test|BlueprintNativeEvent",meta = (DisplayName = "C++负责声明调用,蓝图与C++都可实现"))
void CppDefinitionFun();
//函数的定义
void ACpp_Actor::CppDefinitionFun_Implementation()
{
FString str = TEXT("我爱中国");
GEngine->AddOnScreenDebugMessage(-1,10.f,FColor::Black,FString::Printf(TEXT("屏幕上打印出来的字是:%s"),*str));
}
5.总结
BlueprintCallable和BlueprintPure在c++中声明和定义,c++和蓝图可以调用。只是有无引脚的区别
BlueprintImplementableEvent在c++声明调用,蓝图中定义。
BlueprintNativeEvent 在c++中声明定义调用,蓝图中定义可覆盖c++定义
引用: