본문 바로가기

게임 개발 공부/언리얼엔진

언리얼 엔진 5 - 블루프린트를 이용한 플레이어 캐릭터 무브먼트 작성

뭔가를 내맘대로 조종한다는건 굉장히 매력적이다.

차를 운전하거나, 악기를 연주하거나, 조종이라기엔 그렇지만 충분히 쌓인 유대감과 훈련으로 내 뜻을 읽고 움직여주는

반려동물까지. 어떤 경우엔 사람을 그렇게하기도 한다. 친구의 약점을 잡고 짖굳은 장난을 시키거나, 비용을 지불하고

인력을 고용해서 일을 시키기도 한다.

 

인간의 본성인걸까, 망가진 정서일까. 때론 그게 끔찍한 선까지 넘어가기도 한다. 누군가에게 상처를 주기도 하고 때로는

뉴스에 오르내리기도 한다. 현실에선 일어나선 안되는 일이다.

 

그런 면에서 게임 캐릭터는 참 고마운 존재다.

게임의 룰 안에선 시키는대로 모두 들어준다. 앞으로 가라면 가고, 웃으라면 웃고, 카드를 내라고하면 내고, 말을 걸라고하면

말을 건다. 어떨 땐 그런 캐릭터가 상처입거나 목숨을 다하면 미안하기도 하다. 날 위해 그렇게 열심히 해줬는데.. 좀 더 잘

피해볼 걸..

 

현실에서 이런 행위엔 지불할 대가가 필요하다. 운전이나 연주를 노력들여 연습해야하고,

오랜 시간을 보내며 반려동물과 유대감을 쌓아야하고, 인력을 고용하기 위해 돈을 지불해야한다.

 

그러나 게임에선 그런 대가는 모두 개발자의 몫이다. 미안한 일이 생기지 않도록 더욱 편의성 있는 조작법을 구성해야하고,

조종하기 위해 필요한 노력과 수고는 개발 과정에서 쏟아 부어야한다. 플레이어는 그저 재밌게 플레이하면 된다.

*그러나 비장한 것에 비해 예전보다 많이 간편해졌다..

 


캐릭터 무브먼트 작성

  • 블루프린트 생성
       1 - 블루프린트 클래스를 캐릭터 클래스로 생성한다.
       2 - 메시를 원하는 메시로 교체해준다.
       3 - 스프링암 컴포넌트와 카메라 컴포넌트를 추가해준다.
  • 입력 액션 (Input Action, IA) :
         입력받은 아날로그 신호를 어떤 타입으로 처리할지 설정하는 데이터 에셋.
         필요한 값 타입의 따라서 다음과 같이 값 타입을 설정해준다.
         - 한번의 신호만 받으려면 Digital (bool) *e.g. 일관된 점프, 아이템 줍기
         - 서서히 강해지거나 약해지는 신호를 받으려면 Axis 1D (float) *e.g. 노브, 엑셀레이터, 브레이크
         - 평면 위의 좌표를 이용하는 신호를 받으려면 Axis 2D (Vector2D) *e.g. 마우스, 게임패드 썸스틱
         - 공간의 좌표를 이용하는 신호를 받으려면 Axis 3D (Vector)  *e.g. 모션 컨트롤러

        Move입력액션과 Look입력액션은 값 타입을 Axis 2D로 설정해주었고, 트리거 신호만 주면 되는 Jump입력액션은 Digital 부울로 값 타입을 설정해주었다.




  • 입력 매핑 컨텍스트 (Input Mapping Context, IMC)
         입력 액션에서 정한 값 타입에 보내줄 신호가 어떤 신호인지 정의해주고 해당 신호를 이용해 캐릭터를
         어떤 방식으로 움직이게 할지 설정하는 데이터 에셋.
         모디파이어 항목에서 방향을 지정해 줄 수 있다.   

         - FOV 스케일링 (Fov Scaling)
               - 입력 값을 플레이어의 시야(Field of View)에 따라 스케일링함
               -  FOV에 따라 입력 값이 자연스럽게 조정되도록 할 때 유용
               -  e.g. 줌 인/줌 아웃 시 이동 속도가 적절히 조정되도록 설정

         - 데드 존 (Dead Zone)
                - 입력 값이 특정 임계값 이하일 경우 0으로 처리
                - 조이스틱 또는 아날로그 입력의 미세한 떨림(노이즈) 제거 (하이패스 필터처럼)
                - e.g. 컨트롤러 스틱을 중앙에서 살짝 움직였을 때 발생하는 불필요한 입력 방지

         - 델타 시간으로 스케일링 (Delta Time Scaling)
                 - 입력 값을 프레임 독립적으로 조정하기 위해 델타 시간에 기반해 스케일링
                 - 프레임 속도(Frame Rate)에 관계없이 입력 동작이 일관되도록 설정
                 - e.g. 일정한 속도로 캐릭터가 회전하거나 움직이는 동작

         - 반응 커브 - 사용자 정의 (Response Curve - User Defined)
                 - 입력 값에 사용자 정의 커브를 적용해 비선형적으로 수정
                 - 입력의 민감도나 비율을 커스터마이징
                 - e.g. 스틱을 천천히 밀면 이동이 느리고, 완전히 밀면 빠르게 이동

         - 반응 커브 - 익스포넨셜 (Response Curve - Exponentioal)
                  - 입력 값에 지수 함수(exponential)를 적용해 조정
                  - 입력의 점진적 증가 또는 감소 효과를 구현
                  - e.g. 조이스틱 입력의 초반에는 천천히 반응하고, 끝으로 갈수록 빠르게 반응
     
         - 부정 (Invert)
                  - 입력 값을 반대로 바꿈(e.g. 1 → -1)
                  - 축 입력을 반전
                  - e.g. 마우스 축 반전(위로 움직이면 아래로, 아래로 움직이면 위로)

         - 스무드 (smooth)
                   - 입력 값을 부드럽게(스무스하게) 처리하여 갑작스러운 변화 제거
                   - 카메라 이동이나 회전 등에서 입력 변화가 부드럽게 느껴지도록 설정
                   - e.g. 조이스틱 입력에 따라 부드럽게 회전

         - 스무드 델타 (Smooth Delta)
                    - 프레임 기반 델타 값을 사용해 입력 변화를 부드럽게 처리
                    - 부드럽고 일관된 동작을 보장
                    - e.g. 일정 속도로 부드럽게 이동하거나 회전

         - 스위즐 입력 축 값 (Swizzle Input Axis Values)
                     - 입력 축(x, y, z)을 재배치하거나 스위즐(swizzle) 처리
                     - 입력 데이터의 축을 변경하거나 재구성
                     - e.g. 좌표계를 변환하거나 사용자 정의 축 배열 사용

         - 스칼라 (Scalar)
                     - 입력 값을 곱하기(스케일)로 조정
                     - 입력 값을 배율로 조정해 크기를 조절
                     - e.g. 캐릭터의 이동 속도나 회전 속도를 조정

         - 월드 스페이스로 (To World Space)
                     - 입력 값을 월드 좌표계 기준으로 변환
                     - 로컬 좌표 입력(플레이어 기준)을 월드 좌표계로 변환
                     - e.g. 플레이어가 보는 방향과 무관하게 월드 기준 방향으로 이동

    옵션을 하나씩 알아본 결과, 모디파이어의 역할은 단순히 조작을 설정해주는 것 뿐 아니라 조작의 최적화에도 관여한다는 걸 알게 되었다.
    해당 컨텍스트에선 다음과 같이 설정했다.
매핑 모디파이어
w 전진  
s 후진 부정 (Invert)
a 스위즐 입력 축 값 (Swizzle Input Axis Values) , 부정 (Invet)
d 스위즐 입력 축 값 (Swizzle Input Axis Values) 
마우스 시야 부정 (Invert) - Y축



  • 블루프린트 노드 흐름


        - 매핑 컨텍스트 연결

    Event BeginPlay를 트리거로 게임이 시작되면 Enhanced Input Local Player Subsystem을 통해 플레이어의 컨트롤러에 IMC를 연결해준다.
      * Enhanced Input Local Player Subsystem : 각 로컬 플레이어에 대한 입력 바인딩과 처리를 독립적으로 관리하는 시스템



                                                                             
        - 무브 세팅


    Enhanced Input Action에 해당하는 Move 입력 액션 데이터를 불러 트리거드로 실행해주고 컨트롤 로테이션의 Yaw값을 Get Forward Vector와 Get Right Vector에 보내주어 Movement Input에 기준 축 정보를 보내주었다.



        - 룩 세팅

    컨트롤러 Yaw인풋과 Pitch인풋에 마우스 움직임으로부터 2D벡터값을 받는 Enhanced Input Action 이벤트의 x와 y값을 각각 연결해주었다. 실행은 지속값을 보내는 트리거드를 통해 연결했다.




         - 점프 세팅


    마찬가지로 스페이스의 부울 인풋값을 받는 Enhanced Input Action 이벤트를 한번의 신호를 보내는 Started를 이용해 Jump노드로 연결해주었다.




  • 마지막으로 중력 스케일 값과 점프Z속도 값을 수정해주어 자연스러운 점프를 구현하도록 했다.





  • 결과

 

성공적으로 무브먼트를 구현했다.

 

이제 애니메이션과 상호작용 기능을 추가해 나가야겠다.