FTimeline을 활용한 위젯 색깔 점멸

김지윤·2025년 2월 25일

UE5_MultiplayerShooter

목록 보기
15/25

// CharacterOverlay.h
	/**
	 * 매치 카운트다운 빨간색으로 점멸
	 */
	UPROPERTY()
	FTimeline MatchCountdownColorTimeline;
	FOnTimelineLinearColor UpdateColorTrack;

	UPROPERTY(EditAnywhere)
	UCurveLinearColor* MatchCountdownColorCurve;
	
	void LerpMatchCountdownTextColor();

	UFUNCTION()
	void UpdateColorLerp(const FLinearColor Color);

protected:
	virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;

타이머 사용을 위한 변수와 함수 선언이다.
저번엔 Float을 썼는데 이번엔 LinearColor다.

이렇게 만들어줬다.

void ABlasterPlayerController::SetHUDMatchCountdown(int32 CountdownTime)
{
	...
    
	if (bHUDValid)
	{
    	...
        
		if (CountdownTime < 30.f)
		{
			BlasterHUD->CharacterOverlay->LerpMatchCountdownTextColor();
		}
	}
}

30초 미만 남은 경우 CharacterOverlay(게임 플레이 중 사용하는 위젯)의 LerpMatchCountdownTextColor를 호출하도록 했다.

void UCharacterOverlay::LerpMatchCountdownTextColor()
{
	// 첫 진입 시(바인딩 상태로 체크) 업데이트 함수 바인딩
	if (!UpdateColorTrack.IsBound() && MatchCountdownColorCurve)
	{
		UpdateColorTrack.BindDynamic(this, &ThisClass::UpdateColorLerp);

		MatchCountdownColorTimeline.AddInterpLinearColor(MatchCountdownColorCurve, UpdateColorTrack);
		MatchCountdownColorTimeline.SetTimelineLengthMode(TL_TimelineLength);
	}

	// 빨간색으로 변경 후 타임라인 시작
	if (MatchCountdownText)
	{
		MatchCountdownText->SetColorAndOpacity(FSlateColor(FLinearColor::Red));
		MatchCountdownColorTimeline.PlayFromStart();
	}
}

이 함수로 진입하게 되면, 첫 진입 시 UpdateColorTrack(Curve다.)에 바인딩을 해줘야 한다.
그럼 함수에 첫 진입이라는 걸 알아야 하는데, bool을 하나 선언하는 것보다 바인딩 여부로 상태를 체크하는 게 좀 더 깔끔할 거란 생각이 들었다.
bool을 선언해도 조건문은 어차피 들어갈 거고, 바인딩하는 함수를 따로 둔다 해도 bool 선언을 피할 순 없기 때문이다.
어쨌든 바인딩 후, 텍스트의 색깔을 빨간색으로 변경한 뒤 Timeline을 시작한다.

void UCharacterOverlay::UpdateColorLerp(const FLinearColor Color)
{
	if (MatchCountdownText)
	{
		MatchCountdownText->SetColorAndOpacity(FSlateColor(Color));
	}
}

바인딩한 함수는 당연히 이렇게 생겼고

void UCharacterOverlay::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
{
	Super::NativeTick(MyGeometry, InDeltaTime);

	// FTimeline은 스스로 갱신하지 못 하므로 Tick에서 호출
	if (UpdateColorTrack.IsBound())
	{
		MatchCountdownColorTimeline.TickTimeline(InDeltaTime);
	}
}

TimelineComponent와는 달리 스스로 갱신되지 않으므로 Tick에서 직접 갱신해줘야 한다.
여기서도 바인딩 여부를 체크해 Timeline 갱신이 필요하지 않은 경우에도 호출되는 일을 방지해준다.

결과물

profile
공부한 거 시간 날 때 작성하는 곳

0개의 댓글