Zooming Field of View
Fov값 설정을 통한 줌 기능을 만들어 보겠습니다.
우선 Zoom 상태인지 확인할 bool 변수와 이를 설정해줄 함수를 선언해 줍니다. (SetupPlayerInputComponent 까지 설정)
ShooterCharacter.h
protected:
...
// Set bAiming to true or false with button
void AimingButtonPressed();
void AimingButtonReleased();
...
private:
...
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
class UInputAction *AimingButton;
UPROPERTY(VisibleAnywhrere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = "true"))
bool bAiming;
ShooterCharacter.cpp
void AShooterCharacter::AimingButtonPressed()
{
bAiming = true;
}
void AShooterCharacter::AimingButtonReleased()
{
bAiming = false;
}
void AShooterCharacter::SetupPlayerInputComponent(UInputComponent *PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
check(PlayerInputComponent);
if (UEnhancedInputComponent *EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
{
...
EnhancedInputComponent->BindAction(AimingButton, ETriggerEvent::Triggered, this, &AShooterCharacter::AimingButtonPressed);
EnhancedInputComponent->BindAction(AimingButton, ETriggerEvent::Completed, this, &AShooterCharacter::AimingButtonReleased);
}
}
이후 언리얼에서 Inputs 폴더에 IA_AimingButton을 만들어주고 연결합니다.
Input과 bool을 만들었고, 이제 실제로 시야(FOV)를 바꾸는 코드를 작성합니다.
ShooterCharacter.h
private:
// Default camera field of view value
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = "true"))
float CameraDefaultFOV;
// Field of view value for when zoomed in
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = "true"))
float CameraZoomedFOV;
ShooterCharacter.cpp
// 초기화 구문 수정
// Sets default values
AShooterCharacter::AShooterCharacter() : BaseTrunRate(45.f), BaseLookUpRate(45.f), bAiming(false),
CameraDefaultFOV(0.f), CameraZoomedFOV(60.f)
// BeginPlay() 구문 수정
// Called when the game starts or when spawned
void AShooterCharacter::BeginPlay()
{
Super::BeginPlay();
if (FollowCamera)
{
CameraDefaultFOV = GetFollowCamera()->FieldOfView;
}
...
}
void AShooterCharacter::AimingButtonPressed()
{
bAiming = true;
GetFollowCamera()->SetFieldOfView(CameraZoomedFOV);
}
void AShooterCharacter::AimingButtonReleased()
{
bAiming = false;
GetFollowCamera()->SetFieldOfView(CameraDefaultFOV);
}
- GetFollowCamera()->FieldOfView : 카메라의 시야(Field of View, FOV) 값을 가져오는 코드입니다.
- GetFollowCamera()->SetFieldOfView(CameraZoomedFOV) : 카메라의 시야(Field of View, FOV) 값을 설정하는 데 사용됩니다.
Aiming Zoom Interpolation
역동적인 화면을 위해서 생성자의 CameraZoomedFOV와 CameraBoom->SocketOffset을 변경해 줍니다.
ShooterCharacter.cpp
// Sets default values
AShooterCharacter::AShooterCharacter() : ... CameraZoomedFOV(35.f)
CameraBoom->SocketOffset = FVector{0, 50.f, 70.f};
FOV값의 보간을 위해서 Camera의 CurrentFOV를 저장하고, ZoomSpeed를 저장할 float변수를 두개 만들어줍니다.
(ZoomInterpSpeed는 EditAnywhere, BlueprintReadWrite으로 해주어서 에디터에서 변경이 가능하도록 합니다)
ShooterCharacter.h
private:
// Current field of view this frame
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = "true"))
float CameraCurrentFOV;
// Interp speed for zooming when aiming
UPROPERTY(EditAnywhere, BluePrintReadWrite, Category = Combat, meta = (AllowPrivateAccess = "true"))
float ZoomInterpSpeed;
cpp 에서 멤버초기화를 해주고 CameraCurrentFOV는 시작할때 한번 더 초기화 해줍니다. 그리고 새로운 보간 함수를 작성할 것이므로, 기존에 생성한 AimingButtonPressed, Realeased 함수를 수정해 줍니다.
ShooterCharacter.cpp
AShooterCharacter::AShooterCharacter() : ... , CameraCurrentFOV(0.f), ZoomInterpSpeed(20.f)
// Called when the game starts or when spawned
void AShooterCharacter::BeginPlay()
{
Super::BeginPlay();
if (FollowCamera)
{
CameraDefaultFOV = GetFollowCamera()->FieldOfView;
CameraCurrentFOV = CameraDefaultFOV;
}
...
}
...
void AShooterCharacter::AimingButtonPressed()
{
bAiming = true;
}
void AShooterCharacter::AimingButtonReleased()
{
bAiming = false;
}
ZoomFOV를 위한 함수를 만들어 줍니다.
ShooterCharacter.h
void CameraInterpZoom(float DeltaTime);
ShooterCharacter.cpp
// Called every frame
void AShooterCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
CameraInterpZoom(DeltaTime);
}
void AShooterCharacter::CameraInterpZoom(float DeltaTime)
{
float CameraGoalFOV{0.f};
// Set current camera field of view
if (bAiming)
{
// Interpolate to zoomed FOV
CameraGoalFOV = CameraZoomedFOV;
}
else
{
// Interpolate to default FOV
CameraGoalFOV = CameraDefaultFOV;
}
CameraCurrentFOV = FMath::FInterpTo(
CameraCurrentFOV,
CameraGoalFOV,
DeltaTime,
ZoomInterpSpeed);
GetFollowCamera()->SetFieldOfView(CameraCurrentFOV);
}
- BeginPlay에서 매 프레임마다 CameraInterpZoom을 호출합니다.
- bAiming에 따라 CameraGoalFOV 값이 바뀝니다.
- FMath::FInterpTo : 두 값 사이를 부드럽게 보간하는 데 사용됩니다. 값의 변화를 부드럽게 만듭니다.
-
- Current는 현재 값입니다.
- Target은 목표 값입니다.
- DeltaTime은 마지막 프레임 이후 지난 시간입니다.
- InterpSpeed는 보간 속도를 결정합니다.
'Unreal 공부 > Unreal Engine 4 C++ The Ultimate Shooter' 카테고리의 다른 글
Aiming and Crosshairs - 3 (0) | 2024.01.04 |
---|---|
Aiming and Crosshairs - 2 (1) | 2024.01.04 |
Animation - 5 (1) | 2023.12.31 |
Animation - 4 (1) | 2023.12.31 |
Animation - 3 (1) | 2023.12.30 |