
// 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 갱신이 필요하지 않은 경우에도 호출되는 일을 방지해준다.

결과물