UE 学习笔记(三)在 C++ 中使用 Timeline
示例:利用Timeline制作箱子打开动画
思路:参考蓝图中使用 Timeline 的步骤
ps: 主要用来保存自己学习记录以便回顾,和给有一定基础的人看,纯小白可能一脸懵。
首先来回顾一下蓝图中如何使用Timeline
- 创建Timeline节点
- 双击进入,点击Track —— Add Float Track
- 设置关键帧
- 设置曲线,横轴是Time,纵轴是Value,例如示例我想在1s内让箱子盖打开110°,曲线设置如下。(在key处右键点击auto,即可设置曲线平滑)
- 注意,默认Timeline长度为5,即箱子1s钟后打开后,还有4s的timeline在运行,所以我们要将Timeline的长度设置为最后一帧。
- 至此就在蓝图中添加设置好了Timeline
在 C++ 中使用Timeline
C++中可以使用类 FTimeline 来实现。也可以在C++中给Actor挂在组件UTimelineComponent。
只展示与Timeline相关的部分代码!
Chest.h
public:
FTimeline MyTimeline; // 声明FTimeline对象
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UCurveFloat* Curver; // 声明曲线对象 (**)
public:
UFUNCTION()
void OnTimelineTick(float Output); // Timeline 更新时调用
UFUNCTION()
void OnTimelineEndEvent(float Output); // Timeline 完成最后一帧后调用
注意上述代码的注释 (**) 处,这一步就是要在 Chest 的蓝图中,添加一个曲线,曲线用处呢就是 蓝图设置Timeline的步骤4,就是告诉Timeline在一个时间点,其值为多少
-
创建 Curve 蓝图过程
- 内容浏览器中,右键选择
-
设置步骤类似于蓝图的Timeline节点,设置曲线类似
Curve蓝图创建好以后,继续写Chest的实现部分
Chest.cpp
void AChest::BeginPlay()
{
Super::BeginPlay();
if (Curver) // 判断 曲线对象 是否存在
{
/**
就像在蓝图中创建Timeline曲线一样,我们点击了 add Float Track, 所以我们曲线类型为float,所以我们使用float的曲线更新 delegate
FOnTimelineFloat 声明一个对象 OnTimelineFloatEvent
Timeline结束最后一帧后的事件,我们使用 delegate:FOnTimelineEvent 声明对象 OnTimelineFinishedEvent
**/
FOnTimelineFloat OnTimelineFloatEvent;
FOnTimelineEvent OnTimelineFinishedEvent;
// 两个 delegates 分别 绑定要执行的函数,参数 this 指代在本对象中, TEXT("") 指的是 函数名
OnTimelineFloatEvent.BindUFunction(this, TEXT("OnTimelineTick"));
OnTimelineFinishedEvent.BindUFunction(this, TEXT("OnTimelineEndEvent"));
// 这一步暂时不知道怎么解释,就是Timeline添加曲线,和开始时所执行的函数
MyTimeline.AddInterpFloat(Curver, OnTimelineFloatEvent);
// 如同蓝图设置Timeline一样,设置Timeline的长度为最后一帧
MyTimeline.SetTimelineLength(ETimelineLengthMode::TL_LastKeyFrame);
// 设置Timeline结束后执行的函数
MyTimeline.SetTimelineFinishedFunc(OnTimelineFinishedEvent);
}
}
void AChest::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
/*
注意:这里就是FTimeline 和 UTimelineComoponent 在使用上的一个区别,FTimeline需要在Tick中设置TickTimeline为DeltaTime,否则运行不会有效果
而 UTimelineComponent 在其本身 TickComponent() 中,调用了 TickTimeline,所以无需这一步。
*/
MyTimeline.TickTimeline(DeltaTime);
}
void AChest::OnTimelineTick(float Output)
{
// ...... do something on Timeline update
}
void AChest::OnTimelineEndEvent()
{
// ..... do something on Timeline Finished
}
ps. FTimeline 和 UTimelineComponent 还有一个在使用上需要注意的点就是
// 如果使用 UTimelineComponent 则需要在添加Timeline的Actor的构造函数中创建该Component
// .h:
UTimelineComponent* MyTimeline;
// .cpp:
MyTimeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("Timeline"));
最后:在Chest 这个 Actor 的蓝图面板的默认设置里,要选择你之前创建好的曲线蓝图