info8995 님의 블로그

4일차(캐릭터움직임구현) 본문

TIL(Today I Learned)/Unreal Engine

4일차(캐릭터움직임구현)

info8995 2024. 12. 19. 20:00

오늘해 볼 것은 블루프린트와 엔진 기능을 활용해 직접 캐릭터를 설정하는 것입니다.

캐릭터의 외형, 시점, 이동 및 점프와 같은 기본적인 동작을 구현하게 됩니다. 언리얼 엔진의 블루프린트 시스템향상된 입력 시스템을 사용하여 코드 작성 없이도 다양한 기능을 적용할 수 있습니다.

가장 먼저 블루프린트 클래스를 만들어줍니다. 블루프린트 이름은 BP_bot으로 했습니다. 만든 블루프린트 클래스를 더블클리해서 들어가 보겠습니다. 

화살표 컴포넌트는 캐릭터의 방향을 표시할때 유용합니다

springarm은 우리가 흔히쓰는 셀카봉이라고 생각하면 편한데요 springArm에 카메라를 붙여서 사용합니다

메시는 캐릭터의 외형을 설정하는데요 에셋(https://www.fab.com/ko/listings/235d006c-4627-4d77-857e-3f9dbb88f147)에서 다운받은 캐릭터를설정해보았습니다. 기본적인 설정들을 마치고 이제 캐릭터에 기능을 추가해보겠습니다.

 

입력 액션, 입력 매핑 컨텍스트파일을 각각 2,1씩 만들고 이름들을 IA_zxc_look, IA_zxc_move, IMC_zxc_defaultmappingcontext로 지었습니다.
Look과 Move는 X, Y 축을 모두 사용하기 때문에 ‘IA_ZXC_Look’을 더블 클릭한 후 설정값에서 ‘Axis 2D’ 를 선택합니다. Move 도 같은 값으로 세팅하면 됩니다.

‘IMC_ZXC_DefaultMappingContext’는 아래와 같이 세팅을 해줍니다.

wasd버튼을 누르면 움직이는(w앞,a왼쪽,s뒤,d오른쪽)으로 이동할수있게 새팅했습니다.

캐릭터는 기본적으로 X축 방향을 보고 있기때문에 전진하는 W 에는 모디파이어가 없습니다.

S는 뒤쪽으로 이동하기때문에 X축의 부정

D는 오른쪽으로 이동하기때문에 Y축 방향인 스위즐 입력 측 값

A는 왼쪽으로 이동하기떄문에 Y축 방향 스위즐 입력 측 값과 부정으로 설정했습니다.

다시 BP_bot로 넘어가서 이벤트그래프로 들어갑니다.

이벤트가 시작했을때(액터가 생성된 이후) ‘Get Player Controller’로 현재 플레이어의 컨트롤러에 연결된 인풋들을 찾아서 매핑컨텍스트와 연동하는 이벤트입니다.

여기서 수업을 놓쳤는데 여기서부터가 문제였습니다. add mapping context안에 mapping cotext에 체크박스가 있는데 저기서 IMC_zxc_defaultmappingcontext를 선택해야지만 캐릭터가 움직이는데 그 부분을 놓쳐서 1시간?정도를 해맸습니다. 찾다 찾다 어디가 틀렸는지 몰라서 팀원분들한테 물어봤는데 알려주시더라고요 너무 감사했습니다 여러분들은 그런 실수를 하지 말아주세요ㅎㅎ;

enhanced ... 이라는 박스는 저렇게 intput local이라고 하면 나오더라고요

 

이벤트 그래프에서 마우스 오른쪽을 클릭 > **‘IA_zxc_MOVE’**를 검색, 노드를 추가합니다.

이벤트 노드의 ‘Action Value’ 오른쪽 클릭 **‘구조체 핀 분할’**을 클릭해 X, Y 값을 각각 사용할 수 있도록 분할해줍니다.

 

인풋 맵핑 컨텍스트에서 설정해준 것과 같이 X 값으로는 앞, 뒤 이동을 하며, Y 값으로는 좌, 우 이동을 합니다. 이 때, 사용하는 노드들은 ‘Get Actor Forward Vector’ ‘Get Actor Right Vector’ 입니다. 이 2개의 노드들에서 월드를 기준으로 액터의 벡터 값을 계산한 수를 받아 인풋 액션의 X, Y 값 만큼 이동시켜줍니다.

뷰포트로 돌아가 캐릭터를 선택 디테일 패널에서 ‘빙의’ 혹은 ‘possess’ 를 검색합니다.

플레이어 자동 빙의 > ‘Player 0’ 를 선택, 플레이 버튼을 클릭해 캐릭터를 이동시켜봅시다.

그러면 캐릭터가 움직이기 시작합니다. 이렇게하면 캐릭터가 움직이지만 a,d를 누르면 a방향으로 이동하는게 아니라 회전만합니다. 월드를 기준으로 캐릭터가 회전을 해서 한자리에서 빙글빙글돈건데요

정상적으로 움직일려아래처럼 다시 해봅시다. 아래의 노드들은 현재 컨트롤러를 기준으로 구현한겁니다.

여기서 궁금한것이 있을겁니다. "그래 yaw는 회전이니깐 연결한 이유를 알겠어 근데 roll은 왜 연결한거야?" 생각하실텐데요 저도 그 생각을 했고 팀원들한테 물어보니깐 roll은 방지턱같은 지형이 험한곳을 지나갈때 흔들림?같은것을 자연스럽게 카메라에 잡을수 있다고 하더라고요. 

 

이제 캐릭터가 움직이기 시작했으니 마우스로 시점도 바꿔보도록하겠습니다.

Move 때와 같이 구조체 핀 분할하여 X 는 Yaw (좌우), Y 는 Pitch (상하) 에 연결해줍니다.

이 때 사용하는 노드들은 ‘Add Controller Yaw Input’‘Add Controller Pitch Input’ 입니다.

캐릭터 무브먼트 컴포넌트의 ‘무브먼트 방향으로 회전 조정’을 체크해줍니다.

 

스프링 암 컴포넌트의 ‘폰 제어 회전 사용’을 체크해줍니다.

카메라의 피치(상하)가 반대인 것 같아 마지막으로 IMC_ZXC_DefaultMappingContext 에서 마우스의 Y축을 반전시켜주도록 하겠습니다.

그리고 캐릭터를 움직일때 빠질 수 없는 점프도 넣어보겠습니다. IA_ZXC_JUMP 입력 액션을 하나 만듭니다.

 IMC_ZXC_DefaultMappingContext에 매핑 추가하고 점프를 넣습니다.

마지막으로 블루프린트에 이벤트 노드에서 불러와 Jump 와 연결합니다.

이렇게 모든 작업을 마무리하면 직접 조종할 수 있는 캐릭터를 만들 수가 있습니다. 어제는 블루프린트를 이용해봤고 오늘은 블루프린트를 이용하여 에셋도 움직여봤습니다 아직도 언리얼 엔진이 익숙하지 않아서 그런지 간단한 것들도 많은 시간들이 필요하지만 끝까지 포기하지 않고 7개월동안 열심히 공부해보겠습니다. 화이팅!