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

RPG 게임 기능 2 - Motion Warping 2 : 모션 워핑 기능 처음부터 다시 해보기 본문

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

RPG 게임 기능 2 - Motion Warping 2 : 모션 워핑 기능 처음부터 다시 해보기

huenuri 2024. 8. 25. 14:41

앞서 작업했던 언리얼 동영상은 너무 빠르고 어려운 것 같아 모션 워핑에 관한 다른 동영상을 찾아서 학습하기로 했다.

모션 워핑은 플레이어가 물체을 타고 오를때 물체의 높이, 깊이, 착지 지점을 감지할 때 사용한다. 이 세 가지의 입력을 모션 워핑 구성 요소에 공급하면 객체의 높이가 적절하게 작동한다.
이렇게 되면 모든 크기나 종류의 장애물 위로 캐릭터가 잘 떨어질 수 있게 된다.

모션 워핑 동영상 학습


 

 

모션 워핑 만들기

 

키프레임으로 3가지 상태 만들기

첫번째 모션

 

앞서 동영상과 달리 Z축을 무시하는 부분을 체크 해제한다.

 

 

 

 

 

두번째, 세번째 모션

 

여기서도 Z축을 무시하고 회전도 체크 해제한다. 설정한 다음 저장하는 것도 잊지 말자.


 

 

모션 워핑 캐릭터 설정하기

 

BP 플레이어 Event Graph에서

스페이스 바를 누르면 벽을 타는 테스트 몽타주가 생성되도록 블루프린트를 만든다.
앞서 만들었던 작업처럼 왼쪽 shift를 누를 때 작동하는 것으로 해보았는데 점프가 되지 않아 그 자리에서 벽을 타게 되어 올라가는 느낌이 없어진다. 그러니까 space bar로 받는 것이 좋겠다.

애니메이션 블루프린트로 이동한 후 다음과 같은 노드를 만든다.

 

여기서 주의할 점은 Montage to Play에서 에셋을 설정해야 한다. 자신이 가져온 벽 타기 애니메이션을 선택하는데, 이걸 하지 않으면 동작이 되지 않는다.

 

 

 

 

 


 

 

 

 

장애물을 제대로 통과하도록 만들기

지금은 장애물을 통과해버리므로 충돌이 제대로 작동하기 위해 착지 지점과 장애물의 깊이도 지정해야 한다.

 

위치 감지를 하는 추적 만들기

 

Space bar 노드를 끊고 위치 감지를 위한 추척을 설정한다.

for loop를 만들고 0에서 4로 설정한다. 내 액터 위치를 구하는데, 30 정도로 곱한 벡터를 만들고 이것을 z 구성 요소에 추가한다. 여기 사이에 float를 변형해 연결하면 된다.

이것을 시작 위치로 설정하고, 채널에서 반경을 5, 기간을 4로 설정했는지 알 수 있다.

 

그런 다음 시작과 끝 위치를 구한다.

 

 

 

 

 

 

 

 

 

 

 

결과를 깨뜨릴 루프 만들기

결과를 깨뜨릴 루프를 하나 만든다. 자세한 설명은 지난 포스트에서 했으므로 생략한다.

 

루프를 깨뜨릴 사용자 지정 이벤트를 만들고 break 핀에 연결한다.
앞에서 만든 이벤트를 불러와서 branch에 연결하는데, 이것은 트레이스가 뭔가에 부딪히면 첫번째 루프는 끊는 것이다.

 

 

 

 

 

 

 

 

트레이스가 뭔가에 부딪혔는지 확인할 수 있다.


 

 

세 지점을 표시할 원 만들기

 

두번째 루프 만들기

장애물의 깊이를 찾을 것이므로 부딪히는 위치를 파악해 90이나 100을 추가한다.

 

액터 위치를 곱하고 더해준 후 마지막에 뺀 값을 채널의 끝점에 추가한다.

 

 

 

 

 

 

 

이제 위에 있는 라인도 잘 표시가 되는 것을 볼 수 있다. 아까와 비슷한 블루프린트였는데 왜 그때는 안 되었는지 생각해보았다. 강사는 -를 1000으로 곱해주라고 했는데 이렇게 하니 깊이가 너무 낮아서 표시가 안된 거였다. +로 하면 이 표시가 위로 올라간다.

시퀀스 노드를 하나 만들고 인덱스 값을 가져온다. 인덱스 값이 2배가 되면 0이 되고, 이는 첫번째 트레이스의 시작점이 된다. 이를 분기하여 히트 위로 잡을 것이다. location을 변수로 승격하고, 이름을 SYncPoint1으로 변경하였다.

 

 

 

 

 

카테고리를 설정하여 비슷한 것은 묶어준다.

 

근데 계속 연구해봤는데 첫번째 루프의 원이 바닥에 표시되고 있다. 높이를 낮추어도 그렇고..

 

 

 

 

 

 

이유를 알았다. 위치를 바닥에 딱 맞게 설정하지 않으면 원이 밑으로 내려간다.

 

 

 

 

 

 

중간 지점의 원 만들기

 

여기서 중요한 점은 draw Debug를 만들 때 꼭 Center와 연결해주어야 한다는 것이다. 이것을 하지 않아서 조금 전에도 그렇고 이번에도 얼마나 많은 시간을 허비했는지 모른다.

 

 

 

 

 

 

 

 

 

 

 

끝 지점 설정하기

이 과정을 계속해서 만들게 할 예정이므로 착지 위치도 지정한다.

 

조금 전에 구했던 방식과 비슷하다. 액터 위치를 곱해서 더한 값의 위치를 빼준다. 그런 다음 아주 긴 화살표를 만들어서 루프를 끊어주는 노드를 만들어준다.

 

 

 

 

 

몇 가지 설정을 바꾸어주고 연결해준다.

 

 

근데 난 착지 지점의 선은 만들어지지 않았다. 4번 이상 시도했음에도 되지 않는 문제이니 넘어가기로 하자.


 

 

 

언리얼 학습을 마치고

아직 할 게 남았는데 분량이 너무 많아서 여기서 끝마치려고 한다. 아침에는 안 되는 게 너무나 많아 절망적이었으나 그래도 끝까지 포기하지 않고 작업을 이어가보았다.
될때까지 보고 또 보며 연습을 해보니 이제는 잘 되었다. 다음에는 언리얼 학습은 내가 할 수 있다고 생각하는 것의 5배 이상을 줄여서 계획하려고 한다. 난 남들보다 프로그램을 다루는 능력도 많이 부족하고 작업 속도도 굉장히 느린 편이다.


학원에서 사람들은 고급 기능을 만들고 무척 진도가 빨라 술술 나가는데, 난 여전히 애니메이션 겨우 한 가지와 레이 기능을 해보는 중이다.

이렇게 안 되고 기본도 전혀 없지만 적어도 포기는 하지 않을 것이다! 주말에 계속 언리얼을 한다고 해도 내가 할 수 있는 건 아마 45분짜리 동영상 2~3개에 불과할 것 같다.