UE C++学习笔记: 时间轴组件Timeline
发布时间
阅读量:
阅读量
变量声明
//包含必要头文件
#include "Components/TimelineComponent.h"
//声明变量:浮点数曲线
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="MyTime")
UCurveFloat* MyCurveFloat;
//声明变量:时间轴组件
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="MyTime")
UTimelineComponent* MyTimelineComponent;
事件声明
声明委托变量、及即将用于绑定的函数
//这个委托格式是Timeline组件中定义的。表示由 Float触发的事
FOnTimelineFloat TimelinePlay_Delegate;
//这个是 Finish结束时触发的事
FOnTimelineEvent TimelineFinished_Delegate;
//声明两个和上面委托入参一致的函数,用于绑定
UFUNCTION()
void FunHua_TimelinePlay(float Output);
UFUNCTION()
void FunHua_TimelineFinished();
函数的实现如下:
void AMyTimelineActor::FunHua_TimelinePlay(float Output)
{
//让Mesh组件随着float输出0~1混合的位置进行上下移动
FVector TempVector = FMath::Lerp(FVector(0, 0, 0), FVector(0, 0, 300), Output);
MyStaticMesh->SetRelativeLocation(TempVector);
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red,TEXT("TImeLine开始"));
}
void AMyTimelineActor::FunHua_TimelineFinished()
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red,TEXT("TImeLine结束"));
}
事件绑定
构造函数中创建组件
MyTimelineComponent = CreateDefaultSubobject<UTimelineComponent>(TEXT("MyTimelineComponent"));
BeginPlay中进行时间轴事件的绑定
//对定义的委托变量Play_Delegate绑定函数
TimelinePlay_Delegate.BindUFunction(this,TEXT("FunHua_TimelinePlay"));
//对定义的委托变量Finish_Delegate绑定函数
TimelineFinished_Delegate.BindUFunction(this,TEXT("FunHua_TimelineFinished"));
//添加Float曲线。传参是(Float曲线,Play的委托)
MyTimelineComponent->AddInterpFloat(MyCurveFloat, TimelinePlay_Delegate);
//将定义的委托变量Finish_Delegate设置为时间轴Finish时的事件,传参数是Delegate
MyTimelineComponent->SetTimelineFinishedFunc(TimelineFinished_Delegate);
//设置速率
MyTimelineComponent->SetPlayRate(5.f);
//设置循环
MyTimelineComponent->SetLooping(false);
到这里,事件就算绑完了。
可以通过手动调用时间轴的Play、Reverse函数来调用到定义的两个函数。
MyTimelineComponent->PlayFromStart();
MyTimelineComponent->Reverse();
拓展:由触发盒调用Timeline
.h中增加Box及Overlap委托
//组件声明
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="MyTime")
UBoxComponent* MyBoxCollision;
//定义函数。用于绑定:BeginOverlap
UFUNCTION()
void FunHua_BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep,const FHitResult& SweepResult);
//定义函数。用于绑定:EndOverlap
UFUNCTION()
void FunHua_EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
.cpp中实现函数及绑定到委托
//构造函数
//初始化MyBoxCollison
MyBoxCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxCollision"));
MyBoxCollision->SetupAttachment(RootComponent);
MyBoxCollision->SetBoxExtent(FVector(200, 100, 100));
MyBoxCollision->SetRelativeLocation(FVector(300.f, 0.f, 100.f));
//绑定Overlap触发事件
MyBoxCollision->OnComponentBeginOverlap.AddDynamic(this, &AMyTimelineActor::FunHua_BeginOverlap);
MyBoxCollision->OnComponentEndOverlap.AddDynamic(this, &AMyTimelineActor::FunHua_EndOverlap);
//函数实现
//BeginOverlap
void AMyTimelineActor::FunHua_BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep,const FHitResult& SweepResult)
{
AMyCharacter* TempCharacter = Cast<AMyCharacter>(OtherActor);
if (TempCharacter)
{//调用时间轴的Play
MyTimelineComponent->PlayFromStart();
}
}
//EndOverlap
void AMyTimelineActor::FunHua_EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
AMyCharacter* TempCharacter = Cast<AMyCharacter>(OtherActor);
if (TempCharacter)
{//调用时间轴的Reverse
MyTimelineComponent->Reverse();
}
}
蓝图中操作
需要创建一个Float曲线,并对Timeline上的曲线进行赋值。

全部评论 (0)
还没有任何评论哟~
