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

Courtship
• 阅读 930

UE4 Version: 4.27.0 Visual Studio 2019 16.10.2



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

.h文件定义

#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/TextRenderComponent.h"
#include "Countdown.generated.h"

UCLASS()
class CLASSSIMPES_API ACountdown : public AActor
{
    GENERATED_BODY()

public:    
    // Sets default values for this actor's properties
    ACountdown();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:    
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    UPROPERTY(EditAnywhere)
    int32 CountdownTime;
    UTextRenderComponent* CountdownText;

    void UpdateTimerDisplay();//更新显示
    void AdvanceTimer();
    void CountdownHasFinished();//时间结束时的特殊动作

    FTimerHandle CountdownTimerHandle;//句柄
};

类定义详解

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

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

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

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

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

void AdvanceTimer()//

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

FTimerHandle CountdownTimerHandle//定义了一个句柄

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

.cpp文件

#include "Countdown.h"

// Sets default values
ACountdown::ACountdown()//类当中的参数初始化
{
     // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = false;
    //将此Actor设为逐帧调用Tick(),关闭提高性能

    CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));//添加TEXTRENDER组件
    CountdownText->SetHorizontalAlignment(EHTA_Center);//设置对齐方式
    CountdownText->SetWorldSize(150.0f);//设置大小
    RootComponent = CountdownText;//设置这个组件为根组件
    CountdownTime = 3;//初始化倒计时





}

// Called when the game starts or when spawned
void ACountdown::BeginPlay()//开始时执行
{
    Super::BeginPlay();

    UpdateTimerDisplay();//
    GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);    
}

// Called every frame
void ACountdown::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}

void ACountdown::UpdateTimerDisplay()
{
    CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
    //Max:比较两数较大者,并返回较大数
    //FromInt:强制类型转换,将int类型强制转化为string类型
    //settext:设置字体组件里的值
}

void ACountdown::AdvanceTimer()
{
    --CountdownTime;//减去倒数时间1

    UpdateTimerDisplay();//更新显示

    if (CountdownTime < 1)
    {
        //倒数完成,停止运行定时器
        GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
        CountdownHasFinished();
    }
}

void ACountdown::CountdownHasFinished()
{
    //改为特殊读出
    CountdownText->SetText(TEXT("GO"));
}

.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 正常调用。
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
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
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Courtship
Courtship
Lv1
露从今夜白,月是故乡明。
文章
1
粉丝
0
获赞
0
热门文章

暂无数据