메시 컴퍼넌트에 뽀잉~ 하는 효과를 주는 코드.
커브를 따라 스케일이 변화하도록 작성하였다.
// .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);
}