이번 섹션을 마치면 이런 결과물을 볼 수 있습니다.
목표
이 섹션의 목표는 일인칭 슈팅 캐릭터를 구현하는 방법을 보여주는 것입니다.
목적
이 튜토리얼 섹션을 완료하면 다음과 같은 작업을 할 수 있습니다.
- 새 캐릭터 제작
- 축 매핑 구성
- 캐릭터 무브먼트 함수 구현
- 마우스 카메라 컨트롤 구현
- 캐릭터 점프 구현
- 캐릭터에 메시 추가
- 카메라 뷰 변경
- 캐릭터에 일인칭 메시 추가
단계
- 2.1 - 새 캐릭터 제작하기
- 2.2 - 축 매핑 구성하기
- 2.3 - 캐릭터 무브먼트 함수 구현하기
- 2.4 - 마우스 카메라 컨트롤 구현하기
- 2.5 - 캐릭터 점프 구현하기
- 2.6 - 캐릭터에 메시 추가하기
- 2.7 - 카메라 뷰 변경하기
- 2.8 - 캐릭터에 일인칭 메시 추가하기
2.1 - 새 캐릭터 제작하기
이 단계에서는 언리얼 엔진 (UE)에서 엔진의 캐릭터(Character) 베이스 클래스를 사용하여 새 캐릭터를 제작합니다. 폰(Pawn) 클래스에서 파생되는 캐릭터 클래스는 걷기, 달리기, 점프와 같은 이족 보행 무브먼트를 위한 함수를 기본 제공합니다.
캐릭터 클래스 추가하기
Visual Studio(VS) 솔루션에 .h 및 .cpp 파일을 직접 추가할 수도 있지만, C++ 클래스 마법사(C++ Class Wizard) 를 사용하여 프로젝트에 새 클래스를 추가하는 것이 좋습니다.
C++ 클래스 마법사를 사용하면 엔진이 UE별로 적합한 매크로를 구성하는 헤더 및 소스 템플릿을 생성합니다.
-
아직 UE에서 FPSproject 를 안 열었다면 엽니다.
-
메인 메뉴 패널에서 툴(Tools) 을 클릭하고 새 C++ 클래스...(New C++ Class...) 를 선택합니다.
-
부모 클래스 선택(Choose Parent Class) 창이 나타납니다. 캐릭터(Character) 를 부모 클래스로 선택하고 다음(Next) 을 클릭합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
새 클래스의 이름을 FPSCharacter 로 지정한 후 클래스 생성(Create Class) 을 클릭합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
캐릭터 클래스 검증하기
-
VS의 Solution Explorer 에서 FPSProject > Source > FPSProject 를 펼칩니다.
-
FPSCharacter.cpp를 클릭하여 FPSCharacter 클래스의 구현 파일을 엽니다. -
Super::BeginPlay();아래void AFPSCharacter::BeginPlay()함수에 다음 코드를 추가합니다. 이 코드를 통해FPSCharacter클래스가 사용되는 것을 검증할 수 있습니다.FPSCharacter.cpp
check(GEngine != nullptr); // 디버그 메시지를 5초간 표시합니다. // -1 '키' 값 실행인자가 메시지가 업데이트되거나 새로고침되지 않도록 방지합니다. GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); -
FPSCharacter.cpp는 다음과 같아야 합니다.FPSCharacter.cpp
// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // 디폴트값 설정 AFPSCharacter::AFPSCharacter() { // 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다. PrimaryActorTick.bCanEverTick = true; } // 게임 시작 또는 스폰 시 호출 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); // 디버그 메시지를 5초간 표시합니다. // -1 '키' 값 실행인자가 메시지가 업데이트되거나 새로고침되지 않도록 방지합니다. GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // 프레임마다 호출 void AFPSCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); } //함수 기능을 입력에 바인딩하기 위해 호출 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); } -
Visual Studio에서
FPSCharacter.cpp파일을 저장합니다. -
솔루션 탐색기 로 이동하여 FPSProject 를 선택합니다.
지금까지는 에디터의 빌드(Build) 버튼을 사용하여 프로젝트를 컴파일했지만, 이 단계에서는 Visual Studio의 빌드 기능을 사용하여 코드를 컴파일하는 경험을 하게 됩니다. Visual Studio 내부에서 코드를 컴파일하려면, FPSProject 를 우클릭하고 Build 를 선택하여 프로젝트를 컴파일합니다.
-
VS를 사용하여 코드를 컴파일하려면, Solution Explorer 에서 FPSProject 를 우클릭하고 Build 를 선택하여 프로젝트를 컴파일합니다.
이 단계를 수행하기 전에 언리얼 엔진에서 라이브 코딩 활성화(Enable Live Coding) 를 비활성화해야 합니다.
VS의 기본 구성을 사용하는 경우 프로그램 하단 가까운 곳에 대화 상자가 있을 것입니다. 위치는 코드를 편집하던 곳 아래일 확률이 높습니다. 빌드를 클릭하면 처리 도중 대화 상자에 빌드에 성공했다는 메시지가 표시될 것입니다. 빌드에 실패했더라도 걱정할 필요는 없습니다! 코드가 여기와 에 나열된 내용과 일치하는지 확인하고 단계를 다시 수행하면 됩니다.
-
빌드가 완료되면 언리얼 에디터를 열어 새로 컴파일한 FPSCharacter 클래스가 콘텐츠 브라우저 에 표시되는지 확인합니다.
C++ FPS 캐릭터 클래스를 블루프린트로 확장하기
이제 의 FPSProject 게임 모드에서 작업했던 것과 마찬가지로, C++ FPS 캐릭터 클래스를 블루프린트로 확장하기에 적절한 시점입니다. C++와 블루프린트 레퍼런스 페이지로 이동하여 C++ 클래스를 블루프린트로 확장하는 방법에 대해 자세히 알아보셔도 됩니다.
-
콘텐츠 브라우저 에서 FPSCharacter 클래스를 우클릭하여 액션(Action) 메뉴를 엽니다.
-
FPSCharacter 기반 블루프린트 클래스 생성(Create Blueprint class based on FPSCharacter) 을 클릭하여 블루프린트 클래스 추가(Add Blueprint Class) 대화 메뉴를 엽니다.
-
블루프린트 클래스 생성(Create Blueprint Class)버튼을 클릭하기 전에 새 블루프린트 클래스의 이름을 BP_FPSCharacter 로 지정하고 Blueprints 폴더를 선택합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
Blueprints 폴더 내부에 새로 생성된 BP_FPSCharacter 블루프린트 클래스가 있어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
블루프린트 에디터 를 닫기 전에 BP_FPSCharacter 블루프린트를 저장 하세요.
디폴트 폰 클래스 설정하기
새로 수정한 게임 모드를 블루프린트로 확장했으니, 이 단계에서는 프로젝트가 BP_FPSCharacter 를 디폴트 폰 으로 사용하도록 설정해야 합니다.
-
메인 메뉴 패널에서 편집 을 클릭하고 프로젝트 세팅 을 선택합니다.
-
프로젝트 세팅 탭 좌측의 프로젝트(Project) 헤딩 아래에서 맵 & 모드(Maps & Modes) 를 클릭합니다.
-
선택된 게임 모드(Selected GameMode) 섹션을 펼치고 디폴트 폰 클래스(Default Pawn Class) 드롭다운 메뉴에서 BP_FPSCharacter 를 선택합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
프로젝트 세팅 메뉴를 닫습니다.
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭합니다. 뷰포트 좌측 상단 모서리에서 "Hello World, this is FPSGameMode!" 아래에 빨간색 텍스트 "We are using FPSCharacter."가 5초간 표시됩니다.
이동할 수 없는 경우 FPSCharacter를 폰으로 올바르게 사용하고 있는 것입니다! 새 캐릭터에는 아직 무브먼트 컨트롤이 전혀 없으므로 레벨에서 이동이 불가능합니다.
-
다음 단계로 이동하기 전에 Shift + Esc 를 누르거나 레벨 에디터 툴바 에서 중지 를 클릭하여 PIE 모드를 종료합니다.
2.2 - 축 매핑 구성하기
일반적으로 축 매핑을 사용하면 나중에 이동 등의 게임 행동에 바인딩 가능한 '친근한 이름'에 키보드, 마우스, 컨트롤러 입력을 매핑할 수 있습니다. 축 매핑은 지속적으로 폴링되어 끊김없는 무브먼트 트랜지션과 매끄러운 게임 행동을 구현해 줍니다. 컨트롤러 조이스틱 등 하드웨어 축은 개별 입력(예: 1 - 눌림, 0 - 눌리지 않음)이 아닌 입력의 정도를 제공합니다. 컨트롤러 조이스틱 입력 메서드가 스케일 가능한 이동 입력을 효과적으로 제공하기는 하지만, 축 매핑으로도 지속적으로 폴링되는 게임 행동에 WASD 나 화살표 키 등 일반적인 이동 키를 매핑할 수 있습니다.
이 단계를 더 진행하기 전에 플레이어 입력에 대해 자세히 알아보고 싶다면 플레이어 입력 및 폰 튜토리얼을 참조하세요. 이 단계에서는 WASD 키에 입력 축 매핑을 구성하여 새 캐릭터가 맵을 이동하도록 합니다.
MoveForward 축 매핑
-
메인 메뉴 패널에서 편집 을 클릭하고 프로젝트 세팅 을 선택합니다.
-
프로젝트 세팅 탭 좌측의 엔진(Engine) 헤딩 아래에서 입력(Input) 을 클릭합니다.
-
바인딩 섹션에서 축 매핑 옆의 더하기 기호를 클릭합니다.
-
축 매핑 좌측의 화살표를 클릭합니다.
-
텍스트 필드가 표시되면 MoveForward 라고 입력합니다.
-
드롭다운 메뉴의 키보드(Keyboard) 드롭다운 목록에서 W 를 선택합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
MoveForward 옆의 더하기 기호를 클릭합니다.
-
두 번째 드롭다운 메뉴의 키보드 드롭다운 목록에서 S 를 선택합니다.
-
S 옆의 스케일(Scale) 필드에 -1.0 을 입력합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
MoveRight 축 매핑
-
바인딩 섹션에서 축 매핑 옆의 더하기 기호를 클릭합니다.
-
텍스트 필드가 표시되면 MoveRight 라고 입력합니다.
-
드롭다운 메뉴의 키보드 드롭다운 목록에서 D 를 선택합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
MoveRight 옆의 더하기 기호를 클릭합니다.
-
두 번째 드롭다운 메뉴의 키보드 드롭다운 목록에서 A 를 선택합니다.
-
A 옆의 스케일 필드에 -1.0 을 입력합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
이제 Movement 축 매핑을 설정했으니, 프로젝트 세팅 메뉴를 닫습니다.
2.3 - 캐릭터 무브먼트 함수 구현하기
이 단계에서는 플레이어 입력 컴포넌트를 구성하고 FPSCharacter 클래스에 다음 함수를 구현합니다.
MoveForwardMoveRight
무브먼트 함수 인터페이스
FPSCharacter 에 축 매핑을 구성했으니, 이제 VS에서 프로젝트로 전환할 수 있습니다.
-
FPSCharacter.h에서SetupPlayerInputComponent아래,public액세스 지정자 아래에 다음 함수 선언을 추가합니다.FPSCharacter.h
// 앞으로 이동 및 뒤로 이동 입력을 처리합니다. UFUNCTION() void MoveForward(float Value); // 오른쪽 이동 및 왼쪽 이동 입력을 처리합니다. UFUNCTION() void MoveRight(float Value);이러한 각 함수 위에 위치한
UFUNCTION매크로는 엔진이 함수를 인식하여 시리얼라이제이션 및 다른 엔진 기능에 포함하도록 합니다. -
FPSCharacter.h는 다음과 같아야 합니다.FPSCharacter.h
// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #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 DeltaTime ) override; //함수 기능을 입력에 바인딩하기 위해 호출 virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; // 앞으로 이동 및 뒤로 이동 입력을 처리합니다. UFUNCTION() void MoveForward(float Value); // 오른쪽 이동 및 왼쪽 이동 입력을 처리합니다. UFUNCTION() void MoveRight(float Value); };
무브먼트 함수 구현
일반적인 FPS 제어 체계에서 캐릭터의 이동 축은 카메라에 상대적입니다.
'앞으로(Forward)' 이동은 '카메라가 가리키는 방향'으로 이동하는 것을, '오른쪽(right)' 이동은 카메라가 가리키는 방향의 오른쪽으로' 이동하는 것을 의미합니다.
캐릭터의 컨트롤 회전을 구하려면 PlayerController 를 사용합니다.
또한, MoveForward 함수는 컨트롤 회전의 피치 컴포넌트를 무시하고 입력을 XY 평면으로 제한하여 위나 아래를 보더라도 캐릭터는 지면과 평행으로 움직일 수 있도록 합니다.
-
FPSCharacter.cpp에서Super::SetupPlayerInputComponent(PlayerInputComponent);아래의SetupPlayerInputComponent함수에 다음 줄을 추가합니다.FPSCharacter.cpp
// 'movement' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);InputComponent는 입력 데이터 처리 방식을 정의하는 컴포넌트입니다.InputComponent는 입력을 수신할 액터에 어태치할 수 있습니다. -
FPSCharacter.cpp에서SetupPlayerInputComponent함수 정의 아래에 다음MoveForward함수 정의를 추가합니다.FPSCharacter.cpp
void AFPSCharacter::MoveForward(float Value) { // 어디가 '앞'인지 찾고, 플레이어가 해당 방향으로 이동하고자 한다는 것을 기록합니다. FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); } -
FPSCharacter.cpp에서MoveForward함수 정의 아래에 다음MoveRight함수 정의를 추가합니다.FPSCharacter.cpp
void AFPSCharacter::MoveRight(float Value) { // 어디가 '오른쪽'인지 찾고, 플레이어가 해당 방향으로 이동하고자 한다는 것을 기록합니다. FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); } -
FPSCharacter.cpp는 다음과 같아야 합니다.FPSCharacter.cpp
// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // 디폴트값 설정 AFPSCharacter::AFPSCharacter() { // 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다. PrimaryActorTick.bCanEverTick = true; } // 게임 시작 또는 스폰 시 호출 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); // 디버그 메시지를 5초간 띄웁니다. // -1 '키' 값 실행인자가 메시지가 업데이트되거나 새로고침되지 않도록 방지합니다. GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // 프레임마다 호출 void AFPSCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); } //함수 기능을 입력에 바인딩하기 위해 호출 void AFPSCharacter::SetupPlayerInputComponent(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); }
캐릭터 무브먼트 테스트하기
이제 새로 구현한 캐릭터 무브먼트 함수를 컴파일하고 테스트할 시간입니다.
-
VS에서 FPSCharacter 헤더
.h와.cpp구현 파일을 저장합니다. -
솔루션 탐색기 로 이동하여 FPSProject 를 선택합니다.
-
FPSProject 를 우클릭하고 빌드 를 선택하여 프로젝트를 컴파일합니다.
-
빌드가 완료되면 언리얼 에디터에서 FPSProject 를 엽니다.
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭합니다. 이제 WASD 키를 사용하여 전후좌우로 이동할 수 있습니다.
-
다음 단계로 이동하기 전에 Shift + Esc 를 누르거나 레벨 에디터 툴바 에서 중지 를 클릭하여 PIE 모드를 종료합니다.
2.4 - 마우스 카메라 컨트롤 구현하기
이 단계에서는 캐릭터의 시선 및 이동 방향을 마우스로 조정하는 기능을 추가합니다.
회전 축 매핑
-
메인 메뉴 패널에서 편집 을 클릭하고 프로젝트 세팅 을 선택합니다.
-
프로젝트 세팅 탭 좌측의 엔진(Engine) 헤딩 아래에서 입력(Input) 을 클릭합니다.
-
바인딩 섹션에서 축 매핑 옆의 더하기 기호를 클릭합니다.
-
축 매핑 좌측의 화살표를 클릭합니다.
-
텍스트 필드가 표시되면 Turn 이라고 입력합니다.
-
드롭다운 메뉴의 마우스(Mouse) 드롭다운 목록에서 마우스 X(Mouse X) 를 선택합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
바라보기 축 매핑
-
바인딩 섹션에서 축 매핑 옆의 더하기 기호를 클릭합니다.
-
텍스트 필드가 표시되면 LookUp 이라고 입력합니다.
-
드롭다운 메뉴의 마우스 드롭다운 목록에서 마우스 Y(Mouse Y) 를 선택합니다.
-
마우스 Y 옆의 스케일 필드에 -1.0 을 입력합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
프로젝트 세팅 메뉴를 닫습니다.
입력 핸들링 구현하기
이제 회전 및 바라보기에 대한 마우스 입력을 처리하는 코드를 추가해 보겠습니다.
Character 베이스 클래스는 다음과 같은 이름의 필수 함수 2개를 정의합니다.
AddControllerYawInputAddControllerPitchInput
감도 또는 축 반전 지원을 추가하는 등 그 밖의 처리를 수행하고자 한다면, 입력 값이 함수에 전달되기 전에 조정하는 자체 함수를 추가하면 됩니다. 하지만 여기서는 입력을 바로 AddControllerYawInput 및 AddControllerPitchInput 함수에 바인딩하도록 하겠습니다.
-
FPSCharacter.cpp에서SetupPlayerInputComponent함수에 다음 줄을 추가합니다.FPSCharacter.cpp
// 'look' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); -
SetupPlayerInputComponent함수는 다음과 같아야 합니다.FPSCharacter.cpp
//함수 기능을 입력에 바인딩하기 위해 호출 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 'movement' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); // 'look' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); }
마우스 카메라 컨트롤 테스트하기
-
VS에서 FPSCharacter 구현 파일을 저장합니다.
-
솔루션 탐색기 로 이동하여 FPSProject 를 선택합니다.
-
FPSProject 를 우클릭하고 빌드 를 선택하여 프로젝트를 컴파일합니다.
-
빌드가 완료되면 언리얼 에디터에서 FPSProject 를 엽니다.
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭합니다. 이제 마우스로 카메라를 제어할 수 있습니다.
-
다음 단계로 이동하기 전에 Shift + Esc 를 누르거나 레벨 에디터 툴바 에서 중지 를 클릭하여 PIE 모드를 종료합니다.
2.5 - 캐릭터 점프 구현하기
일반적으로 액션 매핑은 별도의 이벤트에 대한 입력을 다루며, 입력을 나중에 이벤트 주도형 행동에 바인딩할 수 있는 '친근한 이름'에 매핑합니다. 최종적인 효과는 키, 마우스 버튼 또는 키패드 버튼 누르기 및/또는 떼기로 바로 게임 행동을 트리거하는 것입니다. 이 단계에서는 스페이스 바에 입력 액션 매핑을 구성하여 캐릭터에 점프 능력을 추가합니다.
점프 액션 매핑
-
메인 메뉴 패널에서 편집 을 클릭하고 프로젝트 세팅 을 선택합니다.
-
프로젝트 세팅 탭 좌측의 엔진(Engine) 헤딩 아래에서 입력(Input) 을 클릭합니다.
-
바인딩 섹션에서 액션 매핑(Action Mappings) 옆의 더하기 기호를 클릭합니다.
-
액션 매핑 좌측의 화살표를 클릭합니다.
-
텍스트 필드가 표시되면 Jump 라고 입력합니다.
-
드롭다운 메뉴의 키보드 드롭다운 목록에서 스페이스 바(Space Bar) 를 선택합니다.
-
입력 세팅이 다음과 같은 모습이어야 합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
프로젝트 세팅 메뉴를 닫습니다.
입력 핸들링 구현
ACharacter 베이스 클래스의 헤더 파일 .h 내부를 살펴보면, 캐릭터 점프를 기본 지원하는 것을 볼 수 있습니다. 캐릭터 점프는 bPressedJump 변수에 묶여 있기 때문에, 점프 액션이 눌리면 부울이 true 이고 떼어지면 false 이도록 설정해 주기만 하면 됩니다. 이를 위해서 다음 함수 2개를 추가해야 합니다.
StartJumpStopJump
Visual Studio로 돌아가 FPSCharacter 클래스에 코드를 추가합니다.
-
FPSCharacter.h에서public액세스 지정자 아래에 다음 함수 선언을 추가합니다.FPSCharacter.h
// 키가 눌릴 경우 점프 플래그를 설정합니다. UFUNCTION() void StartJump(); // 키가 떼어질 경우 점프 플래그를 지웁니다. UFUNCTION() void StopJump(); -
FPSCharacter.h는 다음과 같아야 합니다.FPSCharacter.h
// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #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 DeltaTime ) override; //함수 기능을 입력에 바인딩하기 위해 호출 virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; // 앞으로 이동 및 뒤로 이동 입력을 처리합니다. UFUNCTION() void MoveForward(float Value); // 오른쪽 이동 및 왼쪽 이동 입력을 처리합니다. UFUNCTION() void MoveRight(float Value); // 키가 눌릴 경우 점프 플래그를 설정합니다. UFUNCTION() void StartJump(); // 키가 떼어질 경우 점프 플래그를 지웁니다. UFUNCTION() void StopJump(); }; -
FPSCharacter.cpp에서 페이지 하단에 다음 함수 정의를 추가합니다.FPSCharacter.cpp
void AFPSCharacter::StartJump() { bPressedJump = true; } void AFPSCharacter::StopJump() { bPressedJump = false; } -
SetupPlayerInputComponent함수에 다음 줄을 추가하여 점프 액션을 새로 작성한 함수에 바인딩합니다.FPSCharacter.cpp
// 'action' 바인딩을 구성합니다. PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump); PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump); -
FPSCharacter.cpp는 다음과 같아야 합니다.FPSCharacter.cpp
// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // 디폴트값 설정 AFPSCharacter::AFPSCharacter() { // 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다. PrimaryActorTick.bCanEverTick = true; } // 게임 시작 또는 스폰 시 호출 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); // 디버그 메시지를 5초간 표시합니다. // -1 '키' 값 실행인자가 메시지가 업데이트되거나 새로고침되지 않도록 방지합니다. GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // 프레임마다 호출 void AFPSCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); } //함수 기능을 입력에 바인딩하기 위해 호출 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 'movement' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); // 'look' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); // 'action' 바인딩을 구성합니다. 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) { // 어디가 '오른쪽'인지 찾고, 플레이어가 해당 방향으로 이동하고자 한다는 것을 기록합니다. FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); } void AFPSCharacter::StartJump() { bPressedJump = true; } void AFPSCharacter::StopJump() { bPressedJump = false; }
캐릭터 점프 테스트하기
이제 새로 구현한 캐릭터 무브먼트 함수를 컴파일하고 테스트할 시간입니다.
-
VS에서 FPSCharacter 헤더
.h와.cpp구현 파일을 저장합니다. -
솔루션 탐색기 로 이동하여 FPSProject 를 선택합니다.
-
FPSProject 를 우클릭하고 빌드 를 선택하여 프로젝트를 컴파일합니다.
-
빌드가 완료되면 언리얼 에디터에서 FPSProject 를 엽니다.
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭합니다. 이제 WASD 키를 사용하여 전후좌우로 이동할 수 있습니다.
-
다음 단계로 이동하기 전에 Shift + Esc 를 누르거나 레벨 에디터 툴바 에서 중지 를 클릭하여 PIE 모드를 종료합니다.
2.6 - 캐릭터에 메시 추가하기
다음 링크에서 샘플 메시를 다운로드하고 압축 해제합니다.
이 단계에서는 캐릭터에 스켈레탈 메시를 추가합니다. 캐릭터 클래스는 기본적으로 SkeletalMeshComponent 오브젝트를 생성하므로, 어떤 스켈레탈 메시 에셋을 사용할지만 알려 주면 됩니다.
스켈레탈 메시 임포트하기
-
콘텐츠 브라우저 로 이동하여 콘텐츠(Content) 폴더를 엽니다.
-
콘텐츠 브라우저 의 파일 창 내부를 우클릭하여 에셋 임포트 대화창을 엽니다.
-
'/Game...에 임포트(Import to /Game...)' 를 클릭하여 임포트(Import) 대화창을 엽니다.
-
이 파일을 다운로드한 폴더에서
GenericMale.fbx메시 파일을 찾아 선택합니다. -
열기(Open) 를 클릭하여 프로젝트에 메시 임포트를 시작합니다.
-
콘텐츠 브라우저 에 FBX 임포트 옵션 대화창이 나타납니다. 모두 임포트(Import All) 를 클릭하여 프로젝트에 메시를 추가합니다.
-
메인 메뉴 패널에서 파일 을 클릭하여 임포트된 메시를 저장합니다.
삼인칭 메시 구성하기
-
콘텐츠 > Blueprints 에서 BP_FPSCharacter 블루프린트 클래스 아이콘을 더블 클릭하여 블루프린트 에디터 에서 엽니다.
이 블루프린트가 데이터 전용 블루프린트라는 메모가 보이면 풀 블루프린트 에디터 열기(Open Full Blueprint Editor) 를 클릭합니다.
-
컴포넌트(Components) 탭에서 메시(Mesh) 컴포넌트를 클릭합니다.
-
디테일 패널로 이동하여 메시 로 스크롤합니다(화면 우측 또는 창(Window) > 디테일(Details) 에 있음).
-
스켈레탈 메시(Skeletal Mesh) 아래 드롭다운 창을 열고 GenericMale 스켈레탈 메시를 선택합니다.
-
디테일 패널에서 트랜스폼(Transform) 섹션으로 스크롤하고 위치(Location) 옵션을 X = -5.0; Y = 0.0; Z = -88.0 로 설정하여
SkeletalMeshComponent를CapsuleComponent에 정렬합니다.
-
블루프린트 에디터 에서 뷰포트(Viewport) 를 클릭하여 스켈레탈 메시를 미리 봅니다. 결과물은 다음과 같아야 합니다.
스켈레탈 메시가
CapsuleComponent내부에 있는지, 메시가ArrowComponent와 같은 방향을 향하고 있는지 검증합니다. 스켈레탈 메시 컴포넌트의 방향을 제대로 조정해야 캐릭터가 월드에서 올바르게 이동하도록 할 수 있습니다. -
블루프린트 에디터 를 닫기 전에 BP_FPSCharacter 블루프린트를 컴파일 하고 저장 하세요.
PIE 모드에서 새 메시 검증하기
이제 새로 추가한 메시를 에디터 내에서 보겠습니다.
-
레벨 에디터 툴바에서 플레이 버튼을 클릭합니다. 캐릭터를 움직이면 캐릭터의 섀도를 볼 수 있습니다.
에디터의 뷰포트 내에서 캐릭터의 메시를 보고자 하는 경우, F8 을 눌러 폰에서 탈출합니다. F8 을 누른 후에는 레벨에서 카메라를 자유롭게 움직일 수 있을 것입니다. 카메라를 움직이려면 왼쪽 마우스 버튼을 누른 채로 마우스를 움직이면 됩니다.

-
Shift + Esc 를 누르거나 레벨 에디터 툴바 에서 중지 를 클릭하여 PIE 모드를 종료합니다.
2.7 - 카메라 뷰 변경하기
이전 단계의 마지막에서 디폴트 카메라는 메시의 목 안쪽에 위치해 있었습니다.
이 단계에서는 위치, 필드 오브 뷰 등 카메라의 프로퍼티를 조정할 때 사용할 수 있는 FPS 카메라를 구성합니다.
시작하기 전에 FPSCharacter.h 에서 포함된 파일 목록을 확장해야 합니다.
이를 통해 코드가 카메라 관련 기능에 액세스할 수 있으며, 결과적으로 카메라 배치를 조작할 수 있습니다.
-
Visual Studio 프로젝트를 열고
FPSCharacter.h로 이동합니다. -
다음 헤더 파일을
FPSCharacter.h에 포함합니다.FPSCharacter.h
#include "Camera/CameraComponent.h" #include "Components/CapsuleComponent.h"
카메라 컴포넌트 어태치하기
-
FPSCharacter.h를 열고public액세스 지정자 아래에 다음 코드를 추가합니다.FPSCharacter.h
// FPS 카메라입니다. UPROPERTY(VisibleAnywhere) UCameraComponent* FPSCameraComponent; -
FPSCharacter.h는 다음과 같아야 합니다.FPSCharacter.h
// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "Camera/CameraComponent.h" #include "Components/CapsuleComponent.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 DeltaTime ) 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; }; -
FPSCharacter.cpp를 열고PrimaryActorTick.bCanEverTick = true:아래 생성자에 다음 코드를 추가합니다.FPSCharacter.cpp
// 일인칭 카메라 컴포넌트를 생성합니다. FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera")); check(FPSCameraComponent != nullptr); // 캡슐 컴포넌트에 카메라 컴포넌트를 어태치합니다. FPSCameraComponent->SetupAttachment(CastChecked<USceneComponent, UCapsuleComponent>(GetCapsuleComponent()));이 코드는
UCameraComponent를 생성한 후 캐릭터의CapsuleComponent에 어태치합니다. -
방금 생성자에 작성한 블록 아래에 다음 코드를 추가합니다.
FPSCharacter.cpp
// 카메라가 눈 약간 위에 위치하도록 합니다. FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight)); // 폰이 카메라 회전을 제어하도록 합니다. FPSCameraComponent->bUsePawnControlRotation = true;이 코드는 카메라의 위치가 캐릭터의 눈 위치보다 살짝 위에 있도록 조정하면서 폰이 카메라의 회전을 제어하도록 합니다.
SetRelativeLocation가 컴포넌트의 디폴트를 설정하지만, 이전 값은 계속 에디터에서 설정됩니다. 이 문제를 해결하려면 블루프린트 에디터 를 열고FPSCameraComponent를 클릭한 후 디테일 패널에서 트랜스폼(Transform) > 위치(Location) 값을 찾습니다. 해당 값 옆에 있는 디폴트로 리셋(Reset to Default) 아이콘을 클릭합니다. -
FPSCharacter.cpp는 다음과 같아야 합니다.FPSCharacter.cpp
// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // 디폴트값 설정 AFPSCharacter::AFPSCharacter() { // 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다. PrimaryActorTick.bCanEverTick = true; // 일인칭 카메라 컴포넌트를 생성합니다. FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera")); check(FPSCameraComponent != nullptr); // 캡슐 컴포넌트에 카메라 컴포넌트를 어태치합니다. FPSCameraComponent->SetupAttachment(CastChecked<USceneComponent, UCapsuleComponent>(GetCapsuleComponent())); // 카메라가 눈 약간 위에 위치하도록 합니다. FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight)); // 폰이 카메라 회전을 제어하도록 합니다. FPSCameraComponent->bUsePawnControlRotation = true; } // 게임 시작 또는 스폰 시 호출 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr) // 디버그 메시지를 5초간 표시합니다. // -1 '키' 값(첫 번째 실행인자)은 이 메시지를 업데이트하거나 새로고침할 필요가 없다는 것을 나타냅니다. GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // 프레임마다 호출 void AFPSCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); } //함수 기능을 입력에 바인딩하기 위해 호출 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 'movement' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); // 'look' 바인딩을 구성합니다. PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); // 'action' 바인딩을 구성합니다. 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) { // 어디가 '오른쪽'인지 찾고, 플레이어가 해당 방향으로 이동하고자 한다는 것을 기록합니다. FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); } void AFPSCharacter::StartJump() { bPressedJump = true; } void AFPSCharacter::StopJump() { bPressedJump = false; }
새 카메라 테스트하기
이제 새로 구현한 카메라 코드를 컴파일하고 테스트할 시간입니다.
-
VS에서 FPSCharacter 헤더
.h와.cpp구현 파일을 저장합니다. -
솔루션 탐색기 로 이동하여 FPSProject 를 선택합니다.
-
FPSProject 를 우클릭하고 빌드 를 선택하여 프로젝트를 컴파일합니다.
-
빌드가 완료되면 언리얼 에디터에서 FPSProject 를 엽니다.
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭합니다.
이제 카메라가 캐릭터 머리보다 살짝 위에 있을 것입니다.
뷰포트 에서 BP_FPSCharacter 를 열어 새로 추가한 카메라 컴포넌트를 확인할 수도 있습니다.

콘텐츠 브라우저 에서 BP_FPSCharacter 를 열고 뷰포트 로 이동하는 경우 캐릭터가 다음과 같이 보입니다.
2.8 - 캐릭터에 일인칭 메시 추가하기
FPS 게임을 만들 때는 보통 풀 바디 메시와 '무기 및 손' 메시라는 별도의 캐릭터 메시 2개를 사용합니다. 풀 바디 메시는 삼인칭 시점에서 캐릭터를 볼 때 사용되며, 플레이어가 일인칭 시점으로 게임을 볼 때는 숨겨집니다. '무기 및 손' 메시는 일반적으로 카메라에 어태치되어 있으며, 플레이어가 맵을 일인칭 시점으로 볼 때만 표시됩니다. 이 단계에서는 캐릭터에 일인칭 메시를 추가합니다.
일인칭 캐릭터 메시 추가하기
-
Visual Studio로 다시 전환하고
FPSCharacter.h를 열어public아래에 다음 코드를 추가합니다.FPSCharacter.h
// 일인칭 메시(팔)로, 소유 플레이어에게만 보입니다. UPROPERTY(VisibleDefaultsOnly, Category = Mesh) USkeletalMeshComponent* FPSMesh; -
FPSCharacter.cpp를 열고 생성자로 이동하여 일인칭 메시를 생성 및 환경설정하는 다음 코드를 추가합니다.FPSCharacter.cpp
// 소유 플레이어의 일인칭 메시 컴포넌트를 생성합니다. FPSMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh")); check(FPSMesh != nullptr); // 소유 플레이어만 이 메시를 볼 수 있습니다. FPSMesh->SetOnlyOwnerSee(true); // FPS 메시를 FPS 카메라에 어태치합니다. FPSMesh->SetupAttachment(FPSCameraComponent); // 일부 인바이런먼트 섀도를 비활성화하여 단일 메시 같은 느낌을 보존합니다. FPSMesh->bCastDynamicShadow = false; FPSMesh->CastShadow = false;SetOnlyOwnerSee는 이 메시가 이 캐릭터에 빙의한PlayerController에만 보인다는 것을 의미합니다. 이 코드는 메시를 카메라에 어태치하고 일부 인바이런먼트 섀도를 비활성화하기도 합니다. 팔이 그림자를 드리우도록 하면 일인칭 캐릭터가 단일 메시 같다는 느낌이 사라집니다. -
마지막으로,
PSCharacter.cpp에서 생성자에 다음 코드를 추가하여 소유 캐릭터에서 기존 삼인칭 메시를 숨깁니다.FPSCharacter.cpp
// 소유 플레이어가 일반(삼인칭) 바디 메시를 볼 수 없습니다. GetMesh()->SetOwnerNoSee(true); -
Visual Studio에서 FPSCharacter 헤더
.h와.cpp구현 파일을 저장합니다. -
솔루션 탐색기 로 이동하여 FPSProject 를 선택합니다.
-
FPSProject 를 우클릭하고 빌드 를 선택하여 프로젝트를 컴파일합니다.
-
빌드가 완료되면 언리얼 에디터에서 FPSProject 를 엽니다.
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭합니다. 이제 PIE 모드에서 캐릭터의 섀도가 보이지 않아야 합니다. 결과물은 다음과 같아야 합니다.
이 시점에서 캐릭터 메시는 에디터 내부에서 보이지 않아야 합니다.
여전히 메시와 드리워진 그림자가 보인다면 에디터를 닫고 다시 시작하세요.
메시 블루프린트 빌드하기
계속하기 전에 다음 링크에서 샘플 메시를 다운로드하고 압축 해제합니다.
-
콘텐츠 브라우저 로 이동하여 콘텐츠 폴더를 엽니다.
-
콘텐츠 브라우저 의 파일 창 내부를 우클릭하여 에셋 임포트 대화창을 엽니다.
-
/Game...에 임포트(Import to /Game...) 를 클릭하여 임포트(Import) 대화창을 엽니다.
-
이 파일을 다운로드한 위치에서 HeroFPP.fbx 메시 파일을 찾아 선택합니다.
-
열기(Open) 를 클릭하여 프로젝트에 메시 임포트를 시작합니다.
-
콘텐츠 브라우저 에 FBX 임포트 옵션 대화창이 나타납니다.
-
스켈레톤(Skeleton) 섹션 아래 드롭다운 메뉴의 FBX 임포트 옵션(FBX Import Options) 대화창에서 지우기(Clear) 를 선택한 후 모두 임포트(Import All) 를 클릭합니다.
-
다음 메시지 로그 창을 닫습니다.
이 메시는 여전히 일인칭 메시 구성을 표시하며, 향후 섹션에서 구성할 애니메이션과 함께 작동합니다.
-
메인 메뉴 패널에서 파일 을 클릭하여 임포트된 메시를 저장합니다.
-
콘텐츠 브라우저 에서 Blueprints** 폴더로 이동합니다.
-
BP_FPSCharacter 아이콘을 더블 클릭하여 블루프린트 에디터 에서 엽니다.
-
블루프린트 에디터 에서 컴포넌트 탭으로 이동하여 새 FPSMesh 컴포넌트를 선택합니다. 우선 풀 블루프린트 에디터 를 열어야 할 수 있습니다.
FPSMesh 컴포넌트는 FPSCameraComponent 의 자손이므로 항상 카메라에 어태치되어 있습니다.
-
디테일 패널로 이동하여 메시 섹션으로 스크롤한 후 스켈레탈 메시 아래 드롭다운을 클릭합니다. 드롭다운 메뉴에서 HeroFPP 스켈레탈 메시를 선택하여 뷰포트 에 팔을 추가합니다.
-
추가된 HeroFPP 스켈레탈 메시는 뷰포트 내에서 다음과 같은 모습이어야 합니다.
-
추가된 메시의 트랜스폼(Transform) 옵션을 조정합니다. 위치 를 {220, 0, 35}, 회전 을 {180, 50, 180} 으로 설정합니다.
-
이 세팅은 HeroFPP 스켈레탈 메시가 카메라 앞에 있도록 변환합니다.
-
블루프린트 에디터 를 닫기 전에 BP_FPSCharacter 블루프린트를 컴파일 하고 저장 하세요.
게임 내에서 새 메시 보기
-
레벨 에디터 툴바 에서 플레이 버튼을 클릭하여 게임 내에서 새 메시를 봅니다.
-
Shift + Esc 를 누르거나 레벨 에디터 툴바 에서 중지 를 클릭하여 PIE 모드를 종료합니다.
완성된 섹션 코드
FPSCharacter.h
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Character.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.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 DeltaTime ) 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;
// 일인칭 메시(팔)로, 소유 플레이어에게만 보입니다.
UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
USkeletalMeshComponent* FPSMesh;
};
FPSCharacter.cpp
// Copyright Epic Games, Inc. All Rights Reserved.
#include "FPSCharacter.h"
// 디폴트값 설정
AFPSCharacter::AFPSCharacter()
{
// 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다.
PrimaryActorTick.bCanEverTick = true;
// 일인칭 카메라 컴포넌트를 생성합니다.
FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
check(FPSCameraComponent != nullptr);
// 캡슐 컴포넌트에 카메라 컴포넌트를 어태치합니다.
FPSCameraComponent->SetupAttachment(CastChecked<USceneComponent>(GetCapsuleComponent()));
// 카메라가 눈 약간 위에 위치하도록 합니다.
FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight));
// 폰이 카메라 회전을 제어하도록 합니다.
FPSCameraComponent->bUsePawnControlRotation = true;
// 소유 플레이어의 일인칭 메시 컴포넌트를 생성합니다.
FPSMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh"));
check(FPSMesh != nullptr);
// 소유 플레이어만 이 메시를 볼 수 있습니다.
FPSMesh->SetOnlyOwnerSee(true);
// FPS 메시를 FPS 카메라에 어태치합니다.
FPSMesh->SetupAttachment(FPSCameraComponent);
// 일부 인바이런먼트 섀도잉을 비활성화하여 단일 메시 같은 느낌을 보존합니다.
FPSMesh->bCastDynamicShadow = false;
FPSMesh->CastShadow = false;
// 소유 플레이어가 일반(삼인칭) 바디 메시를 볼 수 없습니다.
GetMesh()->SetOwnerNoSee(true);
}
// 게임 시작 또는 스폰 시 호출
void AFPSCharacter::BeginPlay()
{
Super::BeginPlay();
check(GEngine != nullptr);
// 디버그 메시지를 5초간 표시합니다.
// -1 '키' 값 실행인자가 메시지가 업데이트되거나 새로고침되지 않도록 방지합니다.
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
}
// 프레임마다 호출
void AFPSCharacter::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
//함수 기능을 입력에 바인딩하기 위해 호출
void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 'movement' 바인딩을 구성합니다.
PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
// 'look' 바인딩을 구성합니다.
PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);
// 'action' 바인딩을 구성합니다.
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)
{
// 어디가 '오른쪽'인지 찾고, 플레이어가 해당 방향으로 이동하고자 한다는 것을 기록합니다.
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
AddMovementInput(Direction, Value);
}
void AFPSCharacter::StartJump()
{
bPressedJump = true;
}
void AFPSCharacter::StopJump()
{
bPressedJump = false;
}
축하합니다! 다음과 같은 내용을 배웠습니다.
✓ 새 캐릭터 제작
✓ 축 매핑 구성
✓ 캐릭터 무브먼트 함수 구현
✓ 마우스 카메라 컨트롤 구현
✓ 캐릭터 점프 구현
✓ 캐릭터에 메시 추가
✓ 카메라 뷰 변경
✓ 캐릭터에 일인칭 메시 추가
이제 다음 섹션에서 발사체를 구현하는 방법을 배울 준비가 되었습니다.