입력 액션(Input Action)
input action을 만든다.
Move는 축의 값을 받아야 하므로 Vector2D로 설정한다.
위와 똑같이 Jump도 생성한다.
Value Type에 Digital(bool)로 설정 후 Triggers에 Pressed로 설정한다.
입력 매핑 컨텍스트
Input->Input Mapping Context 선택하여 IMC_Character로 명명한다.
위에서 만들었던 입력액션을 연결한다.
+버튼을 누른 후 만들었던 IA_Move, IA_Jump를 연결하고 키를 매핑한다. 아래와 같이 설정하면 된다.
기본 설정 값이 WASD이므로 화살표( ↑ ← ↓ → )로 설정해보자.
언리얼의 Enhanced Input 시스템에서 키보드 입력을 2D벡터로 처리할 때 각 키는 기본적으로 X축 값만을 변경한다.
아래와 같이 들어온다
W ( ↑ ) | (1,0) |
A ( ← ) | (-1,0) |
S ( ↓ ) | (-1,0) |
D ( → ) | (1,0) |
하지만 실제 게임에서의 움직임은
W : 전진 (+Y)
A : 왼쪽 (-X)
S : 후진 (-Y)
D : 오른쪽 (+X)
그러므로 W ( ↑ ) 가 Y값으로 들어오려면 축을 변경해야하고,
A ( ← ) 가 -X로 들어오려면 음의 값으로 변경해야 하고,
S ( ↓ ) 가 Y값으로 들어오려면 축변경 및 음의 값으로 설정해야 하고,
D ( → ) 는 축변경 및 값 설정이 필요가 없다.
Swizzle Input Axis Values가 입력 벡터의 축 순서를 변경해주는 기능이다.
(X,Y,Z)로 설정되어있는 축을 (Y,X,Z)로 변경하면 입력의 X,Y값이 Y,X로 매핑되어 들어온다.
그래서 위와 같이 UP 은 축변경, LEFT는 음수 처리(Negate), DOWN은 축 변경 및 음수처리, D는 아무 설정도 하지 않는것이다.
Jump는 키 매핑만 하고 아무 설정도 안해도 된다. Trigger조건을 Input Action에서 정했기 때문이다.
캐릭터 생성
이제 캐릭터 블루프린트를 만들고 매핑한 값에 맞춰 이동을 구현할 수 있다.
블루프린트 폴더에 블루프린트 클래스를 Character로 생성한다.
Mesh에서 스켈레탈 메쉬 정보를 설정한다.
메쉬의 위치가 Capsule Collider와 다르니 매칭 해준다.
Capsule collider의 Half Height값만큼 위치를 조정한다.
그러고 나면 메쉬의 방향이 잘못 설정되어있는것을 볼 수 있다.
좌측아래의 축을 기준으로 확인할 수 있다.
좌측 아래 축 기준으로 앞방향은 위와 같은데, 메쉬는 다른 방향을 보고 있으므로 수정이 필요하다.
Rotation의 Z축을 -90으로 설정하면 된다.
블루프린트 캐릭터(BP_Character)를 해당 맵에 적용해야한다.
블루프린트 게임모드로 새로 만들고 이름을 BP_GameMode로 설정한다.
DefaultPawnClass에 BP_Character를 선택한다.
BP_GameMode를 맵에 세팅한 후 Play한다.
아무런 동작이 안되는걸 볼 수 있다.
이동에 대한 InputAction및 Mapping을 앞서 했으므로 입력에 대한 이동처리를 설정해야 한다.
캐릭터 이동
BP_Character의 EventGraph로 이동하여 블루프린트 노드를 설정한다.
해야할 일은 다음과 같다.
- 시작 시 MappingContext를 설정한다.
- Movement에 따른 Input값을 처리한다.
- Jump에 따른 Input값을 처리한다.
위와 같이 매핑 컨텍스트를 설정한다.
입력에 대한것은 Controller에서 관여하기 때문에 Controller의 InputSystem에 매핑컨텍스트를 연결한다.
이제 해당 키값에 대해 입력이벤트가 발생했을 때 입력이벤트에 따라 이동을 처리할 수 있다.
위 블루프린트의 설명은 아래와 같다.
- Then0
- Controller의 회전값을 가져온다(플레이어가 보는 방향)
- 해당 회전 기준의 RightVector를 구한다.(플레이어 기준 오른쪽 방향)
- Pitch(Y방향 회전)을 0으로 설정하여 수평방향으로만 이동하도록 한다.
- 구한 RightVector의 방향으로 InputX값만큼 이동시키도록 처리한다.
- Then1
- Controller의 회전값을 가져온다(플레이어가 보는 방향)
- 해당 회전 기준의 ForwardVector를 구한다.(플레이어 기준 앞쪽 방향)
- Pitch(Y방향 회전), Roll(X방향 회전)을 0으로 설정하여 수평방향으로만 이동하도록 한다.
- 구한 ForwardVector의 방향으로 InputY값만큼 이동시키도록 처리한다.
이때 Right는 Roll을 사용하고 Forward는 Roll을 사용하지 않는 이유는 아래와 같다.
Roll과 Yaw는 우측방향에 영향을 준다.
Pitch와 Yaw는 앞쪽 방향에 영향을 준다.
이때 Pitch는 평면상의 이동에 영향을 주지 않기 때문에 제외하면 Roll과 Yaw는 우측, Yaw는 앞쪽이 남는다.
이렇게 저장을 한 후 플레이를 눌러보면 캐릭터가 이동하는것을 볼 수 있다.
Jump처리를 하면서 CameraSetting을 같이 해야 할 것 같다.
카메라 세팅
SpringArm을 추가한다.
SpringArm은 카메라가 캐릭터를 따라오되, 일정거리를 유지하며, 벽이나 장애물에 뚫고 들어가지 않도록 보정해준다.
SpringArm컴포넌트를 누른 상태로 Camera도 추가한다.
SpringArm의 위치와 회전값을 조정하여 캐릭터를 따라오게 만들 수 있다.
Jump 구현
Jump라는 함수가 블루프린트에 내장되어 있어, 위와같이 설정하면 끝난다.
애니메이션이 없어 이상해보이지만, 블루프린트로 캐릭터의 이동을 구현 완료했다.
다음 포스팅에는 블루프린트로 애니메이션을 붙이는 방법에 대해 작성하도록 하겠다.
'개발일지 > Unreal&C++' 카테고리의 다른 글
[Unreal] 리플렉션(Reflection)? 작동 원리 및 장단점 (0) | 2025.04.04 |
---|---|
[Unreal] 언리얼 인터페이스, 그리고 장/단점 (Interface) (0) | 2025.04.03 |
[Unreal] 오브젝트 그리고 CDO(Class Default Object), generated.h, GENERATED_BODY (0) | 2025.04.01 |
[C++] 가상 함수와 비 가상 함수 (0) | 2025.03.18 |
[Unreal] 게임 플레이 프레임워크 (0) | 2025.03.18 |