1.添加一个actor类
2.首先创建在游戏中显示的简单倒数定时器。在Countdown.h中,在类定义的末尾声明计时的变量和方法。
- int32 CountdownTime;
- //可渲染文本组件
- UTextRenderComponent* CountdownText;
- void UpdateTimerDisplay();
记得引入相关头文件
#include "Components/TextRenderComponent.h"
3.在源文件的构造函数中,初始化可渲染的文本 组件,并将倒数时间初始化为3秒。
- //将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
- PrimaryActorTick.bCanEverTick = false;
- CountdownText = CreateDefaultSubobject
(TEXT("CountdownNumber")); - //设置对齐方式
- CountdownText->SetHorizontalAlignment(EHTA_Center);
- //设置字体大小
- CountdownText->SetWorldSize(150.0f);
- //设置根组件
- RootComponent = CountdownText;
- //初始化倒计时
- CountdownTime = 3;
4.ACountdown::UpdateTimerDisplay
应更新文本显示,以显示剩余时间。时间结束时,则显示为零
- void ACountdown::UpdateTimerDisplay()
- {
- CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
- }
5.在 Countdown.h
的类定义中添加倒数函数和控制其所需的定时器句柄。添加完成后,再添加一个函数,以便在倒数结束时执行特别操作:
- void AdvanceTimer();
-
- void CountdownHasFinished();
-
- FTimerHandle CountdownTimerHandle;
6.初始化 ACountdown::BeginPlay
中显示的文本,并设置逐秒前进和更新倒数的定时器
- UpdateTimerDisplay();
- //这是一个程序内部的计时器,用来调用其他事件的
- //CountdownTimerHandle:句柄
- //this:本对象调用计时器
- //&ACountdown::AdvanceTimer:函数指针调用函数,表示唤醒这个事件
- //1.0f:每一秒唤醒一次
- //true:循环执行
- GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);
7.编写 ACountdown::AdvanceTimer
和 ACountdown::CountdownHasFinished
的主体
- void ACountdown::AdvanceTimer()
- {
- --CountdownTime;
- UpdateTimerDisplay();
- if (CountdownTime < 1)
- {
- //倒数完成,停止运行定时器。
- GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
- CountdownHasFinished();
- }
- }
-
- void ACountdown::CountdownHasFinished()
- {
- //改为特殊读出
- CountdownText->SetText(TEXT("GO!"));
- }
=========================
现在改进一下,加入反射
1.倒数定时器目前被硬编码为使用3秒的值。如可在编辑器中将倒数时间设为想要的任何值,此操作将十分有用,也较易完成。在 Visual Studio 中,可打开 Countdown.h。UPROPERTY
支持改变虚幻引擎使用变量方式的参数。需将变量设为可编辑,因此可添加 EditAnywhere
参数
- UPROPERTY(EditAnywhere)
- int CountdownTime;
2.编译,然后点击场景中的计时器,可以设置这个变量了
===================================
1.除改变定时器的值外,同时也使非程序员开发者可改变定时器启动时触发的操作。通过将这个函数变成 UFUNCTION
,将其向虚幻引擎公开。
2.为了让非程序员调用C++函数,并用 蓝图 对其进行覆盖,需对 Countdown.h
进行以下修改。
- UFUNCTION(BlueprintNativeEvent)
- void CountdownHasFinished();
- virtual void CountdownHasFinished_Implementation();
BlueprintCallable
函数以C++编写,可从 蓝图图表 中调用,但只能通过编辑C++代码进行修改或重写。
在C++ header (.h)文件中设置
BlueprintImplementableEvent
函数,但是函数的主体则在蓝图图表中完成编写,而非C++中。创建此类通常是为了使非程序员能够对无预期默认动作或标准行为的特殊情况创建自定义反应。
BlueprintNativeEvent
函数与BlueprintCallable
和BlueprintImplementableEvent
函数的组合类似。其具备用C++中编程的默认行为,但此类行为可通过在蓝图图表中覆盖进行补充或替换。对此类代码编程时,C++代码固定使用命名末尾添加了_Implementation的虚拟函数 (土话说:即当那啥,又立牌坊,两不误)
3.然后,在Countdown.cpp中,需对以下行进行修改:
- //void ACountdown::CountdownHasFinished()
- //注释掉CountdownHasFinished()
- //用下面这个
- void ACountdown::CountdownHasFinished_Implementation()
4.然后进行定义
- void ACountdown::CountdownHasFinished_Implementation()
- {
- //改为特殊读出
- CountdownText->SetText(TEXT("GO!"));
- }
==========================================
使用蓝图扩展和覆盖C++
1. 得到一个蓝图
2.编写蓝图
3.测试失败,倒数被设为结束时显示GO!,而非0。由于已使用 蓝图 可视化脚本完全取代了C++功能,因此不会发生此情况。此结果并非理想结果。
4.通过右键点击 Countdown Has Finished 节点,并在快捷菜单中选择 添加对父函数的调用(Add call to parent function) 来完成。
测试成功