[UE5/C++] Timeline + Curve

지우야·2024년 5월 21일
0

팜라이프

목록 보기
1/2

⭐ 코드 설명

메시 컴퍼넌트에 뽀잉~ 하는 효과를 주는 코드.
커브를 따라 스케일이 변화하도록 작성하였다.

⭐ 코드

// .h
#include "Components/TimelineComponent.h"

UCLASS()
class VICTROYSHIP_API APlantActor : public AActor
{
	GENERATED_BODY()

protected:
	virtual void BeginPlay() override;
    
public:	
	virtual void Tick(float DeltaTime) override;

	UFUNCTION()
	void StartScaling();

	UFUNCTION()
	void HandleProgress(float Value);

	UFUNCTION()
	void OnTimelineFinished();

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Timeline")
	UCurveFloat* FloatCurve; // 그래프

	FTimeline MyTimeline;

	FVector InitialScale = FVector(1.0f, 1.0f, 1.0f);
	FVector MaxScale = FVector(2.0f, 2.0f, 2.0f);

	UPROPERTY()
	UStaticMesh* NewMesh;
	bool isChanged = true;

	void SetupTimeline();
}
// .cpp
void APlantActor::BeginPlay()
{
	Super::BeginPlay();

	StartScaling(); // 실행
}

void APlantActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	MyTimeline.TickTimeline(DeltaTime);
}

void APlantActor::StartScaling()
{
	MeshComponent->SetWorldScale3D(InitialScale);

	if (FloatCurve)
	{
		SetupTimeline();
		MyTimeline.PlayFromStart();
	}
}

void APlantActor::HandleProgress(float Value)
{
	// 타임라인 진행 코드
	FVector NewScale = FMath::Lerp(InitialScale, MaxScale, Value);

	// 일정 value가 지나면 메시를 변경할 것임
	if (Value >= 0.85f && isChanged)
	{
		if (NewMesh)
		{
			MeshComponent->SetStaticMesh(NewMesh);
			isChanged = false;
		}
	}

	MeshComponent->SetWorldScale3D(NewScale);
}

void APlantActor::OnTimelineFinished()
{
	// 타임라인 종료 시에 실행
	NewMesh = nullptr;
	isChanged = true;
}

void APlantActor::SetupTimeline()
{
	// 타임라인 세팅
	FOnTimelineFloat ProgressFunction;
	ProgressFunction.BindUFunction(this, FName("HandleProgress"));

	FOnTimelineEvent TimelineFinished;
	TimelineFinished.BindUFunction(this, FName("OnTimelineFinished"));
	MyTimeline.SetTimelineFinishedFunc(TimelineFinished);

	MyTimeline.AddInterpFloat(FloatCurve, ProgressFunction);
	MyTimeline.SetLooping(false);
	MyTimeline.SetTimelineLengthMode(TL_TimelineLength);
	MyTimeline.SetTimelineLength(0.5f);
}

0개의 댓글