UE5 C++ 使用TimeLine时间轴实现开关门

一.添加门头文件 和 声明

cpp 复制代码
#include "Components/TimelineComponent.h"
#include"Components/BoxComponent.h"
cpp 复制代码
	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,再设置碰撞大小。

cpp 复制代码
// 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进行代理绑定,将碰撞进行代理绑定。

cpp 复制代码
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°

cpp 复制代码
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,再进行开门动画播放。离开时,倒过来播放

cpp 复制代码
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"));
}

相关推荐
MOONICK9 小时前
QT元数据
开发语言·qt
D e re k ZH9 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
灿飞屋10 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
xiaoye-duck10 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai100711 小时前
【Effective Modern C++】学习第一章
c++
Fruiticecake11 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
总要学点什么11 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
田甲11 小时前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
青少儿编程课堂12 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
严肃小白兔12 小时前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图