본문 바로가기
게임 만들기/파쿠르 용사

물리엔진을 이용한 캐릭터와 플랫폼 이동 문제 해결

by 레오란다 2023. 4. 21.
반응형

파쿠르 용사는 기본적으로 플랫포머 게임입니다.

플랫폼은 정지해 있는 것도 있고 움직이는 것도 있습니다. 그리고 플랫폼의 크기가 다양합니다.

 

기본적으로 생각해 봐야 할 것은

 

"어떻게 플랫폼위에 있는 캐릭터를 플랫폼과 함께 움직이고 그 위를 자유롭게 움직이게 할 것인가"

 

입니다.

 

다양한 방법이 있을 수 있지만 저는 유니티의 특징인 게임 오브젝트의 계층구조를 이용해 구현하기로 했습니다. 

 

오브젝트의 계층구조는 오브젝트가 부모와 자식의 관계가 될 수 있고 자식 객체는 부모 객체의 transform 에 영향을 받는 것을 이용하는 것입니다. 캐릭터를 플랫폼 객체의 자식 객체로 만들고 플랫폼을 움직이면 캐릭터는 플랫폼과 함께 움직이게 됩니다.

 

만약 캐릭터의 이동을 transform의 position 값을 변화시켜서 구현한다면 아무런 문제가 없습니다. 하지만 자연스러운 움직임과 점프를 위해 물리엔진을 이용하면 문제가 발생합니다.

 

 

Rigidbody 와 localScale 의 문제점

플랫폼의 scale 을 x=6, y=1, z=1 크기로 만들고 rigidbody 가 적용된 캐릭터를 플랫폼의 자식 객체로 만들면 자식 객체의 localScale 은 x=0.16666, y=1, z=1 이 됩니다. 문제는 이 상태에서 캐릭터를 rigidbody를 이용해 이동시키면 다음과 같이 캐릭터가 이상하게 변형됩니다. 이는 아마도 물리엔진과 유니티 오브젝트의 계층구조 간의 충돌에 따른 버그가 아닐까 생각됩니다.

 

객체의 이상 변형 현상

 

그러면 Animator 가 적용된 캐릭터는 어떻게 동작할까요? 이 게임의 주인공으로 사용한 무료 에셋 캐릭터를 가지고 위와 동일한 조건으로 실행을 하면 다음과 같이 됩니다.

 

실제 캐릭터에서 발생하는 문제

캐릭터의 모션과 충돌이 일어나 캐릭터가 collider 위에 위치하는 이상 현상이 발생하게 됩니다.

 

해결 방법

처음 위와 같은 문제를 접했을 때 당황했던 기억이 생생합니다. 그렇다고 여기서 포기할 수는 없는 노릇입니다. 위의 문제는 물리적 충돌이 일어나는 객체 사이에 계층적으로 연관이 없으면 발생하지 않기 때문에 플랫폼에 부모 객체를 만들고 캐릭터가 플랫폼에 올라서면 플랫폼 자체가 아닌 플랫폼의 부모객체에 속하도록 했습니다. 즉, 다음과 같은 구조입니다.

 

정상 동작

위의 그림에서 Hierarchy 창에 있는 붉은 색 테두리와 같이 Platform 을 PlatformParent 의 자식 객체로 만들고 용사 캐릭터도 PlatformParent 의 자식 객체로 만들었습니다. 이렇게 하면 캐릭터와 Platform 간에 계층적 연관성이 없기 때문에 아무런 문제가 발생하지 않습니다. 플랫폼의 이동은 PlatformParent 를 움직이면 플랫폼과 캐릭터가 동시에 움직이게 되므로 원래의 목적대로 문제없이 구현할 수 있게 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글