2.7 - 카메라 뷰 변경

일인칭 슈팅 캐릭터의 카메라 뷰 변경법을 배워봅니다.

Windows
MacOS
Linux

이전 단계 끝에서 기본 카메라 위치를 메시의 목 안쪽에 위치시켰었습니다. 이번 단계에서는 카메라 (위치나 시야같은) 프로퍼티 조정에 사용할 수 있는 적합한 FPS 카메라를 구성해 보도록 하겠습니다.

카메라 컴포넌트 붙이기

  1. Visual Studio 로 돌아와서 FPSCharacter.h 를 열고 다음 코드를 추가합니다:

    // FPS 카메라
    UPROPERTY(VisibleAnywhere)
    UCameraComponent* FPSCameraComponent;
  2. FPSCharacter.h 는 이제 다음과 같은 모습일 것입니다:

    // 프로젝트 세팅의 설명 페이지에 저작권 문구를 채우세요.
    
    #pragma once
    
    #include "GameFramework/Character.h"
    #include "FPSCharacter.generated.h"
    
    UCLASS()
    class FPSPROJECT_API AFPSCharacter : public ACharacter
    {
        GENERATED_BODY()
    
    public:
        // 이 캐릭터 프로퍼티에 대한 기본값을 설정합니다.
        AFPSCharacter();
    
    protected:
        // 게임 시작 또는 스폰시 호출됩니다.
        virtual void BeginPlay() override;
    
    public:     
        // 매 프레임 호출됩니다.
        virtual void Tick( float DeltaSeconds ) override;
    
        // 입력에 함수성을 바인딩하기 위해 호출됩니다.
        virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
    
        // 전후 이동을 처리합니다.
        UFUNCTION()
        void MoveForward(float Value);
    
        // 좌우 이동을 처리합니다.
        UFUNCTION()
        void MoveRight(float Value);
    
        // 키를 누르면 점프 플래그를 설정합니다.
        UFUNCTION()
        void StartJump();
    
        // 키를 떼면 점프 플래그를 지웁니다.
        UFUNCTION()
        void StopJump();
    
        // FPS 카메라
        UPROPERTY(VisibleAnywhere)
        UCameraComponent* FPSCameraComponent;
    };
  3. FPSCharacter.cpp 를 열고 생성자에 다음 코드를 추가합니다:

    // 일인칭 카메라 컴포넌트를 생성합니다.
    FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
    // 카메라 컴포넌트를 캡슐 컴포넌트에 붙입니다.
    FPSCameraComponent->SetupAttachment(GetCapsuleComponent());

    이 코드는 UCameraComponent 를 생성하여 캐릭터의 CapsuleComponent 에 붙입니다.

  4. 이제 생성자에 방금 작성한 블록 아래 다음 코드를 추가합니다:

    // 카메라 위치를 눈 살짝 위쪽으로 잡습니다.
    FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight));
    // 폰의 카메라 로테이션 제어를 허용합니다.
    FPSCameraComponent->bUsePawnControlRotation = true;

    이 코드는 카메라의 위치를 캐릭터의 눈 위치 살짝 위쪽으로 잡으면서 폰이 카메라 로테이션을 제어할 수 있도록 해줍니다.

  5. FPSCharacter.cpp 는 이제 다음과 같은 모습일 것입니다:

    // 프로젝트 세팅의 설명 페이지에 저작권 문구를 채우세요.
    
    #include "FPSProject.h"
    #include "FPSCharacter.h"
    
    // 기본값 설정입니다.
    AFPSCharacter::AFPSCharacter()
    {
        // 이 캐릭터가 TIck() 을 매 프레임 호출하도록 설정합니다. 필요치 않은 경우 끄면 퍼포먼스가 향상됩니다.
        PrimaryActorTick.bCanEverTick = true;
    
        // 일인칭 카메라 컴포넌트를 생성합니다.
        FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
        // 카메라 컴포넌트를 캡슐 컴포넌트에 붙입니다.
        FPSCameraComponent->SetupAttachment(GetCapsuleComponent());
        // 카메라 위치를 눈 살짝 위쪽으로 잡습니다.
        FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight));
        // 폰의 로테이션 제어를 허가합니다.
        FPSCameraComponent->bUsePawnControlRotation = true;
    }
    
    // 게임 시작시 또는 스폰시 호출됩니다.
    void AFPSCharacter::BeginPlay()
    {
        Super::BeginPlay();
    
        if (GEngine)
        {
            // 5 초간 디버그 메시지를 표시합니다. (첫 인수인) -1 "Key" 값은 이 메시지를 업데이트 또는 새로고칠 필요가 없음을 나타냅니다.
            GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
        }
    }
    
    // 매 프레임 호출됩니다.
    void AFPSCharacter::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    
    }
    
    // 입력에 함수성을 바인딩하기 위해 호출됩니다.
    void AFPSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
    {
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
        // 게임플레이 키 바인딩을 구성합니다.
        PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
        PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
    
        // 게임플레이 마우스 바인딩을 구성합니다.
        PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
        PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);
    
        // 점프 동작 바인딩을 구성합니다.
        PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump);
        PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);
    }
    
    void AFPSCharacter::MoveForward(float Value)
    {
        // 어느 쪽이 전방인지 알아내어 플레이어가 그 방향으로 이동하려 한다고 기록합니다.
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
        AddMovementInput(Direction, Value);
    }
    
    void AFPSCharacter::MoveRight(float Value)
    {
        // 어느 쪽이 오른쪽인지 알아내어 플레이어가 그 방향으로 이동하려 한다고 기록합니다.
        const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::Y);
        AddMovementInput(Direction, Value);
    }
    
    void AFPSCharacter::StartJump()
    {
        bPressedJump = true;
    }
    
    void AFPSCharacter::StopJump()
    {
        bPressedJump = false;
    }

새 카메라 테스트

이제 새로 구현한 카메라 코드를 컴파일하고 테스트할 차례입니다.

  1. Visual Studio 에서 FPSCharacter 헤더 (*.h) 및 CPP (*.cpp) 파일을 저장합니다.

  2. Solution Explorer 에서 FPSProject 를 찾습니다.

  3. FPSProject우클릭 하고 Build 를 선택하여 프로젝트를 컴파일합니다.

    BuildProject.png

  4. 빌드 완료 후 언리얼 에디터에서 FPSProject 를 엽니다.

  5. 레벨 에디터 툴바의 플레이 버튼을 클릭 합니다.

    NewCameraComponent.png

    이제 카메라가 캐릭터 머리 살짝 위에 있을 것입니다.

  6. Esc 키를 누르거나 레벨 에디터의 중지 버튼을 클릭 하여 에디터에서 플레이 (PIE) 모드를 빠져나갑니다.

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼