반응형

2023.05.19 - [Language/Unity] - [Unity/유니티] Transform 컴포넌트를 사용한 다양한 오브젝트 이동 방법

 

[Unity/유니티] Transform 컴포넌트를 사용한 다양한 오브젝트 이동 방법

유니티 엔진을 사용하면서 항상 '오브젝트를 움직여야하는 경우에 어떤 방법으로 오브젝트의 움직임을 제어해야 하는가?' 하는 고민을 해왔다. Transform? Rigidbody? 만약 Transform을 사용하려 해도 Pos

solution94.tistory.com

'Transform' 컴포넌트는 모든 오브젝트들에 필수적으로 존재하며 이를 사용한 이동 방법에 대해서 이전 글에서 알아보았다. 하지만 'Rigidbody' 컴포넌트 또한 오브젝트의 이동을 구현해 줄 수 있는 기능을 갖고 있다. 개인적으로는 보통 물리적인 상호작용이나 중력 등이 필요 없는 경우의 오브젝트일 경우는 'Transform'을 사용해왔고 그렇지 않은 오브젝트들에서는 'Rigidbody'를 사용해왔다. 항상 자세히 알지도 못하고 사용해 왔기에 적재적소에 사용해 왔다고 말할 수 없는 상태였다. 그래서 알아보았다. 움직임을 구현할 수 있는 이 두 컴포넌트들의 차이점은 무엇일까? 'Transform'의 경우 이미 이전 글에서 다뤘었으므로 이번 글에서는 'Rigidbody' 컴포넌트에 대해서만 추가로 알아보고 그 차이에 대해 알아보려 한다.


 

Rigidbody는 뭐지?

https://docs.unity3d.com/kr/2021.3/Manual/class-Rigidbody.html

 

리지드바디 - Unity 매뉴얼

Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을

docs.unity3d.com

리지드바디는 평소 사용하던 대로 물리적인 제어로 게임 오브젝트를 동작하게 만들 때 사용하는 컴포넌트라고 한다. 단순하게는 중력과 충돌에 영향을 받는 오브젝트로 만들고 싶을 때 사용하는 컴포넌트이지만 깊숙이 들어가 보면 물리 작용을 위한 여러 프로퍼티들이 존재한다.

간단한 예시로 'Mass'는 말 그대로 질량을 나타내고, 'Drag'는 공기 저항의 영향을 얼마나 받을 지와 같은 게임 오브젝트에 보다 더 사실적인 물리 영향을 줄 수 있다.

 

 

그래서 Rigidbody 이동과 Transform 이동은 뭐가 다른거지?

자, 리지드바디가 어떤 컴포넌트이고 어떤 기능을 하는지도 알아봤으니 다시 주제였던 'Transform' 이동과 'Rigidbody' 이동은 어떤 차이가 있는가?로 돌아오자.

이는 생각보다 복잡하지 않았고, 이미 많은 유니티 개발자들이 궁금해하는 내용이었기에 어렵지 않게 여러 글들을 접할 수 있었는데, 결과적으로는 '물리적인 연산으로 행해지는 이동인가?'로 정리할 수 있을 것 같다.

https://answers.unity.com/questions/789843/rigidbody-vs-transform.html

 

Rigidbody vs. Transform - Unity Answers

 

answers.unity.com

'Transform' 이동은 우리 눈에 보이기에는 계속해서 움직이는 것처럼 보이지만 사실은 해당 위치로 연속적인 순간이동을 통해 움직이는 것 처럼 보이는 것이고,

'Rigidbody' 이동은 이전 위치와 다음 위치를 빠르게 이동한다는 것이다.

 

 

그러면 이 두 가지의 움직임은 어떤 경우에 사용하는 거지?

퍼포먼스적으로도 차이가 난다고 하지만 용도에 맞게 사용하려면 최적화를 위해 둘 중 한 가지 방법으로만 사용하기는 불가능해 보인다는 것이 내 개인적인 생각이다. 단적인 예로 FPS 장르처럼 플레이어 오브젝트를 유저가 직접적으로 움직임을 제어하는 기능을 구현하다 보면 이동을 제한하기 위해 만들어 둔 벽이나 장애물 오브젝트를 뚫고 지나가버리거나 인식하지 못하는 문제들이 생긴다.

이는 자세히 들어가면 해당 움직임을 구현하는 기능이 매 프레임마다 실행되는지, 실행 환경에 따른 보간이 적용되고 있는지, 충돌체 감지 방식이 어떤 것인지 등 복합적인 문제들로 일어나는 현상이지만 복잡한 경우가 아닌 이상 단순한 경우에는 'Transform'으로 이동시킬 경우이다.

위에서 알아봤듯이 'Transform'이동은 다음 위치로 순간이동하는 방식이라 이 과정에서 발생하는 충돌이나 물리적인 연산이 고려되지 않는 상황이 많이 일어난다. 아무것도 모르고 개발하던 시절에도 많이 겪어봤는데 그때는 뭐가 문제인지 몰라서 고생했던 기억이 있다.

때문에 '움직임을 갖는 오브젝트가 중력이나 충돌의 영향을 받아야 하는지?'에 포커싱 해서 어떤 컴포넌트를 사용해서 구현할지 판가름하면 어떨까 싶다.

 

 

마치며

지난 글에 이어 오늘 다룬 내용들은 모두 3D환경일 경우의 내용이다. 물론 2D환경에서도 동일한 컴포넌트가 존재하고 당연하게도 동일한 기능을 수행하긴 하지만, 컴포넌트의 프로퍼티의 차이나 좌표계의 차이가 있으니 알맞게 이해하면 좋을 것 같다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기