클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

유저 캐릭터 동작 만들기 1 - 향상된 입력 시스템(Enhanced Input System) 본문

게임 개발 공부/개인 프로젝트

유저 캐릭터 동작 만들기 1 - 향상된 입력 시스템(Enhanced Input System)

huenuri 2024. 8. 25. 15:35

게임 기획도 했고 이제 본격적인 게임 개발의 세계로 들어가보자. 어디서부터 막혔는지 파악하려면 지금까지 어떤 작업을 해왔는지 그 여정을 따라가보는 것이 좋을 것 같다.

지난 주까지 어떤 작업을 했는지 살펴보기로 하자. 먼저 3인칭으로 된 새 프로젝트를 내 게임 이름으로 만들어주었다.

그런 다음 캐릭터 애니메이션이 작동할 수 있는 키를 입력하는 작업을 했다.


 

향상된 입력 시스템

언리얼 공식 문서

 

Old Input System

 

먼저 Old Input System으로 Action Mappings와 Axis Mappings에 해당 키를 입력해주었다.

  • Axis Mappings : 방향 이동과 같은 연속된 입력
  • Action Mappings : 점프, 발사, 공격 같이 한 번의 입력

2가지 차이점이 있으니 잘 구분하여 키를 입력해준다. WSDA키는 왼쪽과 아래쪽일 때는 scale값을 -로 설정한다.

마우스를 움직이면 시야가 보일 수 있는 키도 하나 만들어준다.


 

 

 

 

블루프린트 만들기

캐릭터 이동 참고 블로그

 

이제 액터 클래스로 블루프린트를 하나 만들고 메시를 설정해준다. add를 클릭한 후 Skeletal Mesh가 있는데 그걸 선택한 후 detail창에서 캐릭터를 하나 선택한다. 난 여성 캐릭터로 하나 가져왔다.

 

 

 

 

 

 

이제 플레이어는 작동이 된다. 그 다음으로 할일은 게임모드를 설정하는 것이다.


 

 

 

게임 모드 설정

 

게임 모드 참고 블로그

자신이 생성한 캐릭터로 플레이기하기 위해서 게임 모드를 변경해주어야 한다.

 

게임 모드

 

게임의 규칙을 결정하고 정보를 처리하는 액터이다. 게임 모드를 결정하는 규칙 예시는 다음과 같다.

  • 플레이어가 게임에 들어오는 방식, 스폰 위치 선택 규칙과 기타 스폰/리스폰 동작 포함 가능
  • 액터간의 상호작용 처리
  • 존재하는 플레이어와 관람자의 수는 물론, 허용된 플레이어와 관람자 최대 수
  • 게임 일시정지 가능 여부, 게임 일시정지 처리 방식
  • 레벨간의 전환, 게임의 시네마틱 모드 시작 여부 포함

 

이러한 게임 모드에서 관리하는 규칙의 특징은 게임 중에 변하지 않을 정보들이라는 것이다. 자주 혹은 종종 변경될 수 있는 정보는 게임 모드에서 관리하지 않는 것이 좋다.

 

 

이렇게 게임 모드로 변경을 해준다. 게임 모드에 관련해서는 여러 자료가 있는데 지금은 너무 깊이있게 들어가면 어려울 것 같아 다음에 알아볼 생각이다.


 

 

카메라 설정

 

Spring Arm 언리얼 공식 문서

스프링 암 컴포넌트는 카메라의 시야가 막히는 상황을 자동으로 처리하는데 사용된다.

보통 캐릭터에 3인칭 시점을 만들 목적으로 카메라 컴포넌트를 추가할 때, 스프링 암도 함께 추가하여 카메라가 레벨의 다른 오브젝트나 지오메트리에 가려지는 상황을 자동으로 처리할 수 있도록 하는 것이 좋다.

카메라가 레벨 오브젝트를 관통하게 되는 경우를 완전히 없앨 수는 없겠지만, 스프링 암의 설정에 따라 카메라 위치를 자동으로 옮겨 부작용을 최소화할 수 있다.

 

 

Old Input System

 

Old Input System 입력 참고 블로그

예전 언리얼 엔진에서는 이 방식으로 많이 사용했었지만, 지금은 향상된 입력 시스템을 이용하니 그냥 소개만 하고 넘어간다.


 

 

 

Enhanced Input System 알아보기

 

Enhanced Input(향상된 입력)은 UE5에서 런타임 리매핑, 복잡한 입력 처리(동시 입력) 등 향상된 입력 기능을 제공하는 플러그인이다.

Enhanced Input은 크게 4가지 특징을 가지고 있다.

  • Input Action
  • Input Mapping Context
  • Modifier
  • Trigger

 

Input Action

 

InputAction(입력 액션)은 액션이 할당되는 부분이다. Input Action에서는 특정 키가 연결되지 않고, 역할에 대한 정보만을 구성하게 된다. 입력받는 정보는 bool, float, Vector 2D, Vector 3D 를 받을 수 있게 되며, 내가 어떤 입력값을 받을지에 따라 이를 정할 수 있다.

가령 '문을 연다', '장비를 착용한다' 와 같은 동작은 bool 값으로 지정하면 되고, 이동 같은 동작은 Vector 2D로 설정해주면 된다.

 

 

Input 메뉴에는 이렇게 5개 정도의 하위 에셋을 만들 수 있게 구성되어 있다.

 

 

 

 

 

 

Input Mapping Context

 

Input Mapping Context(입력 매핑 컨텍스트)는 사용자의 입력값을 만들어둔 인풋 액션과 바인딩하게 된다.

이때 사용자는 여러개의 Input Mapping Context를 가질 수 있으며, 이들은 각각 우선순위가 있어 같은 키를 입력해도 어떤 액션이 나갈지를 지정할 수 있다.

플레이어는 걷기와 인벤토리를 탐색할 때 각각의 Input Mapping Context를 가질 수 있다.
이때 같은 WASD를 누르더라도, 인벤토리를 열었다면 인벤토리를 탐색하도록 우선순위를 정할 수 있다.

 

 

 

Modifier

 

Modifier는 입력 받은 값을 변환해주는 장치이다.

W를 보면 Modifier에서 Swizzle Input Axis Values 가 설정되어 있고, 순서를 YXZ로 두었다

이는 원래는 입력을 받으면 XYZ 의 순서로 받게 되는데(Modifier 가 없다면 w를 누르면 X가 1이 됨) 이를 YXZ 의 순서로 받게 하여 W를 입력 시 Y가 1이 되도록 설정하는 것이다.

 

S를 보면 이번에는 Swizzle Input Axis Values 가 W 와 동일하게 설정되어 있고, Negate 라는 항목이 추가되었다.

Negate는 말에서 알 수 있듯이 입력받은 값을 반대로 해주는 역할이고, 이를 세부적으로 X, Y, Z 각각 정해줄 수 있다.

 

 

Trigger

Trigger 는 Modifier를 통해 입력 받은 값을 어떻게 활용할지 정하게 된다.

가령 총을 쏘기 전에 먼저 에임을 해야한다거나, 짧게 누르면 약공격, 길게 누르면 차지어택이 나간다면, 이를 모두 트리거에서 제어가 가능하다.


 

 

 

 

이제 직접 만들어보기

Input Action으로 3개의 입력키를 받을 것을, Input Mapping Context 에셋도 하나 만든다.

 

 

 

 

 

 

그리고 Input Mapping Context에서 세부 설정을 해준다.

어떤 건 Swizzle로 하고 또 어떤 건 Negate로 해주는 걸까?

 

 

swizzle은 섞는 것이고, negate는 무효화한다는 뜻이다. Swizzle Input Axis Values는 입력축 값이 적용되는 축의 순서를 변경하는데 사용한다. Negate는 모든 입력 값에 -1을 곱한다. 일반적인 입력에서 축의 반대방향으로 영향을 미치게 하기 위해 사용된다.

이제 블루프린트로 노드를 작성하는 것만 남았는데 이 부분은 좀 길어서 다음 포스트에서 이어서 진행해보겠다.


 

 

학습을 마치고

 

이 프로젝트를 만들 당시에는 사람들의 블로그와 언리얼 공식 문서를 참고하며 만들었으나, 솔직히 어떻게 만들었는지 설명해보라고 하면 아무 대답도 못할 것 같았다.

학습일지를 써보며 이제는 혼자서도 충분히 만들 수 있겠다는 생각이 들었다. 손에 익으려면 계속해서 연습하는 수밖에 없다. 처음에는 이 작업도 얼마나 힘들었는지 모른다.

모르는 건 개념부터 확실히 집고 넘어가야 다음에 또 보았을 때 이해할 수 있을 것이다.