【UE4笔记】如何查找蓝图中对应的C++函数《将蓝图转化为C++》 官方视频教程笔记

上一篇博客,我们介绍了如何将蓝图函数转化为C++函数,但在函数体的实现中,应该如何找到蓝图函数体中使用的函数并转化为C++函数呢?

步骤图解

  1. 查看蓝图函数的目标
    在这里插入图片描述

  2. 在VS中Ctrl+,搜索该目标名称,找到这个目标的头文件
    在这里插入图片描述

  3. 在头文件中搜索函数名,找到实际的C++函数
    在这里插入图片描述

  4. 找到函数名对应的函数体(热键Ctrl+左键单击函数名
    在这里插入图片描述
    若其函数体只有一个函数调用,这一个函数就是我们要找的函数。若其函数体比较复杂,则直接在C++中调用这个函数就行。(详见下文几种情况)

  5. 在我们的代码中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这个头文件

常用的类头文件

在这里插入图片描述

文字总结

  1. 查看蓝图函数的目标
  2. 在VS中Ctrl+,搜索该目标名称,找到这个目标对象的头文件
  3. 在头文件中搜索函数名
  4. 找到函数名对应的函数体
    若其函数体只有一个函数调用,这一个函数就是我们要找的函数。若其函数体比较复杂,则直接在C++中调用这个函数就行。(详见下文几种情况)
  5. 在我们的代码中include这个头文件
    可以找到这个对象的.cpp文件,看看这个对象的cpp是如何include它的头文件的,复制这段include就行
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE4,可以通过蓝图调用C++全局函数。首先,需要在C++代码声明并实现全局函数。具体的步骤如下: 1. 打开UE4的项目代码文件夹,并找到对应的.h头文件和.cpp源文件。 2. 在.h头文件声明全局函数。例如,可以在声明文件的末尾添加如下代码: ``` #pragma once #include "CoreMinimal.h" UCLASS() class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() public: UFUNCTION(BlueprintCallable, Category = "MyFunctions") static void MyGlobalFunction(); }; ``` 3. 在.cpp源文件实现全局函数。例如,可以在源文件的末尾添加如下代码: ``` #include "MyBlueprintFunctionLibrary.h" void UMyBlueprintFunctionLibrary::MyGlobalFunction() { // 在此处实现全局函数的逻辑 // 例如,可以在这里添加打印语句 UE_LOG(LogTemp, Warning, TEXT("调用了全局函数!")); } ``` 4. 保存并编译C++代码,确保函数成功添加到UE4项目。 接下来,在蓝图调用该全局函数的步骤如下: 1. 打开UE4蓝图编辑器。 2. 在蓝图选择要调用全局函数的节点。 3. 在蓝图编辑器右侧的详情面板,找到“蓝图调用”节点。 4. 从“蓝图调用”节点的输出引脚拖出连接线,并将其链接到“执行入口”节点。 5. 在连接线上右键点击并选择“Convert to Previous C++ Function Call”(转换为C++函数调用)。 6. 在“函数调用”节点的类下拉菜单选择“UMyBlueprintFunctionLibrary”。 7. 在函数下拉菜单选择要调用的全局函数,例如“MyGlobalFunction”。 8. 保存蓝图并点击运行即可调用全局函数。 通过以上步骤,就可以在UE4使用蓝图调用C++全局函数了。调用全局函数可以方便地实现一些复杂的逻辑和功能,提高UE4项目的灵活性和扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值