一.添加门头文件 和 声明
#include "Components/TimelineComponent.h"
#include"Components/BoxComponent.h"
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyCurve")
UCurveFloat* MyCurveFloat;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyCurve")
UTimelineComponent* MyTimeline;
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyScenceComponent")
USceneComponent* MyScene;
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyScenceComponent")
UStaticMeshComponent* MyDoorMesh;
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyScenceComponent")
UBoxComponent* MyBox;
FOnTimelineFloat TimelineDelegate;
FOnTimelineEvent TimelineFinishedDelegate;
UFUNCTION()
void TimelineStart(float value);
UFUNCTION()
void TimelineFinished();
UFUNCTION()
void BeginOverlapFunction( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UFUNCTION()
void EndOverlapFunction( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
再上篇的基础上,添加了StaticMeshComponent, UBoxComponent。和碰撞的三个函数。
二.添加组件 并进行加载
构造函数中将组件的父子级关系设置好,静态加载Drremesh,再设置碰撞大小。
// Sets default values
AMyTimeLineActor::AMyTimeLineActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
MyTimeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("MyTimeLineComponent"));
MyScene = CreateDefaultSubobject<USceneComponent>(TEXT("MySenceComponet"));
MyBox = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxComponent"));
MyDoorMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMeshComponet"));
static ConstructorHelpers::FObjectFinder<UStaticMesh>TmpStaticMesh(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Architecture/Wall_400x400.Wall_400x400'"));
if (TmpStaticMesh.Succeeded())
{
MyDoorMesh->SetStaticMesh(TmpStaticMesh.Object);
}
//MyScene->SetupAttachment(RootComponent);
RootComponent = MyScene;
MyDoorMesh->SetupAttachment(MyScene);
MyBox->SetupAttachment(MyScene);
MyBox->SetBoxExtent(FVector(200,100,100));
MyBox->SetRelativeLocation(FVector(200,0,0));
}
三.设置TimeLine的参数
将TimeLine进行代理绑定,将碰撞进行代理绑定。
void AMyTimeLineActor::BeginPlay()
{
Super::BeginPlay();
TimelineDelegate.BindUFunction(this,TEXT("TimelineStart")); //dailiyoucanshu
TimelineFinishedDelegate.BindUFunction(this,TEXT("TimelineFinished"));
MyTimeline->AddInterpFloat(MyCurveFloat,TimelineDelegate);
MyTimeline->SetLooping(false);
//MyTimeline->PlayFromStart();
//MyTimeline->Play();
MyTimeline->SetTimelineFinishedFunc(TimelineFinishedDelegate); //
MyBox->OnComponentBeginOverlap.AddDynamic(this, &AMyTimeLineActor::BeginOverlapFunction);
MyBox->OnComponentEndOverlap.AddDynamic(this, &AMyTimeLineActor::EndOverlapFunction);
}
四.在时间轴设置对应逻辑
设置时间轴持续调用的,TimelineStart(float value)。其中value是 对应Time的曲线value。这里持续开门。开到90°
void AMyTimeLineActor::TimelineStart(float value)
{
GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,FString::Printf(TEXT("Timelineplay %f"),value));
float YawRotation = FMath::Lerp(0,90,value);
MyDoorMesh->SetRelativeRotation(FRotator(0,YawRotation,0));
}
void AMyTimeLineActor::TimelineFinished()
{
GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,TEXT("TimelineFinshed"));
}
五.在碰撞设置Timeline的播放
判断是否是MyCharacter,再进行开门动画播放。离开时,倒过来播放
void AMyTimeLineActor::BeginOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
AMyCharacter* TmpCharacter = Cast<AMyCharacter>(OtherActor);
if (TmpCharacter)
{
MyTimeline->PlayFromStart();
}
}
void AMyTimeLineActor::EndOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
AMyCharacter* TmpCharacter = Cast<AMyCharacter>(OtherActor);
if (TmpCharacter)
{
MyTimeline->ReverseFromEnd();
}
//GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("TimelineFinshed"));
}