創建一個可以使用時間的物體
先選擇添加代碼到項目,創建繼承自Actor的CountDown
#pragma once
#include "GameFramework/Actor.h"
#include "CountDown.generated.h"
UCLASS()
class MYTEST_API ACountDown : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACountDown();
//初始設置時間
int32 CountDownTime;
//顯示字體內容
UTextRenderComponent* CountdownText;
//更新時間顯示
void UpdateTimerDisplay();
//時間衰退
void AdvanceTimer();
//當時間結束
void CountdownHasFinished();
//定時器的手柄
FTimerHandle CountdownTimerHandle;
virtual void BeginPlay() override;
};
.cpp文件
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyTest.h"
#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;
//創建字體顯示
CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
CountdownText->SetHorizontalAlignment(EHTA_Center);//設置水平中心對齊
CountdownText->SetWorldSize(150.0f);//設置字體大小
CountdownText->AttachTo(RootComponent);//將該字體附在根節點下
RootComponent = CountdownText;//設置爲根節點
CountDownTime = 3;
}
//設置顯示的內容爲CountDownTime
void ACountDown::UpdateTimerDisplay()
{
CountdownText->SetText(FString::FromInt(FMath::Max(CountDownTime, 0)));
}
void ACountDown::AdvanceTimer()
{
--CountDownTime;
UpdateTimerDisplay();
if (CountDownTime < 1)
{
//當時間小於1,清除定時器手柄
GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
CountdownHasFinished();//計時已經結束
}
}
void ACountDown::CountdownHasFinished()
{
CountdownText->SetText(TEXT("GO"));
}
void ACountDown::BeginPlay()
{
Super::BeginPlay();
//更新顯示
UpdateTimerDisplay();
//設置時間手柄CountdownTimerHandle調用AdvanceTimer
GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountDown::AdvanceTimer, 1.0f, true);
}