2.3 - 캐릭터 동작 함수 구현

일인칭 슈팅 캐릭터에 대한 동작 함수 구현법을 배워봅니다.

Windows
MacOS
Linux

이번 단계에서는 Player Input Component 를 구성하고, FPSCharacter 클래스에 다음 함수를 구현합니다:

  • MoveForward

  • MoveRight

무브먼트 함수 인터페이스

FPSCharacter 축 매핑을 구성했으니, 이제 Visual Studio 에서 프로젝트로 전환할 수 있습니다.

  1. FPSCharacter.h 에서 다음 함수 선언을 SetupPlayerInputComponent 아래 추가합니다.

    // 전후 이동 처리
    UFUNCTION()
    void MoveForward(float Value);
    
    // 좌우 이동 처리
    UFUNCTION()
    void MoveRight(float Value);

    (이 함수들 각각의 상단에 위치한) UFUNCTION 매크로는 엔진에게 이 함수들을 인식시켜 시리얼라이제이션, 최적화, 기타 엔진 함수성에 포함될 수 있도록 합니다.

  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);
    
    };

동작 함수 구현

전형적인 FPS 조작법에서, 캐릭터의 동작 축은 카메라에 상대적입니다. "전방" 이란 "카메라가 향하는 방향" 을, "우측" 이란 "카메라가 향하는 방향의 우측"을 뜻합니다. 캐릭터의 제어 방향을 구하는 데는 PlayerController 를 사용할 것입니다. 또한 MoveForward 함수는 제어 회전의 피치 컴포넌트를 무시하고 입력을 XY 면으로 제한시켜 위아래를 처다보더라도 캐릭터는 땅과 평행으로 움직일 수 있도록 합니다.

  1. FPSCharacter.cpp 에서, SetupPlayerInputComponent 함수의 Super::SetupPlayerInputComponent(PlayerInputComponent) 아래 다음 줄을 추가합니다:

    // 입력에 함수성 바인딩을 위해 호출됩니다.
    void AFPSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
    {
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
        // "movement" 바인딩 구성
        PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
        PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
    }

    InputComponent 는 입력 데이터 처리 방식을 정의하는 컴포넌트입니다. InputComponent 는 입력을 받기 원하는 액터에 붙이면 됩니다.

  2. FPSCharacter.cpp 에 다음 MoveForward 함수 정의를 추가합니다.

    void AFPSCharacter::MoveForward(float Value)
    {
        // 어느 쪽이 전방인지 알아내어, 플레이어가 그 방향으로 이동하고자 한다고 기록합니다.
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
        AddMovementInput(Direction, Value);
    }
  3. FPSCharacter.cpp에 다음 MoveRight 함수 정의를 추가합니다.

    void AFPSCharacter::MoveRight(float Value)
    {
        // 어느 쪽이 전방인지 알아내어, 플레이어가 그 방향으로 이동하고자 한다고 기록합니다.
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
        AddMovementInput(Direction, Value);
    }
  4. FPSCharacter.cpp 는 다음과 같은 모습일 것입니다:

// 프로젝트 세팅의 설명 페이지에 저작권 문구를 채우세요.

include "FPSProject.h"

    #include "FPSCharacter.h"

    // Sets default values
    AFPSCharacter::AFPSCharacter()
    {
        // 이 캐릭터가 매 프레임 Tick() 을 호출하도록 합니다. 필요치 않을 경우 꺼서 퍼포먼스를 향상시킬 수 있습니다.
        PrimaryActorTick.bCanEverTick = 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);

        // "movement" 바인딩을 구성합니다.
        PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
        PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
    }

    void AFPSCharacter::MoveForward(float Value)
    {
        // 어느 쪽이 전방인지 알아내어, 플레이어가 그 방향으로 이동하고자 한다고 기록합니다.
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
        AddMovementInput(Direction, Value);
    }

    void AFPSCharacter::MoveRight(float Value)
    {
        // 어느 쪽이 오른쪽인지 알아내어, 플레이어가 그 방향으로 이동하고자 한다고 기록합니다.
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
        AddMovementInput(Direction, Value);
    }

캐릭터 동작 테스트하기

새로 구현된 캐릭터 동작 함수를 컴파일하고 테스트할 차례입니다.

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

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

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

    BuildProject.png

  4. 빌드가 끝난 후, 언리얼 에디터에서 FPSProject 를 엽니다.

  5. 레벨 에디터 툴바에서 플레이 버튼을 클릭합니다. 이제 전후좌우 이동이 가능할 것입니다.

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

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

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

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

네이버 카페
공식 포럼