参考:
https://docs.unrealengine.com/zh-CN/Programming/Tutorials/VariablesTimersEvents/index.html
上面的代码,直接拷贝,还需要增加头文件才可以。拷贝一下可以编译通过的,记录一下。
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "Components/TextRenderComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Countdown.generated.h"
UCLASS()
class PLUGINS_ME_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();
UFUNCTION(BlueprintNativeEvent)
void CountdownHasFinished();
virtual void CountdownHasFinished_Implementation();
FTimerHandle CountdownTimerHandle;
};
// Fill out your copyright notice in the Description page of Project Settings.
#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 = true;
CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
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(FText::FromString(FString::FromInt(FMath::Max(CountdownTime, 0))));
}
void ACountdown::AdvanceTimer()
{
--CountdownTime;
UpdateTimerDisplay();
if (CountdownTime < 1)
{
//倒数完成,停止运行定时器。
GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
//定时器结束时,执行要执行的特殊操作。
CountdownHasFinished();
}
}
void ACountdown::CountdownHasFinished_Implementation()
{
//改为特殊读出
CountdownText->SetText(FText::FromString("GO!"));
}
代码解读:
UTextRenderComponent* CountdownText; 文本渲染组件
这里应该是蓝图的事件通知
UFUNCTION(BlueprintNativeEvent)
void CountdownHasFinished();
再看初始化的地方:
CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber")); ---》创建渲染组件
CountdownText->SetHorizontalAlignment(EHTA_Center);
CountdownText->SetWorldSize(150.0f); 设置字体大小
RootComponent = CountdownText; 好像每次都是赋值给根组件
CountdownTime = 3;
设置文本的值:
CountdownText->SetText(FText::FromString(FString::FromInt(FMath::Max(CountdownTime, 0))));
设置定时器
GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);
记录一下定时器的操作:
具体代码如下:
步骤一:
FTimerHandle CountdownTimerHandle;
步骤二:
GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);
步骤三:
GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
步骤四:
CountdownHasFinished();
最后在蓝图调用如下图:记得选一下爆破的模式,不然没有效果
截个效果图纪念一下: