멈추지 않고 끈질기게
[Unity][포트폴리오] Rigidbody.AddForce()가 제대로 동작하지 않는 이슈 본문
※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.
※ 해당 포스팅은 Unity 2021.3.15f1 버전을 기준으로 작성되었습니다.
※ 개발 중인 유니티 3D 포트폴리오의 내용을 포함하고 있습니다.
서문
개발중인 3D 프로젝트에서 계속 골머리를 앓고 있던 이슈가 있었습니다. Rigidbody.AddForce() 함수가 y축으로만 정상 동작하고, x축 또는 z축으로는 제대로 동작하지 않는 것이었습니다. y축으로는 힘을 조금만 주어도 잘 뛰어오르는 데 반해, x축이나 z축으로는 큰 힘을 주어도 잘 날아가지 않고 더 큰 힘을 주다보면 마치 순간이동 하듯이 부자연스럽게 이동하는 모습을 보였습니다.
위 영상에서 파란 튜브는 닿는 순간 AddForce()를 통해 힘을 주는 오브젝트이며 왼쪽 발판은 y축으로, 오른쪽 발판은 z축으로 힘을 주도록 회전시켜둔 상태입니다. 영상을 보시면 y축으로는 자연스럽게 힘을 받아 높게 점프하지만, z축으로는 힘을 받지 않아 무반응인 모습을 볼 수 있습니다. 해당 이슈 때문에 장애물과 충돌 시 넉백 시스템을 제대로 구현하지 못하고 있었는데, 드디어 해결책을 찾아 수정하게 되었습니다.
원인
수차례 검색하며 찾아본 결과, 유니티 토론장 글의 한 댓글에서 해결책을 찾을 수 있었습니다.
https://discussions.unity.com/t/rigidbody2d-addforce-impulse-not-working-on-x-axis/169779/4
범인은 Animator의 Apply Root Motion 옵션이었습니다. 찾아보니 해당 옵션은 애니메이터가 오브젝트의 트랜스폼 정보를 수정할 수 있는지 여부를 정하는 것인데, 스크립트를 통해 오브젝트의 움직임을 구현한 경우 스크립트와 애니메이터의 양쪽에서 움직임을 제어하려고 하니 충돌이 일어나서 문제가 발생할 수 있다는 것입니다.
제 프로젝트의 경우에는 플레이어 캐릭터의 애니메이터가 y축 정보를 수정하는 부분은 없어 AddForce()가 y축으로는 잘 동작했고, x축과 z축은 충돌이 일어나서 제대로 반영되지 않은 것으로 보입니다.
해결
간단하게 플레이어 캐릭터의 애니메이터에서 Apply Root Motion 옵션을 해제하여 해결할 수 있었습니다.
이렇게 완전히 Apply Root Motion을 해제하는 방법 외에도 각 애니메이션의 Root Transform Position(Y, XZ) 옵션을 조절하여 스크립트 제어와 애니메이터 제어가 충돌하는 이슈를 해결할 수 있다고 합니다. 다만 개발중인 프로젝트에서 플레이어 캐릭터는 완전히 스크립트 제어로 구현중이고, 점프 발판 등 외부에서 AddForce()를 통해 힘을 가하는 상황이 많으므로 확실한 제어 충돌 방지를 위해 Apply Root Motion을 아예 해제하기로 했습니다.
해당 옵션 해제 후 수평 이동 발판, 원형 발판 위에서도 별도의 스크립트 없이 캐릭터가 발판을 따라 움직이게 되어, 관련 코드를 제거하였습니다. 다만 수평 이동 발판에서 발판의 방향 전환 순간에 캐릭터가 밀리는 이슈가 발생하여 해결책을 찾고 있습니다.
'Unity' 카테고리의 다른 글
[Unity] 클릭/터치 인터페이스(IPointerClickHandler, IPointerDownHandler, IPointerUpHandler) (1) | 2023.09.06 |
---|---|
[Unity] Addressable 기능 (0) | 2023.07.27 |
[Unity] 애니메이션 추가하기 (0) | 2023.07.01 |
[Unity][UI] Content Size Fitter (0) | 2023.04.13 |
[Unity][UI] 레이아웃 그룹(Layout Group) (0) | 2023.03.31 |