【UE4官方案列学习】在UE4使用计时器实现一个倒计时事件(定时生成物体)


UE4 Version: 4.27.0 Visual Studio 2019 16.10.2


在UE4使用计时器实现一个倒计时事件

.h文件定义

1#pragma once 2#include "CoreMinimal.h" 3#include "GameFramework/Actor.h" 4#include "Components/TextRenderComponent.h" 5#include "Countdown.generated.h" 6 7UCLASS() 8class CLASSSIMPES_API ACountdown : public AActor 9{ 10 GENERATED_BODY() 11 12public: 13 // Sets default values for this actor's properties 14 ACountdown(); 15 16protected: 17 // Called when the game starts or when spawned 18 virtual void BeginPlay() override; 19 20public: 21 // Called every frame 22 virtual void Tick(float DeltaTime) override; 23 24 UPROPERTY(EditAnywhere) 25 int32 CountdownTime; 26 UTextRenderComponent* CountdownText; 27 28 void UpdateTimerDisplay();//更新显示 29 void AdvanceTimer(); 30 void CountdownHasFinished();//时间结束时的特殊动作 31 32 FTimerHandle CountdownTimerHandle;//句柄 33};

类定义详解

int32 CountdownTime//定义了一个int32类型的倒计时时间

  • int32为虚幻整数类型,虚幻整数类型分为有符号和无符号,分别为intunit,有8,16,32,64四种。

UTextRenderComponent* CountdownText//定义了一个UTextRenderComponent类的可显示文本组件

  • 在头文件中只是先声明,在cpp里还要用CreateDefaultSuobject创建完整的组件

void UpdateTimerDisplay()//创建了一个更新器,用于更新显示字体

void AdvanceTimer()//

void CountdownHasFinished()//用于结束时执行的特殊动作

FTimerHandle CountdownTimerHandle//定义了一个句柄

  • 句柄:用于识别的唯一ID

.cpp文件

1#include "Countdown.h" 2 3// Sets default values 4ACountdown::ACountdown()//类当中的参数初始化 5{ 6 // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. 7 PrimaryActorTick.bCanEverTick = false; 8 //将此Actor设为逐帧调用Tick(),关闭提高性能 9 10 CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));//添加TEXTRENDER组件 11 CountdownText->SetHorizontalAlignment(EHTA_Center);//设置对齐方式 12 CountdownText->SetWorldSize(150.0f);//设置大小 13 RootComponent = CountdownText;//设置这个组件为根组件 14 CountdownTime = 3;//初始化倒计时 15 16 17 18 19 20} 21 22// Called when the game starts or when spawned 23void ACountdown::BeginPlay()//开始时执行 24{ 25 Super::BeginPlay(); 26 27 UpdateTimerDisplay();// 28 GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true); 29} 30 31// Called every frame 32void ACountdown::Tick(float DeltaTime) 33{ 34 Super::Tick(DeltaTime); 35 36} 37 38void ACountdown::UpdateTimerDisplay() 39{ 40 CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0))); 41 //Max:比较两数较大者,并返回较大数 42 //FromInt:强制类型转换,将int类型强制转化为string类型 43 //settext:设置字体组件里的值 44} 45 46void ACountdown::AdvanceTimer() 47{ 48 --CountdownTime;//减去倒数时间1 49 50 UpdateTimerDisplay();//更新显示 51 52 if (CountdownTime < 1) 53 { 54 //倒数完成,停止运行定时器 55 GetWorldTimerManager().ClearTimer(CountdownTimerHandle); 56 CountdownHasFinished(); 57 } 58} 59 60void ACountdown::CountdownHasFinished() 61{ 62 //改为特殊读出 63 CountdownText->SetText(TEXT("GO")); 64}

.cpp文件详解

Countdown()构造函数

  • CreateDefaultSubobject初始化
  • SetHorizontalAlignment(EHTA_Center);设置对齐方式:对齐方式还有EHTA_Left,EHTA_Right.
  • SetWorldSize(150.0f);设置大小,接受一个浮点值
  • CountTime初始化倒计时时间

UpdateTimerDisplay()

SetText(FString::FromInt(FMath::Max(CountdownTime, 0)))

  • //Max:比较两数较大者,并返回较大数
  • //FromInt:强制类型转换,将int类型强制转化为string类型
  • //settext:设置字体组件里的值

AdvanceTimer()//计时器,实行倒计时事件

定时器函数(Timer)

template<class UserClass> void SetTimer ( FTimerHandle & InOutHandle, UserClass * InObj, typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod, float InRate, bool InbLoop, float InFirstDelay )

  • InOutHandle 是我们要设置的计时器,即句柄
  • UserClass 调用timer函数的object(this)
  • InTimerMethod timer会重复执行的方法(&ACountdown::AdvanceTimer)
  • InRate 调用频率,例如填0.5f的话,那么InTimerMethod就会每隔0.5f调用一次
  • InbLoop 是否循环,如果是false的那么方法只会执行一次
  • InFirstDelay 第一次调用之前延时的时间,例如5.0f,那么过5秒后,方法才执行,然后才根据InRate 正常调用。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593