创建时间轴
可按照以下步骤在 Actor 蓝图中创建你自己的 时间轴组件(Timeline Component)。
-
从 内容浏览器 中选择 添加/导入(Add/Import) > 蓝图类(Blueprint Class),创建名为 BP_TimelineActor 的新Actor蓝图。将显示 选取父类(Pick Parent Class) 对话框。
-
在类默认设置中,右键点击 事件(Event) 图表(Graph),从 蓝图上下文菜单(Blueprint Context Menu) 中选择 添加时间轴(Add Timeline)。
新的时间轴节点将添加到事件图表中。

将时间轴添加到蓝图类之后,它将列示在 我的蓝图(My Blueprint) 选项卡中。

时间轴变量
创建时间轴后,你会发现它变成了 我的蓝图(My Blueprint) 选项卡中的可用变量。这是为了实现对时间轴组件的引用,在必须使用时间轴节点的时候,此法尤为有用。这些节点的存在是为了能够访问某时间轴的特定功能,例如其播放速率。

本例中使用Get Timeline 0变量查询该时间轴的当前播放速率(Play Rate)值。

此类节点有很多,可用于查询各个值和控制时间轴节点的行为。如需可用Timeline节点的完整列表及其功能详情,请参阅时间轴节点。
创建时间轴事件
时间轴事件为时间轴组件提供处理自定义事件或函数的功能。按照下列示例步骤操作,了解如何实现你自己的事件。
-
打开 BP_TimelineActor,然后选中并拖移 开始播放(Begin play) 的 执行引脚,将其连接到你的时间轴组件的 播放(Play) 执行引脚。
-
下一步,选择并拖移 完成(Finished) 执行引脚,使用字符串"Timeline Finished"创建新的 打印字符串节点(print string node)。
-
编译(Compile) 并 保存(Save),然后按 PIE。
在5秒的默认时间轴 长度 之后,"时间轴结束(Timeline Finished)"字样将显示在视口左上角。
重命名时间轴
若在蓝图中使用多个时间轴,务必相应地命名各个时间轴。所有时间轴默认命名为"Timeline_X",末尾是序列号。要重命名某个时间轴,你可以在"图表(Graph)"选项卡或 我的蓝图(My Blueprint) 选项卡中 右键点击 该时间轴,然后选择 重命名(Rename)。


打开时间轴编辑器
有待执行的任务时才需要创建时间轴。欲详细了解如何编辑时间轴,请参阅时间轴编辑页面。
创建时间轴
可按照以下步骤在 Actor 类中创建并实例化你自己的 时间轴组件(Timeline Component) 。
-
找到你的 C++ 类文件夹 ,并点击 添加(Add+) 。从下拉菜单中选择 新建C++类(New C++ Class) 。
-
选择 Actor 类作为 父类(Parent Class) 。
点击查看大图。
-
将创建的Actor类命名为 Timeline Actor 。
点击查看大图。
-
找到
TimelineActor.h
文件并包含以下TimelineComponent
类库。TimelineActor.h
#include "Components/TimelineComponent.h"
-
在TimelineActor类定义中实现以下类声明:
TimelineActor.h
protected: UPROPERTY(EditAnywhere, BlueprintReadWrite) UTimelineComponent* ExampleTimelineComp;
在此代码示例中,你使用属性说明符标签 EditAnywhere 和 BlueprintReadWrite 。
-
找到
TimelineActor.cpp
文件,然后将以下代码添加到你的TimelineActor构造函数ATimelineActor::ATimelineActor()
TimelineActor.cpp
ATimelineActor::ATimelineActor() { // 将此Actor设置为每帧调用更新函数()。 如果不需要此特性,可以关闭以提升性能。 PrimaryActorTick.bCanEverTick = true; ExampleTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("TimelineComponent")); }
-
编译(Compile) 你的代码。
-
找到 C++类文件夹 ,右键点击你的 TimelineActor ,并基于你的TimelineActor类创建蓝图。将其命名为 Bp_TimelineActor 。
-
创建TimelineActor蓝图后,你可以查看 类默认值(Class Defaults) 。 从 组件(Components) 选项卡中,应可看到你的时间轴组件示例。
阶段性代码
TimelineActor.h
#pragma once
#include "Components/TimelineComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TimelineActor.generated.h"
UCLASS()
class CPPTIMELINE_API ATimelineActor : public AActor
{
GENERATED_BODY()
public:
// 为此Actor的属性设置默认值
ATimelineActor();
protected:
// 当游戏开始或重生(Spawn)时调用
virtual void BeginPlay() override;
public:
// 每一帧都调用
virtual void Tick(float DeltaTime) override;
protected:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTimelineComponent* ExampleTimelineComp;
};
TimelineActor.cpp
#include "TimelineActor.h"
// 设置默认值
ATimelineActor::ATimelineActor()
{
// 将此Actor设置为每帧调用更新函数()。 如果不需要此特性,可以关闭以提升性能。
PrimaryActorTick.bCanEverTick = true;
ExampleTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("TimelineComponent"));
}
// 当游戏开始或重生(Spawn)时调用
void ATimelineActor::BeginPlay()
{
Super::BeginPlay();
}
// 每一帧都调用
void ATimelineActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
时间轴变量
当你在C++中使用 UProperty说明符
创建时间轴组件后,该组件会成为 组件(Components) 选项卡中的可用变量。对于想要继续通过蓝图脚本对时间轴组件进行迭代的设计人员来说,
这个变量很有用。

上图显示了使用原生C++时间轴变量获取蓝图中时间轴的当前播放速率(Current Play Rate)值。
如需可用蓝图时间轴节点的完整列表及其功能详情,请参阅时间轴节点页面。
创建FTimeLineEvent
时间轴事件( FOnTimelineEvent
)是动态委托,可为时间轴组件提供处理事件的能力。
按以下步骤创建你自己的 FTimeLineEvent
,并将其绑定到你的时间轴组件的已完成功能。
-
找到
TimelineActor.h
文件并在 类定义 中声明以下代码:TimelineActor.h
protected: //委托将处理已完成事件的函数的签名。 FOnTimelineEvent TimelineFinishedEvent; UFUNCTION() void TimelineFinishedFunction();
-
找到
TimelineActor.cpp
,并实现以下代码:TimelineActor.cpp
void ATimelineActor::TimelineFinishedFunction() { UE_LOG(LogTemp, Warning, TEXT("Finished Event Called.")); }
-
找到
ATimelineActor::BeginPlay()
方法,并实现以下代码:TimelineActor.cpp
// 当游戏开始或重生(Spawn)时调用 void ATimelineActor::BeginPlay() { Super::BeginPlay(); TimelineFinishedEvent.BindUFunction(this, FName("TimelineFinishedFunction")); ExampleTimelineComp->SetTimelineFinishedFunc(TimelineFinishedEvent); ExampleTimelineComp->PlayFromStart(); }
现在你已成功将
TimelineFinished
事件绑定到自定义TimelineFinished
函数。 -
编译你的代码。打开 编辑器(Editor) 并找到 内容浏览器(Content Browser) 。找到你的 BP_TimelineActor 并拖移到 关卡(Level) 中。
-
按 播放(Play) 按钮。在 输出日志(Output Log) 窗口中应该可以看到以下消息:
已完成代码
TimelineActor.h
#pragma once
#include "Components/TimelineComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TimelineActor.generated.h"
UCLASS()
class CPPTIMELINE_API ATimelineActor : public AActor
{
GENERATED_BODY()
public:
// 为此Actor的属性设置默认值
ATimelineActor();
protected:
// 当游戏开始或重生(Spawn)时调用
virtual void BeginPlay() override;
public:
// 每一帧都调用
virtual void Tick(float DeltaTime) override;
protected:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTimelineComponent* ExampleTimelineComp;
protected:
//委托将处理已完成事件的函数的签名。
FOnTimelineEvent TimelineFinishedEvent;
UFUNCTION()
void TimelineFinishedFunction();
};
TimelineActor.cpp
#include "TimelineActor.h"
// 设置默认值
ATimelineActor::ATimelineActor()
{
// 将此Actor设置为每帧调用更新函数()。 如果不需要此特性,可以关闭以提升性能。
PrimaryActorTick.bCanEverTick = true;
ExampleTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("TimelineComponent"));
}
// 当游戏开始或重生(Spawn)时调用
void ATimelineActor::BeginPlay()
{
Super::BeginPlay();
TimelineFinishedEvent.BindUFunction(this, FName("TimelineFinishedFunction"));
ExampleTimelineComp->SetTimelineFinishedFunc(TimelineFinishedEvent);
ExampleTimelineComp->PlayFromStart();
}
// 每一帧都调用
void ATimelineActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ATimelineActor::TimelineFinishedFunction()
{
UE_LOG(LogTemp, Warning, TEXT("Finished Event Called."));
}