![[2024-2 겜엔기] Project AS 개발일지 #2](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuohRR%2FbtsJPSjOVjh%2F43me7uBodaBPKjyEFJXC51%2Fimg.png)
저번에 개발을 위한 모든 세팅을 끝내고, 이번에는 진짜 개발에 착수했다.
이번에 목표로 한 것은 플레이어의 이동을 완벽히 하는 것이다.
목표를 과연 달성했을까?
Aim Offset
FPS 장르이기에 에임 구현은 무엇보다도 필수이다. 그리고 투사체 구현은 나중이기 때문에, 일단 플레이어 캐릭터가 내가 마우스를 돌리는 시점을 보게 하는 것을 구현해야함을 느꼈다.
구글에 정말 여러가지 검색을 한 끝에, 이러한 것을 Aim Offset이라고 부른다는것을 알게 되었다.
Aim Offset을 정확히 설명하자면, '캐릭터의 상반신 움직임이 에임을 따라오게 하는 것' 이다.
그래서, 에셋에서 기본 제공되는 걸 이용해서 에임을 따라오게끔 해줬다.

일단 이 블루프린트는 에셋에서 주는 기본 애니메이션 BP이다. 근데, 그냥 실행하면 에임 오프셋이 동작하지 않았다.
수 많은 삽질끝에 얻은 정보는, 저 가운데에 큰 노드의 Alpha값을 1로 설정해주어야 동작한다는 것이다.
초기값이 0으로 되어있었는데 저거 문제인줄 모르고 진짜 헤맸다...
아무튼 이렇게만 해주면, 마우스 움직임에 따라 상체가 따라와준다.
멈춘 상태에서 Turn in place
위에서 에임 오프셋을 구현한 것에는 한가지 문제점이 있다. 바로 에임이 플레이어가 보는 방향 기준으로 90도 이상으로 돌아가면 더이상 상체가 따라오지 않는다는 것이다.
그래서, 이것도 구글에 찾아본 끝에 Turn in place라는 것으로 존재한다는 것을 알았다. 검색 삽질만 2시간;;
이번에도 이 Turn in place를 정확히 설명하자면, '상체의 방향이 하체의 방향과 일정 각도 이상 차이가 나면, 하체의 방향을 상체의 방향에 맞춰 똑바로 서게 하는 것' 이라고 할 수 있다.
사실 이건 디테일적인 요소라고 볼수도 있긴 한데, FPS는 워낙 화면이 휙휙 돌아가서 기능적으로나 디테일적으로나 필수라고 느꼈다.
그래서, 유튜브에서 상체가 90도 돌아갔을때의 Turn in place 구현 영상을 찾아 구현해보고, 그걸 응용해 상체가 180도 돌아갔을때 하체가 완전히 뒤를 보도록 하는 것도 구현했다.

이 블루프린트를 짜면서 알게된 것들 몇가지를 정리해봤다. 새로운 노드도 있었고, 약간의 로직도 있었다.
- Sequence 노드
이 노드는 연결된 핀 순서대로 실행해주는 노드다. 위 사진에서 연결된 것을 예로 들면, 0번 핀부터 4번 핀까지 차례로 실행해준다.
얼핏 보면 동시에 실행되는 것처럼 보일 수 있지만, 사실은 순서대로 매우 빨리 실행되는 것이다.
- 컨트롤러 선호 회전 사용
이것은 캐릭터의 설정인데, 이것을 체크해주면 마우스가 움직이는 대로 (여기에서는 Yaw가 바뀌는 대로) 몸이 같이 회전한다.
- 무브먼트 방향으로 회전 조정
이것 또한 캐릭터의 설정은데, 이것을 체크해주면 캐릭터가 움직이는 방향대로 몸이 같이 회전한다.
- Round 노드
이 노드는 플로트값을 인티저로 변환해주는 노드이다. 위에서는 Delta(Rotator)의 Yaw 값을 비교할 때 == 연산자를 사용하기 때문에 사용해주었다. 사용한 이유는, 저 Yaw값이 정확히 0이 되지 않고 엄청나게 작은 소수로 남아있기 때문이다.
요런걸 알게 되었다. 나머지는 동아리에서 했던 언리얼 스터디때 자주 써봐서 나름 친숙했다.
이제 저 블루프린트의 로직을 설명하면,
- 마우스를 돌리는 이벤트가 발생하면,
- 현재 마우스의 돌아감의 정도(Get Control Rotation)와 액터의 회전값 (Get Actor Rotation)을 받아와 이 차이를 계산(Delta)한다.
- 그 후에 그 차이가 얼마나 나는지 구분하여
- 생성해둔 방향 변수와 컨트롤러 회전 / 무브먼트 회전 값을 설정한다.
- 그 후에는 돌아가면 안되기 때문에 다시 모두 False로 설정한다.
이런 로직이다.
한번 True로 바꿨다가 다시 False로 하는 이유는 딱 한번만 상체에 맞춰 돌면 되기 때문이다. 안그러면 변수 후처리가 안되어서 계속 돌아가게 된다.
이제 이걸 기반으로 애니메이션 BP에서 로직을 짜주면 된다.

캐릭터 BP에서 만든 회전용 변수를 가져와 트랜지션에 조건으로 넣어줬다.
이렇게 되면, 상체의 움직임에 따라 하체가 따라오게 된다.
이동 상태에서 Turn in place
이번에도... 멈췄을 때 Turn in place는 한가지 문제가 있다.
바로 이동시에는 안따라온다는거다..! 사실 당연함
그래서 이동시에도 하체가 상체를 따라오게 하려고 했다.
그런데... 생각해보니 조금 달랐다. 멈췄을 때에는 상체가 몸의 방향을 결정하는 주 요소지만, 이동을 할 때에는 하체가 몸의 방향을 결정하는 주 요소이다.
다시 말하면, 이동을 할 때에는 상체가 고정되고 하체가 돌아가야 한다는 말이다.
그래서 상체가 고정되고 하체만 방향대로 모션을 출력하게 했다.

원래 에셋에 있던 이동 인풋 시스템을 마개조했다.
이 블루프린트는 따로 강의도 없을 뿐더러 구글에서도 찾아볼수 없어서, 위에서 멈췄을 때 Turn in place를 응용하여 오로지 나 혼자만의 힘으로 짠 것이다. ㅎㅎ
이번에도 로직을 설명하자면,
- 이동 키를 누르는 입력이 들어오면,
- 일단 그 방향으로 벡터값을 넣어 움직이게 해준다.
- 그 후에 어디 방향인지 Axis값으로 체크하여
- 해당 방향 변수를 True로 설정한다. 이 때 한 방향의 반대 방향이 되는 변수는 False로 설정한다.
- 그 후에 현재 이동중인지 액터의 속도를 받아와 판단하고,
- 이동중이라면 컨트롤러 회전 사용을 True로 하여 에임에 따라 모든 몸체가 같이 따라오게끔 하고, 아니면 멈췄을 때 Turn in place의 경우로 돌아간다.
- 마지막으로 방향 변수를 이동 Axis 값이 0인지 아닌지 판단해 상하 / 좌우 변수를 초기화한다.
이런 로직이다.
사실 7번 과정은 바로 생각해내지 못했다. 애니메이션이 출력될 때 특정 조건에서 슬릭백을 추는 것을 보고 일일이 로그를 찍어보다가 초기화가 안된다는 것을 발견하고 추가한 것이다.
그리고 실제 애니메이션 출력을 위해 애니메이션 BP에도 추가로 짜줬다.

Jog~~~SlopeLean은 각각 그 방향에 해당하는 발 모션 애니메이션이다. 다행히 이것들은 에셋에 포함된 것들이었다.
JogStart 에서 발 모션으로 넘어가는 트랜지션은 아까 만들어둔 방향 변수를 사용했다.
그리고 각각의 발 모션에서 발 모션으로 넘어가는 트랜지션은 넘어가려고 하는 모션의 방향 변수가 True이고 현재 방향 변수가 False일 경우에 넘어가도록 했다.
추가로, 위로 향하는 키와 오른쪽에서 향하는 키를 동시에 누르는 경우처럼 두 방향이 동시에 들어와 대각선으로 이동할 때, 시점 기준 앞 보다는 옆으로 이동하는 발 모션을 보여주는것이 자연스러워서 Fwd/Bwd 에서 Right/Left로 넘어가는 트랜지션에는 단순히 좌우 방향 변수만 넣어 우선순위를 올려주었다.
이것까지 하고 나면... 궁극의 플레이어 이동이 완성되게 된다.
이번에 구현한걸 정리하면,
플레이어가 보는 방향에 따라 하체는 고정된 채로 몸이 회전하고, 어느정도 돌아가면 하체가 자세를 고쳐잡는다.
그리고 이동하는 방향대로 발을 움직여 자연스럽게 한다.
이렇게 쓰고보니 진짜 디테일적인 요소지만, 이런게 없으면 실제 게임 플레이에서 엄청난 부자연스러움을 느끼기 때문에 제일 우선으로 구현한 것 같다.
결론적으로 목표는 200% 달성했다!! 완전 뿌듯
이제 다음에 할 일은 실제 에임을 구현하고 거기에 맞춰 투사체를 발사하는 것을 하려고 한다.
이동보다는... 빡세겠지?

'팀 프로젝트 > Side Project' 카테고리의 다른 글
[2024-2 겜엔기] Project AS 개발일지 #4 (2) | 2024.11.01 |
---|---|
[2024-2 겜엔기] Project AS 개발일지 #3 (1) | 2024.10.07 |
[2024-2 겜엔기] Project AS 개발일지 #1 (0) | 2024.09.29 |
[Side Project] Project KS 개발일지 (4) | 2024.09.09 |
안녕하세요! 코드 짜는 농부입니다! 경희대학교 소프트웨어융합학과 23학번 재학중입니다. 문의 : dsblue_jun@khu.ac.kr
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!