언어:
페이지 정보
수준별:
엔진 버전:
언리얼 엔진

2.7 - 카메라 뷰 변경

언리얼 엔진

이전 단계 끝에서 기본 카메라 위치를 메시의 목 안쪽에 위치시켰었습니다. 이번 단계에서는 카메라 (위치나 시야같은) 프로퍼티 조정에 사용할 수 있는 적합한 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) 모드를 빠져나갑니다.