시작하기 전에
이전 섹션인 프로젝트 구성 및 컴파일에서 다음 목표를 완료했는지 확인합니다.
커스텀 게임 모드(Game Mode) C++ 클래스를 사용하여 1인칭 템플릿을 기반으로 프로젝트를 생성했습니다.
프로젝트에서 향상된 입력(Enhanced Input) 시스템을 사용하는지 확인했습니다.
캐릭터 구성하기
커스텀 게임 모드로 새 C++ 프로젝트를 구성했습니다. 이제 새 캐릭터 클래스를 추가하고 블루프린트에 확장한 다음, 게임 모드에서 디폴트 플레이어 폰으로 설정할 것입니다.
C++ 캐릭터 클래스 생성하기
액터 에셋은 레벨에 배치할 수 있는 모든 오브젝트입니다. 폰은 플레이어 또는 AI가 제어할 수 있는 액터이며, 캐릭터는 플레이어 캐릭터로 사용되는 특별한 타입의 폰입니다. 이러한 액터 클래스에 대한 자세한 내용은 UE 게임플레이 프레임워크 문서의 액터, 폰 및 캐릭터 클래스 정보를 참조하세요.
새 캐릭터 클래스를 생성하고 프로젝트에 C++를 추가하려면 다음 단계를 따릅니다.
에디터의 메인 메뉴에서 툴(Tools) > 새 C++ 클래스(New C++ class)로 이동합니다.
부모 클래스 선택(Choose Parent Class) 창에서 캐릭터(Character)를 찾아서 선택하고 다음(Next)을 클릭합니다.
새 클래스의 이름을 입력한 다음, 클래스 생성(Create Class)을 클릭합니다. 이 튜토리얼에서는
AdventureCharacter라는 이름을 사용합니다.언리얼 엔진에서 자동으로 Visual Studio(VS)의 새 클래스 파일을 엽니다. 다시 VS로 전환하여 새 파일을 찾습니다.
VS에서 프로젝트를 새로 고치라는 메시지가 자동으로 표시되지 않으면, 언리얼 에디터에서 툴 > Visual Studio 프로젝트 새로고침(Refresh Visual Studio Project)으로 이동합니다.
C++ 캐릭터를 블루프린트로 확장하기
게임 모드에서 했던 것처럼 콘텐츠 브라우저에서 캐릭터 클래스를 우클릭하고 <캐릭터명> 기반 블루프린트 클래스 생성(Create Blueprint class based on <CharacterName>)을 선택하여 Blueprints 폴더에 해당 캐릭터의 블루프린트를 생성합니다.
디폴트 플레이어 캐릭터 변경하기
게임 내에서 새 캐릭터를 사용하려면 프로젝트의 게임 모드에서 사용되는 기본 폰 클래스(Default Pawn Class)로 설정합니다.
캐릭터를 디폴트 플레이어 캐릭터로 설정하려면 다음 단계를 따릅니다.
게임 모드 블루프린트가 아직 열려 있지 않다면, 콘텐츠 브라우저에서 새 블루프린트를 더블클릭하여 블루프린트 에디터에서 엽니다.
블루프린트의 디테일(Details) 패널에서 클래스(Classes)를 엽니다. 여기에서 이 게임 모드에 사용할 다양한 디폴트 클래스를 설정할 수 있습니다.
기본 폰 클래스를 캐릭터 블루프린트
(BP_AdventureCharacter)로 변경합니다.창 왼쪽 상단의 저장(Save)을 클릭하여 게임 모드 블루프린트를 저장한 다음 컴파일(Compile)을 클릭합니다.
입력 액션 탐색하기
1인칭 템플릿의 디폴트 캐릭터는 블루프린트와 결합하여 캐릭터가 움직이고, 점프하고, 주위를 둘러볼 수 있도록 하는 기존 입력 액션 세트를 사용합니다.
이 입력 액션을 열고 탐색하여 이 캐릭터의 무브먼트를 구동하는 방식을 알아봅니다.
콘텐츠 브라우저 에셋 트리에서 Content > Input > Actions 폴더로 이동합니다. 각각 점프, 보기, 이동에 해당하는 IA_Jump, IA_Look, IA_Move라는 세 가지 입력 액션이 표시됩니다.
IA_Jump를 더블클릭하여 열고 디테일(Details) 패널을 확인합니다.
캐릭터의 입력 액션은 다음 프로퍼티를 사용하여 액션의 타입과 수행하는 액션을 정의합니다.
프로퍼티 | 설명 |
값 타입(Value Type) | 이 입력 액션에 포함되는 값의 타입을 결정합니다. 이 입력 액션으로 캡처하려는 무브먼트 타입에 따라 값 타입을 선택합니다. 예를 들어, Axis1D 1차원 무브먼트(스크롤 인/아웃) 또는 스칼라 조정(무브먼트 속력 변경)을 캡처하기 위한 플로트 값입니다. Axis2D는 WSAD 컨트롤과 같은 2차원 무브먼트를 캡처하는 두 개의 플로트로 구성된 벡터입니다. Axis3D는 비행 또는 수영 컨트롤과 같은 3차원 무브먼트를 캡처하는 세 개의 플로트로 구성된 벡터입니다. |
트리거(Triggers) | 액션의 가능한 스테이트를 나타내는 트리거를 생성합니다. 블루프린트나 코드에서 이러한 트리거로 로직을 빌드할 수 있습니다. |
모디파이어(Modifiers) | UE가 입력 트리거로 전송하기 전에 수신하는 원시 입력 값을 수정합니다. |
입력 매핑 컨텍스트 탐색하기
입력 액션은 단독으로 작동하지 않으며, 어떤 버튼이 어떤 컨텍스트에서 트리거되어야 하는지 알기 위해서는 입력 매핑 컨텍스트(Input Mapping Context)가 필요합니다. 이는 입력 액션을 트리거하는 규칙을 설명하는 매핑 컬렉션입니다. 여러 개의 입력 매핑 컨텍스트를 생성 및 커스터마이징하고 게임의 필요에 따라 동적으로 켜고 끌 수 있습니다.
디폴트 캐릭터에는 입력 매핑 컨텍스트가 이미 있는데, 이는 콘텐츠 브라우저의 Content > Input에서 확인할 수 있습니다. IMC_Default를 더블클릭하여 열고 디테일패널을 확인합니다.
IMC_Default에는 세 가지 입력 액션을 각각 사용자 입력에 매핑하는 세 가지 매핑이 포함되어 있습니다. 각 매핑은 입력 액션의 트리거와 모디파이어를 가져옵니다.
점프 액션 매핑하기
IA_Jump 매핑을 엽니다. 스페이스 바(Space Bar)와 게임패드 전면 아래 버튼(Gamepad Face Button Bottom), 이렇게 두 개의 컨트롤 바인딩이 있는 것을 볼 수 있습니다. 게임 내에서 이 버튼 중 하나를 누르면 IA_Jump가 트리거됩니다.
키보드 키로 2D 무브먼트 매핑하기
다음으로 IA_Move를 열어 WASD 키, 화살표 키, 게임패드 왼쪽 썸스틱에 해당하는 9개의 바인딩을 확인합니다.
여러 개의 개별 키에서 2차원 무브먼트를 생성하려면 단순한 boolean 점프보다 조금 더 많은 구성이 필요합니다.
키 누름은 1차원이며 누르지 않으면 0, 누르면 1의 값을 반환합니다. 이 방식은 D 키나 오른쪽 화살표 키에 완벽하게 적용되는데, 이 두 키는 캐릭터를 X축을 따라 양의 방향(즉, 오른쪽)으로 움직이기 때문입니다. 하지만, 캐릭터는 앞, 왼쪽, 뒤로도 이동할 수 있어야 합니다. 즉, X축과 Y축 모두에서 0~1, 0~-1의 값이 필요합니다.
따라서 모든 방향의 무브먼트를 생성하는 값을 얻기 위해 입력 액션에서는 모디파이어(Modifiers)를 사용하여 입력 값을 다른 축이나 음수 값으로 변환합니다.
예를 들어, A 컨트롤 바인딩과 해당 모디파이어를 열어 환경설정 방식을 확인해 보면 부정(Negate) 모디파이어가 있을 것입니다. 즉, 키를 누르면 1.0의 값이 -1.0으로 부정되어 캐릭터가 X축 아래 또는 왼쪽으로 이동합니다.
부정 모디파이어를 열면 X, Y 또는 Z축 값을 부정할지 여부를 지정할 수 있습니다. 이 기능은 모두 기본적으로 활성화되어 있지만, 필요에 따라 특정 축으로 부정을 제한할 수 있습니다.
이제 S 컨트롤 바인딩을 확장합니다. Y축 후방 무브먼트를 생성하기 위해 이 바인딩에는 입력을 X축에서 Y축으로 변경하는 스위즐 입력 축 값(Swizzle Input Axis Values)과 부정(Negate)이라는 모디파이어 두 개가 있습니다.
스위즐 입력 축 값 모디파이어를 엽니다. 순서(Order) 옵션은 축 값이 재정렬되는 방식을 지정합니다. 이 경우 입력 동작이 YXZ를 사용하므로 X축과 Y축이 디폴트 XYZ 순서와 바뀝니다.
게임패드에 2D 무브먼트 매핑하기
게임패드 썸스틱은 1D 버튼 누름이 아닌 2D 축을 입력에 사용하므로, 이 매핑은 썸스틱 무브먼트를 처리하는 데 하나의 컨트롤 바인딩만 있으면 됩니다.
게임패드 왼쪽 썸스틱 2D 축(Gamepad Left Thumbstick 2D-Axis)에 대한 모디파이어를 열면 데드 존(Dead Zone) 및 스칼라(Scalar) 모디파이어가 있습니다.
데드 존은 입력이 무시되는 위쪽과 아래쪽의 한계치를 지정합니다. 데드 존을 사용하면 썸스틱이 완벽하게 중앙에 위치하지 않거나 약간의 손가락 압력으로 인해 의도치 않게 발생하는 썸스틱 중앙 부근의 작은 입력값을 필터로 걸러낼 수 있습니다.
스칼라는 캐릭터가 각 방향으로 이동하는 속도를 제어할 수 있도록 X, Y, Z 축 값 각각에 대한 배수를 지정합니다.
게임패드와 마우스에 보기 컨트롤 매핑하기
IA_Look 액션 매핑을 펼칩니다. 이 입력 액션은 게임패드 오른쪽 썸스틱 2D 축(Gamepad Right Thumbstick 2D-Axis) 컨트롤에 바인딩됩니다.
여기에 데드 존(Dead Zone) 모디파이어만 있으면 오류를 필터로 걸러낼 수 있습니다.
디폴트 캐릭터에는 마우스 기반 카메라 컨트롤에 사용하는 별도의 매핑 컨텍스트가 있습니다. 콘텐츠 브라우저로 돌아가서 IMC_MouseLook을 엽니다. 이 IMC는 IA_Look과 동일한 IA_MouseLook 입력 액션에 대한 바인딩을 생성합니다.
별도의 썸스틱 및 마우스 입력 액션을 사용하면 각 입력에 대해 서로 다른 모디파이어를 지정하고 별도의 입력 경로로 취급할 수 있습니다. 그렇지만, 이 튜토리얼에서는 모든 입력 액션을 하나의 입력 매핑 컨텍스트에 결합합니다.
IA_MouseLook 액션 매핑을 펼칩니다. 이 입력 액션은 마우스 XY 2D 축(Mouse XY 2D-Axis) 컨트롤에 바인딩됩니다.
이 마우스 컨트롤 바인딩은 이미 2D 축을 사용하고 있으므로, 필요한 모디파이어는 마우스를 위로 움직일 때 캐릭터가 아래를 바라보도록 하는 Y축 부정(Y-axis Negate)뿐입니다. 1인칭 게임에서는 이게 일반적인 방식이지만, 이 모디파이어를 삭제하여 보기 컨트롤을 반전할 수 있습니다.
입력 매핑 컨텍스트 수정하기
새 프로젝트를 시작하는 단계이므로, 모든 입력 매핑을 하나의 입력 매핑 컨텍스트에 결합합니다.
디폴트 플레이어의 매핑 컨텍스트를 기반으로 고유한 IMC를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저의 Content > Input 폴더에서
IMC_Default를 우클릭하고 복제(Duplicate)를 선택합니다.매핑 컨텍스트의 이름을
IMC_Adventure로 지정한 다음, 더블클릭하여 엽니다.IA_Look 매핑을 펼칩니다.
IA_Look 옆의 + 버튼을 클릭하여 새 컨트롤 바인딩을 추가합니다.
None을 클릭하여 키 값 목록을 열고 마우스(Mouse)를 펼친 다음, 마우스 XY 2D 축(Mouse XY 2D-Axis)을 선택합니다.
마우스 컨트롤 바인딩에서 모디파이어(Modifiers) 옆의 더하기 버튼(+)을 클릭하고 없음(None)을 부정(Negate)으로 변경합니다.
Index [0] 모디파이어를 펼치고 X 및 Z를 선택 취소합니다. 이 모디파이어는 Y축만 부정해야 합니다.
매핑 컨텍스트를 저장하고 닫습니다.
카메라 컨트롤을 반전하려면 썸스틱 또는 마우스 컨트롤 바인딩에서 Negate 모디파이어를 추가하거나 제거하면 됩니다.
다음 순서
다음 섹션에서는 디폴트 캐릭터의 블루프린트가 플레이어 입력을 캐릭터 무브먼트에 연결하는 방법을 알아보고 이를 코드로 재현해 보겠습니다.
캐릭터 무브먼트 환경설정
C++에서 플레이어 입력을 캐릭터 무브먼트에 바인딩하는 방법을 알아봅니다.