
플레이어가 실제로 보게되는 화면의 각도를 의미. 즉, 카메라의 시야각이다.
- FOV가 높다 = 보이는 각도가 넓다 = 양 옆으로 보이는 것이 넓어짐
- FOV가 낮다 = 보이는 각도가 좁다 = 양 옆이 좁아지며, 멀리 있는 물체가 가까워보임
이를 통하여 총기의 줌 효과를 구현할 수 있으나 이번 작업에선 달리기를 할 때 Timeline을 통해 FOV를 높여서 극적인 효과를 연출한다.

타임라인 사용을 위한 Float Curve 를 생성해 이름을 C_SprintCurve 로 설정한다. 이 게임에서 Character 의 카메라 기본 FOV 값은 100 이므로 시작 지점(0) 에서 값을 100 으로 주고 목표값(0.3) 에서 120 의 값을 준다.
헤더 파일
UFUNCTION() // <- 리플렉션 빼면 작동 X
void UpdateSprintFOV(float Value);
UFUNCTION(BlueprintCallable, Category = "Sprinting")
void StartSprintFOV();
UFUNCTION(BlueprintCallable, Category = "Sprinting")
void StopSprintFOV();
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Movement")
TObjectPtr<UCurveFloat> SprintFOVCurve;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Movement")
TObjectPtr<UTimelineComponent> SprintFOVTimeline;
소스 파일 - 생성자
SprintFOVTimeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("SprintFOVTimeline"));
소스 파일 - BeginPlay 함수
if (SprintFOVCurve && SprintFOVTimeline)
{
FOnTimelineFloat FOVInterpFunction;
FOVInterpFunction.BindUFunction(this, FName("UpdateSprintFOV"));
SprintFOVTimeline->AddInterpFloat(SprintFOVCurve, FOVInterpFunction, FName("FOV"));
}
소스 파일 - 추가 함수
void AMyCharacter::UpdateSprintFOV(float Value)
{
if (FirstPersonCamera)
{
FirstPersonCamera->FieldOfView = Value;
}
}
void AMyCharacter::StartSprintFOV()
{
if (SprintFOVTimeline)
{
SprintFOVTimeline->PlayFromStart();
}
}
void AMyCharacter::StopSprintFOV()
{
if (SprintFOVTimeline)
{
SprintFOVTimeline->Reverse();
}
}
소스 파일 - Sprint 관련 바인딩 함수
void AMyCharacter::StartSprint()
{
if (LastInputVector.X <= 0.f)
{
return;
}
bWantsToSprint = true;
if (CurrentState == ECharacterState::Jumping || bIsZoomed || bIsCrouching)
{
return;
}
if (GetCharacterMovement())
{
if (GetCharacterMovement()->IsFalling())
{
return;
}
SetCharacterState(ECharacterState::Sprinting);
SprintFOVTimeline->PlayFromStart();
}
}
void AMyCharacter::StopSprint()
{
bWantsToSprint = false;
if (CurrentState != ECharacterState::Sprinting)
{
return;
}
SprintFOVTimeline->Reverse();
UpdateGroundState();
}
StartSprint: PlayFromStart 로 타임라인 함수 호출
StopSprint: Reverse 로 타임라인 함수 호출

ECharacter::Sprinting 상태일 때 FOV 값이 커지면서 화면 시야각이 넓어지는 효과
BeginPlay: SprintFOVCurve 에셋과 UpdateSprintFOV 함수를 SprintFOVTimeline에 바인딩StartSprint: SprintFOVTimeline->PlayFromStart()를 호출하여 타임라인을 처음부터 재생StopSprint: SprintFOVTimeline->Reverse()를 호출하여 타임라인을 역재생UpdateSprintFOV(float Value): 타임라인이 재생되는 동안 매 프레임 커브 에셋의 Value 값을 받아 FirstPersonCamera의 FieldOfView를 직접 업데이트