我是靠谱客的博主 风中招牌,这篇文章主要介绍最简单的 UE 4 C++ 教程 —— 触发器框【二十】,现在分享给大家,希望可以做个参考。

原教程是基于 UE 4.18,我是基于 UE 4.25】

英文原地址

接上一节教程,在本教程中,当角色与一个触发器框(Trigger Box)发生重叠时将触发一个事件。

创建一个新的 C++ TriggerBox 子类【它继承自 TriggerBase 类,而它又继承自 Actor 类】并将其命名为 MyTriggerBox 。在头文件中添加 OnOverlapBeginOnOverlapEnd 函数。

下面是最终的 .h 头文件【原教程的头文件代码错了,已修复】。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once #include "CoreMinimal.h" #include "Engine/TriggerBox.h" #include "MyTriggerBox.generated.h" /** * */ UCLASS() class HELLOUNREAL_API AMyTriggerBox : public ATriggerBox { GENERATED_BODY() protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // constructor sets default values for this actor's properties AMyTriggerBox(); // declare overlap begin function UFUNCTION() void OnOverlapBegin(AActor* OverlappedActor, AActor* OtherActor); // declare overlap end function UFUNCTION() void OnOverlapEnd(AActor* OverlappedActor, AActor* OtherActor); };

在 .cpp 文件中,为了帮助我们可视化触发器框,我们必须 #include DrawDebugHelpers.h 文件。

复制代码
1
2
3
#include "MyTriggerBox.h" // include draw debu helpers header file #include "DrawDebugHelpers.h"

我们也可以 #define 一些调试日志的快捷方式。

复制代码
1
2
#define print(text) if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 1.5, FColor::Green,text) #define printFString(text, fstring) if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT(text), fstring))

在该 actor 的构造函数中,我们将向 OnActorBeginOverlap.AddDynamic 和 OnActorEndOverlap.AddDynamic 注册重叠事件。
 

复制代码
1
2
3
4
5
6
AMyTriggerBox::AMyTriggerBox() { //Register Events OnActorBeginOverlap.AddDynamic(this, &AMyTriggerBox::OnOverlapBegin); OnActorEndOverlap.AddDynamic(this, &AMyTriggerBox::OnOverlapEnd); }

BeginPlay 上,我们将使用 DrawDebugBox 绘制调试框。

复制代码
1
2
3
4
5
6
7
void AMyTriggerBox::BeginPlay() { Super::BeginPlay(); DrawDebugBox(GetWorld(), GetActorLocation(), GetComponentsBoundingBox().GetExtent(), FColor::Purple, true, -1, 0, 5); }

接下来,我们将编写重叠函数,它将向屏幕打印一条消息,指示进入和退出触发器框的 actor 。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void AMyTriggerBox::OnOverlapBegin(class AActor* OverlappedActor, class AActor* OtherActor) { // check if Actors do not equal nullptr and that if (OtherActor && (OtherActor != this)) { // print to screen using above defined method when actor enters trigger box print("Overlap Begin"); printFString("Overlapped Actor = %s", *OverlappedActor->GetName()); } } void AMyTriggerBox::OnOverlapEnd(class AActor* OverlappedActor, class AActor* OtherActor) { if (OtherActor && (OtherActor != this)) { // print to screen using above defined method when actor leaves trigger box print("Overlap Ended"); printFString("%s has left the Trigger Box", *OtherActor->GetName()); } }

编译代码,将新 actor 拖放到游戏中,如下所示

 运行起来的框是这样的

下面是最后的 .cpp 文件。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define print(text) if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 1.5, FColor::Green,text) #define printFString(text, fstring) if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT(text), fstring)) #include "MyTriggerBox.h" // include draw debu helpers header file #include "DrawDebugHelpers.h" AMyTriggerBox::AMyTriggerBox() { //Register Events OnActorBeginOverlap.AddDynamic(this, &AMyTriggerBox::OnOverlapBegin); OnActorEndOverlap.AddDynamic(this, &AMyTriggerBox::OnOverlapEnd); } // Called when the game starts or when spawned void AMyTriggerBox::BeginPlay() { Super::BeginPlay(); DrawDebugBox(GetWorld(), GetActorLocation(), GetComponentsBoundingBox().GetExtent(), FColor::Purple, true, -1, 0, 5); } void AMyTriggerBox::OnOverlapBegin(class AActor* OverlappedActor, class AActor* OtherActor) { // check if Actors do not equal nullptr and that if (OtherActor && (OtherActor != this)) { // print to screen using above defined method when actor enters trigger box print("Overlap Begin"); printFString("Overlapped Actor = %s", *OverlappedActor->GetName()); } } void AMyTriggerBox::OnOverlapEnd(class AActor* OverlappedActor, class AActor* OtherActor) { if (OtherActor && (OtherActor != this)) { // print to screen using above defined method when actor leaves trigger box print("Overlap Ended"); printFString("%s has left the Trigger Box", *OtherActor->GetName()); } }

最后,按下播放键,操控玩家在触发器框里进进出出,得到的最终效果图如下所示。 

 

最后

以上就是风中招牌最近收集整理的关于最简单的 UE 4 C++ 教程 —— 触发器框【二十】的全部内容,更多相关最简单的内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部