UE4 蓝图调用C++及相关经验总结

目标

本文是对UE4引擎中蓝图调用C++流程的一个简单验证,其中既包括了蓝图调用C++函数,也包括了蓝图对C++变量的引用。
本文基于UE4 4.24版本进行开发。

过程

1 基础准备

创建一个空的(Blank)工程,注意该工程应该是基于C++的工程而不是基于蓝图的,并将其命名为DemoProject(或者任何你喜欢的名字)。
在这里插入图片描述
创建完成后发现系统同时打开了UE4的蓝图图形化界面与VisualStudio,于是你拥有了双倍快乐:D。

2 创建C++类

在UE4界面的内容浏览器中右键,选择“新建C++类”,并选择Actor作为父类(当然也可以选择别的你喜欢的父类,区别不是很大)
在这里插入图片描述
下一步提示填写C++类的名称,我设为“MyTestActor”,经过自动编译,就可以发现在Visual Studio中自动出现了我们创建的C++类。
在这里插入图片描述
现在基本环境就已经具备了。

3 创建一个方法

在VS中打开"MyTestActor.h"头文件,会看到很多我们已经非常熟悉的内容比如“BeginPlay”和“Tick”等。现在我们要添加一个新的函数TestFunc:

UFUNCTION(BlueprintCallable, Category = "test")
void TestFunc(const int &args);

整体截图如下:
在这里插入图片描述
然后打开“MyTestActor.cpp”,补完TestFunc的具体实现:

void AMyCharacter::TestFunc(const int &args) {
	//输入Log
	UE_LOG(LogTemp, Warning, TEXT("This is a CPP Function"));
	//在屏幕输出调试信息
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Ttex%d"),args));
}

整体截图如下:
在这里插入图片描述
注意:这里需要“#include “Engine.h”(上图提示了),不然无法通过编译。

4 调用这个方法

现在回到UE4的图形界面,为了保证刚才在VS中添加的内容实时更新到UE4中,需要首先进行编译,按钮位置如下图:
在这里插入图片描述
UE4中的C++对象调用,是通过“继承”实现的,因此我们需要创建一个以“MyTestActor”为父类的蓝图对象。那么首先在内容浏览器中右键,这时候会发现右键没有“创建蓝图”选项了~
这是因为当前内容浏览器的默认路径在你创建C++对象的时候更换到了C++目录中,在这个目录下是无法创建蓝图对象的。因此需要切换内容浏览器的当前目录,点击下图中的文件夹图标,就可以清楚地看到C++文件夹与蓝图文件夹的结构关系,然后做出选择了。
在这里插入图片描述
切换成功后,在内容浏览器右键,选择创建“蓝图类”,弹出一个对话框来选择该蓝图类的“父类”,这时候
就不需要在“常见类”中选择,展开“所有类”按钮,在搜索框中输入“MyTestActor”,即可显示出我们已经创建好的C++类。
在这里插入图片描述
为这个蓝图起一个你喜欢的名字,譬如“TestBP”,然后双击打开。
展开“事件图表”选项卡,在工作区右键创建一个新的节点,搜索上节创建的自定义函数(TestFunc),就可以成功添加该节点了!
在这里插入图片描述
编译一下发现缺少输入参数,那么就添加一个变量作为输入参数,再编译就成功了。
在这里插入图片描述
再回到主界面,将TestBP蓝图类拖拽到场景中,点击播放,即可在画面右上角看到弹出的打印信息。
在这里插入图片描述
这样就实现了蓝图对C++函数的调用。

5 创建一个变量

蓝图与C++的连结,除调用函数之外,还可能需要进行变量调用。首先在VS中创建需要的变量,以Int型变量为例:

UPROPERTY(BlueprintReadWrite)
int ohInt;

创建完成的变量,需要使用UPROPERTY来进行修饰,本变量设置了蓝图中的读写权限。如下所示:
在这里插入图片描述

6 使用这个变量

首先回到UE4的图形界面,进行针对C++程序的编译。
打开4中创建的TestBP蓝图,右键创建节点,以“ohInt”为关键字进行搜索,就能搜到“获取ohInit”节点了。现在用ohInt节点对之前创建的临时变量进行替换。
在这里插入图片描述
这样就完成了对变量的调用。

总结

总结部分直接进行引用吧,以下段落引用自“桔子的博客”对蓝图与C++的思考。

UE4同时支持蓝图与C++,那么我们在开发时应该如何选择呢?官方文档有如下的解释:
程序员利用C++即可添加基础Gameplay系统,然后设计师可基于这些系统进行构建或利用这些系统为某个特定关卡或游戏本身创建自定义Gameplay。
也就是说,程序员用C++开发一些基础的系统,例如本文当中的武器系统(Weapon),设计师(策划)即可利用该武器系统在蓝图上进行武器的扩充,设计出不同的武器;设计师(策划)也可以利用C++开发的基础系统,将这些系统在蓝图上进行组装,以构建更丰富的玩法系统。除此之外,蓝图的可重构性非常非常非常低,如果某个模块的逻辑比较复杂,就会出现各种线条乱飞,非常的凌乱,过段时间再过来看,可能作者自己都看不明白了。因此我建议,对于比较复杂的逻辑,最好使用C++来实现,如果一定要用蓝图,请将该部分逻辑拆分为几段小逻辑来实现(充分利用蓝图的函数与宏)。
蓝图本身是作为二进制文件来保存(.uasset),在版本管理工具中(Git)无法进行差异性对比,如果对于某段频繁修改(升级)的逻辑,又想看到每次修改的变化,最好也使用C++来实现,可以对比每个版本的修改内容。
对于复杂的数学运算或循环次数较多的逻辑,也最好采用C++来实现,以保证运行效率。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值