最简单的 UE 4 C++ 教程 —— 触发器框【二十】

举报
ShaderJoy 发表于 2021/11/18 23:09:17 2021/11/18
【摘要】 原教程是基于 UE 4.18,我是基于 UE 4.25】 英文原地址 接上一节教程,在本教程中,当角色与一个触发器框(Trigger Box)发生重叠时将触发一个事件。 创建一个新的 C++ TriggerBox 子类【它继承自 TriggerBase 类,而它又继承自 Actor 类】并将其命名为 ...

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

英文原地址

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

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

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


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

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


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

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


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

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


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

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


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

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


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

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

 运行起来的框是这样的

下面是最后的 .cpp 文件。


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

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

 

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/119186637

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。