UE - BP를 이용한 캐릭터 Input 구현
BP-Input
입력을 구현하기 전 필요한 개념
이번엔 BP로 캐릭터를 만들고 간단한 키 입력까지 적용하겠다.
입력을 구현하려면 2가지에 대해 알고 있어야한다.
폰과 컨트롤러
폰 : 게임 세계에서 캐릭터나 움직이는 객체를 나타내는 클래스. 단순한 정적 객체와 달리, 컨트롤러에 의해 제어될 수 있는 모든 객체를 포괄한다. 컨트롤러 : 폰을 제어하며, 입력뿐만 아니라 AI나 게임 로직에 따라 캐릭터의 행동을 처리한다. 기본적으로 PlayerController와 AIController로 나뉜다.
비유하자면, Pawn은 게임 세상의 ‘육체’이고, Controller는 이를 움직이게 하는 ‘의지’라고 볼 수 있다.
입력 시스템
언리얼 5에선 향상된 입력을 사용해 다양한 액션을 쉽게 관리할 수 있다. 이 향상된 입력 시스템은 입력 액션, 입력 매핑 컨텍스트, 입력 모디파이어, 입력 트리거가 4가지 주요 콘셉트로 이루어져 있다.
입력 액션
입력 액션은 입력 이벤트가 발생했을 때 반환할 데이터의 형태와 구조를 정의한다.
입력 액션은 여러 타입이 될 수 있고, 타입에 따라 반환되는 데이터의 형태와 동작이 달라진다.
예를 들어, 디지털 입력으로 on/off 상태를 나타내거나, 2D 축 입력으로 상하좌우 이동, 3D 축 입력으로 복잡한 모션 데이터 처리가 가능하다.
이렇게 생성한 입력 액션은 BP에서 리스너를 통해 사용할 수 있다.
입력 매핑 컨텍스트
키를 입력 액션에 매핑하고, 해당 키가 입력되었을 때 입력 액션에게 전달할 값을 관리한다.
입력 장치(키보드, 마우스, 컨트롤러 등)에서 발생한 입력을 입력 액션에 매핑해, 해당 입력이 어떤 데이터를 반환할지 정의하는 역할을 한다.
입력 모디파이어
키를 입력해 값을 전달할 때, 그 값을 원하는 값으로 수정한다.
예를 들어, 스케일리으로 값 크기를 조정하거나 부정으로 값의 부호를 변경할 수 있다.
입력 트리거
트리거가 충족되었을 때만 입력을 처리할 수 있는 제한을 걸어준다.
입력 구현
캐릭터 생성
우선 BP로 캐릭터를 만들자. 이번엔 키 입력을 받을거니 액터 대신 캐릭터로 선택한다.
액터와 다르게 캐릭터는 캡슐 컴포넌트, 화살표 컴포넌트, 메시, 캐릭터 무브먼트를 제공한다.
이제 메시를 달아줘야하니 메시 컴포넌트에서 메시를 추가하자.
메시를 캡슐에 적당히 맞춰주자, 방향은 하늘색 화살표에 맞게
이제 키 입력을 구현하자
키 입력 구현
이번에 추가할 액션은 점프, 이동, 회전 3가지다.
우선 각각의 입력 액션을 생성한다.
들어가면 입력 받을 데이터의 종류를 결정할 수 있는데, 점프는 Digital, 이동과 회전은 Axis 2D로 설정했다. 점프와 이동은 트리거 설정도 필요하다.
그 다음 입력 매핑 컨텍스트를 생성한다.
방금 만든 입력 액션들을 매핑해주자.
점프는 스페이스 바, 회전은 마우스 XY 2D, 이동은 w,a,s,d 에 매핑해줬다.
이동의 경우 각 키마다 다른 값을 원하므로 모디파이어를 사용하여 원하는 값으로 수정해줘야 한다.
키 | 기본 값 (x, y) | 적용 모디파이어 | 최종 값 (x, y) |
---|---|---|---|
W | (+1, +0) | None (모디파이어 필요 없음) | (+1, +0) |
A | (+0, -1) | Negate, Swizzle (부정, 스위즐) | (-1, +0) |
S | (-1, +0) | Negate (부정) | (-1, +0) |
D | (+0, +1) | Swizzle (스위즐) | (+1, +0) |
블루프린트로 기능 구현
우선 이 클래스가 플레이어의 입력을 받을 수 있도록 세팅해주자.
PlayerContorler0번을 여기에 빙의시키자.
그 다음, 이 캐릭터가 입력 매핑 컨텍스트를 사용할 수 있게 Enhanced Input Local Player Subsystem을 통해 연결해준다.
점프 구현
점프 기능은 이미 Charactor 클래스에서 구현이 되어있으므로 그걸 사용하면 된다.
컴파일 후 결과
회전
회전을 위해 받은 Axis 2D 데이터는 컨트롤러의 Yaw, Pitch에 더하는 방식으로 하용한다.
언리얼 엔진은 왼손 좌표계를 사용하므로 마우스롤 위로 올릴 때 화면이 같이 올라가려면 Y값의 부호를 반대로 사용해야한다.
이대로 적용하면 좌, 우로는 회전이 가능한데 상, 하는 움직이지 않는다. 이건 스프링암의 설정 -> 카메라 세팅 -> 폰 제어 회전 사용을 활성화 시켜주면 된다.
컴파일 후 결과
이동
이동은 Axis 2D를 반환하므로 Vector로 변환해야한다. Vector로 변환시킨 다음, CharactorMovement에 Add Input Vector를 사용한다.
문제 발생
이렇게 설계하면 키 입력은 회전 상태와 관계없이 월드 좌표계를 기준으로 움직이게 된다.
만약 FPS 게임처럼 화면이 회전할 때, 거기에 맞춰 움직이려면 수정이 필요하다.
해결 방법
Actor Forward와 Left 벡터를 가져와 액터의 방향을 구한다.
IA_Move로 받은 입력 벡터의 x 성분은 정면(Forward) 방향에 대한 입력 값을, y 성분은 오른쪽(Right) 방향에 대한 입력 값을 나타낸다. 이 성분들을 각각 Actor의 Forward 벡터와 Right 벡터에 스칼라 곱하고 두 결과를 더해 최종 이동 벡터를 계산한다.
Final Move Vector=(Input X×Forward Vector)+(Input Y×Right Vector)