캐릭터 달리기 특수효과

GwakItect·2025년 7월 31일

Shooter Game Project

목록 보기
4/9
post-thumbnail

FOV (Field of View)


플레이어가 실제로 보게되는 화면의 각도를 의미. 즉, 카메라의 시야각이다.

  • FOV가 높다 = 보이는 각도가 넓다 = 양 옆으로 보이는 것이 넓어짐
  • FOV가 낮다 = 보이는 각도가 좁다 = 양 옆이 좁아지며, 멀리 있는 물체가 가까워보임

이를 통하여 총기의 줌 효과를 구현할 수 있으나 이번 작업에선 달리기를 할 때 Timeline을 통해 FOV를 높여서 극적인 효과를 연출한다.




Float Curve 파일



타임라인 사용을 위한 Float Curve 를 생성해 이름을 C_SprintCurve 로 설정한다. 이 게임에서 Character 의 카메라 기본 FOV 값은 100 이므로 시작 지점(0) 에서 값을 100 으로 주고 목표값(0.3) 에서 120 의 값을 준다.

  • 0.3 초 동안 100 ~ 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 값이 커지면서 화면 시야각이 넓어지는 효과


달리기 FOV 변경 로직 (Timeline 사용)

  1. BeginPlay: SprintFOVCurve 에셋과 UpdateSprintFOV 함수를 SprintFOVTimeline에 바인딩
  2. StartSprint: SprintFOVTimeline->PlayFromStart()를 호출하여 타임라인을 처음부터 재생
  3. StopSprint: SprintFOVTimeline->Reverse()를 호출하여 타임라인을 역재생
  4. UpdateSprintFOV(float Value): 타임라인이 재생되는 동안 매 프레임 커브 에셋의 Value 값을 받아 FirstPersonCameraFieldOfView를 직접 업데이트

0개의 댓글