UE4 C++ Timeline 时间轴中
虚幻4时间轴支持许多类型的曲线,如浮点、向量、颜色等,也支持许多不同的事件,如“更新时”、“结束时”、“中断时”等。其使用方法大同小异,下面以定义一个含float曲线的时间轴为例,解释其用法。
一、首先在头文件声明需要使用的变量
//定义时间轴
FTimeline MyTimeline;
//定义float曲线(根据需求声明)
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly)
UCurveFloat* MyFloatCurve;
//定义时间轴float曲线更新事件
FOnTimelineFloatStatic OnMyTimelineTickCallBack;
//定义时间轴播放完毕事件
FOnTimelineEventStatic OnMyTimelineFinishedCallBack;
二、其次声明相关回调函数,如每帧执行、结束时执行等(等价于蓝图中时间轴右端的流程箭头)
请注意,由于C++原生不支持反射,因此需要使用UFUNCTION标记需要回调的函数,当没有使用UFUNCTION标记时,会编译错误。
UFUNCTION()
void CrouchTimelineTickCallBack();
UFUNCTION()
void CrouchTimelineFinishedCallBack();
void MyClass::MyTimelineTickCallBack()
{
//此函数在时间轴更新时(每帧)调用
}
UFUNCTION()
void MyClass::MyTimelineFinishedCallBack()
{
//此函数在时间轴结束时调用
}
三、初始化时间轴(建议在BeginPlay内执行)
void MyClass::BeginPlay()
{
//注册float曲线更新事件,float曲线更新时执行名为MyTimelineTickCallBack的函数
OnMyTimelineTickCallBack.BindUFunction(this, TEXT("MyTimelineTickCallBack"));
MyTimeline.AddInterpFloat(MyFloatCurve, OnMyTimelineTickCallBack);
//注册时间轴播放结束事件,在播放完毕时执行名为MyTimelineFinishedCallBack的函数
OnMyTimelineFinishedCallBack.BindUFunction(this, TEXT("MyTimelineFinishedCallBack"));
MyTimeline.SetTimelineFinishedFunc(OnMyTimelineFinishedCallBack);
}
四、Tick()内设置时间轴的Tick值
void MyClass::Tick(float DeltaSeconds)
{
MyTimeline.TickTimeline(DeltaSeconds);
}
五、大功告成,如何使用呢?
MyTimeline.操作名()
如“播放”:MyTimeline.Play();
”逆向播放“:MyTimeline.Reverse();
“从头播放”:MyTimeline.PlayFromStart();
“从末尾逆向播放”:MyTimeline.ReverseFromEnd();
“停止播放”:MyTimeline.Stop();
不要忘记在编辑器内设置好需要的曲线。
六、使用方法演示——使用时间轴修改胶囊体组件半高。
蓝图写法:
C++写法:
FTimeline CrouchTimeline;
FOnTimelineFloatStatic OnCrouchTimelineTickCallBack;
FOnTimelineEventStatic OnCrouchTimelineFinishedCallBack;
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly)
UCurveFloat* CrouchCurve;
UFUNCTION()
void CrouchTimelineTickCallBack();
UFUNCTION()
void CrouchTimelineFinishedCallBack();
UFUNCTION(BlueprintCallable)
void StartCrouch();
UFUNCTION(BlueprintCallable)
void StopCrouch();
void MyClass::CrouchTimelineTickCallBack()
{
float FloatCurveVal = CrouchCurve->GetFloatValue(CrouchTimeline.GetPlaybackPosition());
float LerpRet = UKismetMathLibrary::Lerp(0.0f,-40.0f,FloatCurveVal);
float Height = 95.0f + LerpRet;
GetCapsuleComponent()->SetCapsuleHalfHeight(Height,true);
}
void MyClass::CrouchTimelineFinishedCallBack()
{
//修改完毕!
};
void MyClass::StartCrouch()
{
if(CrouchCurve)
{
CrouchTimeline.Play();
}
}
void MyClass::StopCrouch()
{
if(CrouchCurve)
{
CrouchTimeline.Reverse();
}
