UE5 - C++开发快速入门教程4(添加自定义的UE函数:UFunction)
作者:hangge | 2026-10-15 09:27
在 UClass 中,我们可以定义两种成员函数。一种是原生 C++ 的函数,但是这种函数无法被 UE5 识别到,对于 UE5 来说是透明的,也就意味着蓝图无法识别和使用这些函数。 另一种函数叫 UFuntion,也就是 UE 函数,能够被 UE5 识别到。本文演示如何给前文创建的 HelloUE 这个类添加一个 SayHello 的 UFunction,并让它能够被编辑器和蓝图调用。
(2)然后在 HelloUE5.cpp 源文件中,增加 SayHello() 函数体。在这个函数体中,我们用了 UE_LOG 这个宏来打印“Welcome to hangge.com”到游戏的 Output 窗口。

(3)再次编译项目,我们打开 BP_HelloUE,在“事件图表”中就可以搜索到 SayHello 函数节点了。我们将该节点连接到 BeginPlay 事件节点之后,然后编译和保存蓝图。

(3)启动编辑器后运行游戏,选中场景中的 BP_HelloUE,就可以在细节面板中看到按钮 SayHello 了。单击按钮,就可以调用 SayHello 函数。

(4)编译项目并打开编辑器。打开 BP_HelloUE 蓝图类,右击打开节点搜索框,搜索“SayHello”,此时可以在节点搜索框中找到函数的别名“打招呼”,并且属于的类别是“自定义函数”。
四、添加自定义的 UE 函数(UFunction)
1,创建函数
(1)首先我们将如下高亮代码添加到 HelloUE.h 头文件里 AHelloUE 的类体中。
提示:可以注意到,这个 SayHello 函数和原生 C++ 函数的最大的不同之处在于在函数的定义前加了一句 UFUNCTION()。与 UCLASS 宏的使用场景类似,想要让一个原生 C++ 类的成员函数成为 UFunction,需要在函数体里函数的前一行添加 UFUNCTION() 宏, 如此一来 UE5 就能识别到这个函数。UFUNCTION()与 UCLASS() 宏类似,可以添加各种说明符,用来定义 UFunction 的各种特性。
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "HelloUE.generated.h"
UCLASS(BlueprintType, meta = (DisplayName = "你好虚幻引擎", ShortToolTip = "这是一个提示信息"))
class DEMO3_API AHelloUE : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AHelloUE();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UFUNCTION()
void SayHello();
};
(2)然后在 HelloUE5.cpp 源文件中,增加 SayHello() 函数体。在这个函数体中,我们用了 UE_LOG 这个宏来打印“Welcome to hangge.com”到游戏的 Output 窗口。
提示:在 UFUNCTION 宏中,我们同样可以加入各种说明符来定义 UFunction 的行为。
void AHelloUE::SayHello()
{
UE_LOG(LogTemp, Log, TEXT("Welcome to hangge.com"))
}
2,添加 BlueprintCallable 说明符
(1)在前文中,我们创建了蓝图类 BP_HelloUE,继承于 AHelloUE。打开这个蓝图类,然后尝试搜索父类函数 SayHello,我们会发现找不到这个函数。

(2)这是因为我们没有在 UFUNCTION 宏中指定将这个函数暴露给蓝图。修改 HelloUE 头文件中 SayHello 的 UFUNCTION 宏,加入说明符 BlueprintCallable(蓝图可调用),这个说明符表示该函数可以被蓝图调用。
UFUNCTION(BlueprintCallable)
(3)再次编译项目,我们打开 BP_HelloUE,在“事件图表”中就可以搜索到 SayHello 函数节点了。我们将该节点连接到 BeginPlay 事件节点之后,然后编译和保存蓝图。

(4)运行游戏,保证 BP_HelloUE 类的实例在场景中,游戏开始后 BeginPlay 就会发生响应,SayHello 函数被调用,信息会被打印到下方的“输出日志”中。
提示:“输出日志”里面的 Log 太多了,我们可以在上方的搜索框中搜索“welcome”,就可以找到 SayHello 的打印信息。
3,添加 CallInEditor 说明符
(1)我们知道,在蓝图开发的时候,如果我们将一个蓝图函数设置为“编辑器中调用”(Call In Editor),就可以在游戏运行期间,选中它,并在细节面板中调用这个函数。

(2)在 C++ 中,我们通过设置宏说明符 CallnEditor 也可以达到一样的效果。修改 SayHello 函数的 UFUNCTION 宏中的说明符,加入 CallInEditor 说明符,然后重新编译项目。
UFUNCTION(BlueprintCallable, CallInEditor)
(3)启动编辑器后运行游戏,选中场景中的 BP_HelloUE,就可以在细节面板中看到按钮 SayHello 了。单击按钮,就可以调用 SayHello 函数。

4,添加 BlueprintPure 说明符
(1)写蓝图函数的时候,可以通过将函数设置为“纯函数”(Pure)来将它变成一个 Pure 函数。变成 Pure 函数之后,函数节点将不再有执行管脚。

(2)同样的,BlueprintPure 说明符的作用对应着蓝图类中的 Pure 选项,这里我们通过在 UFUNCTION 中添加 BlueprintPure 说明符达到同样效果。
UFUNCTION(BlueprintCallable, BlueprintPure)
5,添加函数元数据说明符
(1)与 UCLASS 宏一样,UFUNCTION 宏也可以设置 meta 信息。
- 在 C++ 中,我们一般给函数起名都是用的英文,但是如果你想要函数在蓝图中能够显示一个更友好的中文名,我们可以通过 meta 来做到。
(2)比较常用的函数元标签包括:
- DefaultToSelf 适用于蓝图函数,将节点所调用的对象默认设置为 self。
- HideSelfPin 适用于蓝图函数,隐藏 Self 管脚。
- DeprecatedFunction 声明该函数已经废弃。
- DevelopmentOnly 声明该函数只能在 Development 模式下运行。
- KeyWords="Set Of Keywords" 设置一组关键字,关键字用于在蓝图的节点搜索框中进行搜索。假设我们给一个函数设置了 meta=(KeyWords="MyFunc"),那么当我们在节点搜索框中搜索“MyFunc”的时候,就可以搜索到该函数。
- ShortToolTip="Short tooltip" 和 ToolTip="Hand-written tooltip" 与类元数据说明符一样,用于描述函数。
- Category="Category" 用来声明函数所属的类别。
(3)我们尝试来给 SayHello 设置一个别名。给函数 SayHello 的 UFUNCTION 宏设置 meta 参数。
UFUNCTION(BlueprintCallable, CallInEditor, meta=(DisplayName="打招呼", Category="自定义函数"))
(4)编译项目并打开编辑器。打开 BP_HelloUE 蓝图类,右击打开节点搜索框,搜索“SayHello”,此时可以在节点搜索框中找到函数的别名“打招呼”,并且属于的类别是“自定义函数”。

(5)单击选中函数,看到生成的节点的名字也是“打招呼”

全部评论(0)