上一篇博客,我们介绍了如何将蓝图函数转化为C++函数,但在函数体的实现中,应该如何找到蓝图函数体中使用的函数并转化为C++函数呢?
步骤图解
-
查看蓝图函数的目标
-
在VS中
Ctrl+,
搜索该目标名称,找到这个目标的头文件
-
在头文件中搜索函数名,找到实际的C++函数
-
找到函数名对应的函数体(热键
Ctrl+左键单击函数名
)
若其函数体只有一个函数调用,这一个函数就是我们要找的函数。若其函数体比较复杂,则直接在C++中调用这个函数就行。(详见下文几种情况) -
在我们的代码中include这个头文件
对于目标是self的函数可以省略这步骤。因为对象是self的函数表示这个函数是自己或父类的成员函数,直接调用就可以了
此外的函数,可以找到这个对象目标的
.cpp
文件,看看这个对象的cpp
是如何include它的头文件的,复制这段include就行(如想使用UPhysicsHandleComponent
的函数,需要include这个头文件,可以找到UPhysicsHandleComponent.cpp
。在这里可以看到它include的路径是:#include "PhysicsEngine/PhysicsHandleComponent.h"
将它复制到我们的文件中就可以了
下文附常用的对象-头文件对应
情况1:函数体中只有一个函数调用
有时候C++会为蓝图封装一层专门给蓝图调用的函数,如下面这两个函数:
FVector USceneComponent::K2_GetComponentLocation() const
{
return GetComponentLocation();
}
FVector UKismetMathLibrary::GetForwardVector(FRotator InRot)
{
return InRot.Vector();
}
函数体内其实只有一个单独的函数调用。我们在自己的代码中就可以直接调用这个函数体内的函数(直接调用GetComponentLocation()
或FRotator.Vector()
):
FVector UGrabber::GetHoldLocation() const
{
return GetComponentLocation() + GetComponentRotation().Vector() * HoldDistance;
}
PS:带有K2或者Kismet的函数多是为蓝图封装的,Kismet就是蓝图的前身
情况2:存在更简单的替换
如函数GetComponentByClass
搜索到AActor的函数,可以看看前后几个函数一般都是相近的函数。会发现如
/** Templatized version of FindComponentByClass that handles casting for you */
template<class T>
T* FindComponentByClass() const
{
static_assert(TPointerIsConvertibleFromTo<T, const UActorComponent>::Value, "'T' template parameter to FindComponentByClass must be derived from UActorComponent");
return (T*)FindComponentByClass(T::StaticClass());
}
这个模板函数比GetComponentByClass
使用上要更简单一些,使用的时候只需要指定类来替换模板T就可以了:
AActor->FindComponentByClass<UPhysicsHandleComponent>()
我们完全可以选用这个更简单的方式
同上,刚刚举过的这个例也是一样的:
FVector UKismetMathLibrary::GetForwardVector(FRotator InRot)
{
return InRot.Vector();
}
我们可以用两种方式来实现同样的功能:
// 方式1
UKismetMathLibrary::GetForwardVector(Rotator);
// 方式2
Rotator.Vector();
我们可以选用简单一点的方式2,使用这种方式还省去了引用KismetMathLibrary这个头文件
常用的类头文件
文字总结
- 查看蓝图函数的目标
- 在VS中
Ctrl+,
搜索该目标名称,找到这个目标对象的头文件 - 在头文件中搜索函数名
- 找到函数名对应的函数体
若其函数体只有一个函数调用,这一个函数就是我们要找的函数。若其函数体比较复杂,则直接在C++中调用这个函数就行。(详见下文几种情况) - 在我们的代码中include这个头文件
可以找到这个对象的.cpp
文件,看看这个对象的cpp
是如何include它的头文件的,复制这段include就行