Unreal Engine/C++

[Unreal Engine 4 C++] C++로 Timeline 구현하기

한돌이 2021. 4. 26. 11:39

docs.unrealengine.com/ko/ProgrammingAndScripting/Blueprints/UserGuide/Timelines/index.html

 Timeline node (타임라인 노드)는 블루프린트 내에서 간단한 시간 기반 애니메이션을 빠르게 디자인하고 게임내 이벤트에 따라 재생되도록 할 수 있는 특수 노드입니다. 단순한 값의 변동이나 시간에 걸쳐 서서히 이벤트가 발동되도록 할 수 있다는 점에서 간단한 마티네 시퀀스와 어느정도 비슷합니다. 그래프 탭이나 내 블루프린트 탭에서 타임라인에 더블클릭하는 것으로 블루프린트 에디터에서 바로 편집 가능합니다. 문 열기, 불 켜고 끄기, 기타 한 씬에서 액터에 시간 관련된 조작을 하는 등의 간단한 시네마틱 이외의 작업을 처리하기에 적합하도록 만들어 졌습니다.

 

블루프린트에서의 Timeline 노드

 타임라인을 C++로 구현하기 전에 블루프린트에서 타임라인 노드를 더블클릭하면 커브를 관리하는 탭으로 넘어갑니다.

 

 

 이 커브들은 콘텐츠 브라우저에서 마우스 오른쪽을 누르고 기타에 있는 커브로 만들 수 있습니다.

 

커브 에셋

 

커브 클래스의 종류

 블루프린트의 타임라인 노드와 마찬가지로 커브의 구성합니다.

 이제 C++로 구현합니다.

 

// Fill out your copyright notice in the Description page of Project Settings.

ATest.h

#pragma once

#include "ProjectCE.h"
#include "GameFramework/Actor.h"
#include "Components/TimeLineComponent.h"
#include "ATest.generated.h"

UCLASS()
class PROJECTCE_API ATest : public AActor
{
	GENERATED_BODY()
	
public:
	ATest();

private:
	virtual void BeginPlay() override;

	virtual void Tick(float DeltaTime) override;
    
	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Timeline", Meta = (AllowPrivateAccess = "true"))
	UCurveFloat* Curve1;

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Timeline", Meta = (AllowPrivateAccess = "true"))
	UCurveVector* Curve2;

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Timeline", Meta = (AllowPrivateAccess = "true"))
	UCurveLinearColor* Curve3;

	FTimeline LerpTimeline;

	// LerpTimeline의 길이를 설정하는 변수입니다.
	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Timeline", meta = (AllowPrivateAccess = "true"))
	float LerpTimelineLength;
};

 

// Fill out your copyright notice in the Description page of Project Settings.

Test.cpp

#include "Test.h"

ATest::ATest()
{
	// Tick 함수를 사용합니다.
	PrimaryActorTick.bCanEverTick = true;

	// Timeline 관련 설정
	Curve1 = nullptr;
	Curve2 = nullptr;
	Curve3 = nullptr;
	LerpTimelineLength = 0.4f;
}

void ATest::BeginPlay()
{
	Super::BeginPlay();

	// 모든 커브가 존재할 때 타임라인을 설정합니다.
	if (Curve1 != nullptr && Curve2 != nullptr && Curve3 != nullptr)
	{
		// 지정한 Curve에 사용할 Callback 함수들입니다.
		FOnTimelineFloat Curve1Callback;
		FOnTimelineVector Curve2Callback;
		FOnTimelineLinearColor Curve3Callback;

		// Timeline이 끝났을 때 실행할 Callback 함수들입니다.
		FOnTimelineEvent LerpTimelineFinishedCallback;

		// Callback 함수에 사용할 함수를 바인드합니다.
        // 바인드 하는 함수에는 UFUNCTION 매크로가 적용되어야합니다.
		Curve1Callback.BindUFunction(this, FName("함수이름1"));
		Curve2Callback.BindUFunction(this, FName("함수이름2"));
		Curve3Callback.BindUFunction(this, FName("함수이름3"));
		LerpTimelineFinishedCallback.BindUFunction(this, FName("함수이름4"));
		
        // Timeline에 Curve와 Curve를 사용할 Callback 함수를 추가합니다.
		LerpTimeline.AddInterpFloat(Curve1, Curve1Callback);
       	LerpTimeline.AddInterpFloat(Curve2, Curve2Callback);
		LerpTimeline.AddInterpFloat(Curve3, Curve3Callback);
		
        // Timeline을 끝낼때 호출할 Cabllback 함수를 추가합니다.
		LerpTimeline.SetTimelineFinishedFunc(LerpTimelineFinishedCallback);
        
        // Timeline의 길이를 설정합니다.
		LerpTimeline.SetTimelineLength(LerpTimelineLength);
	}
    
    // Timeline을 실행합니다.
    LerpTimeline.PlayFromStart();
}

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

	// Timeline에 Deltatime을 전달합니다.
	LerpTimeline.TickTimeline(DeltaTime);
}