[유니티] Unity 입문하기 4 :: Transform, Rigidbody로 게임 오브젝트 이동시키기
* 이번 글부터는 제가 이전에 만든 자료를 많이 캡처해서 올립니당.
이번 글에서는 유니티 스크립트를 사용해서 게임 오브젝트를 이동시키는 방법에 대해서 설명하겠습니다.
유니티에서는 게임 오브젝트의 위치를 다루기 위한 여러 가지 방법들을 제공해줍니다.
그중에서 가장 대표적으로 Transform, Rigidbody 컴포넌트를 이용하는 방법이 있습니다. 컴포넌트는 기능이라고 저번 포스트에서 설명했습니다. Transform과 Rigidbody는 어떤 기능일까요?
먼저 Transform에 대해 알아봅시다.
Transform은 게임 오브젝트의 위치, 회전, 스케일을 관할합니다. 이와 관련된 함수들도 Transform에 속해있습니다.
모든 게임 오브젝트는 유니티 월드상에 존재해야 하므로 모두 Transform 컴포넌트를 달고 다닌다고도 설명했었습니다.
다음으로 Rigidbody 컴포넌트입니다.
Rigidbody는 물리엔진을 적용받도록 하는 컴포넌트입니다. 그래서 이 컴포넌트를 달고난 이후부터는 중력을 받거나 속도를 부여하거나 물체끼리 충돌을 시키거나 할 수 있게 됩니다.
그런데 이름이 왜 Rigidbody일까요?
Rigidbody는 한국어로 번역하면 강체입니다. 강체란 형태가 고정되어 변하지 않는 물체를 뜻합니다. 우리는 중학교 때 물리를 할 때 모든 물체를 강체(찌그러지지 않는다고) 가정하고 풀었습니다. 주로 물리를 풀 때 Free-Body Diagram을 그렸을 텐데 물체를 점으로 그렸었습니다. 그래서 물리엔진을 담당하는 컴포넌트의 이름이 강체입니다. 우리가 이 컴포넌트를 게임 오브젝트에 추가한다는 것은 강체로 가정하겠다는 뜻이 내포되어 있다는 것이죠.
강체(剛體, Rigid body)란 물리학에서 형태가 고정되어 변하지 않는 물체를 가리킨다. 강체는 외력이 가해져도 모양이나 크기가 변형되지 않는다. 실제 세계에서 모든 물체는 외력을 가함에 따라 조금씩 모양이나 크기가 변형될 수 있으며 따라서 강체라고 할 수 없지만, 변형되는 정도가 무시할 수 있을 만큼 작다면 어떤 물체를 강체로 가정하기도 한다. 물체의 운동을 분석할 때에 보통 물체를 강체로 가정한다.
출처: https://ko.wikipedia.org/wiki/%EA%B0%95%EC%B2%B4
이제 컴포넌트들을 사용해서 게임 오브젝트를 움직여봅시다.
먼저 Transform 컴포넌트를 사용해서 물체를 움직이는 방법입니다.
Scene View에서 Cube를 하나 만드세요. 그리고 스크립트를 하나를 만들고 게임 오브젝트에 넣습니다. 저는 스크립트의 이름을 MoveByTranslate이라고 했습니다.
위의 그림과 같이 생성하신 스크립트의 Update함수를 수정한 후 게임을 실행시켜보겠습니다. 잘 움직이시나영?
스크립트에서 transform변수는 부착한 게임 오브젝트의 Transform컴포넌트를 자동으로 불러와줍니다. 그리고 Transform에는 매 프레임마다 인자로 준 좌표만큼 움직이는 함수인 Translate이 있습니다. 우리는 그것을 호출해준 것이죠!
void Update()
{
transform.Translate(1,0,0);
}
위와 같이 업데이트 함수를 짜면 어떻게 될까요? 그렇다면 매 프레임마다 1 유니티 미터만큼 움직이게 됩니다. 그런데 이렇게 짜면 게임을 플레이하는 디바이스의 성능에 따라서 움직이는 거리가 달라지겠죠. 그래서 Time.deltaTime을 곱해줘야 한다고 설명했었습니다.
다음으로 유니티에 내장된 물리 엔진을 이용을 해서 움직이는 방법입니다. 물리 엔진을 사용하면 속도도 바꿀 수 있고 중력을 가할 수 있고 토그도 가할 수도 있고 여러 가지 물리적인 움직임을 만들어낼 수 있습니다.
간단하게 속도부터 바꿔보겠습니다.
유니티에 내장된 물리 엔진을 사용하려면 Rigidbody라는 컴포넌트가 필요하다고 했습니다. 그래서 이번에는 Scene View에서 Cube를 생성하고 생성한 Cube에 Add Component를 눌러서 Rigidbody 컴포넌트를 추가해야 합니다. (Rigidbody 2D는 2D용이므로 3D용인 Rigidbody를 추가해야 합니다.)
Rigidbody를 추가했으면 똑같이 스크립트를 하나 더 만들어주고 Cube에 추가합니다. (저는 이번에 스크립트의 이름을 MoveByVelocity라고 했습니다.). 생성한 스크립트의 Start함수를 위의 이미지 코드대로 수정한 후 게임을 실행시켜보겠습니다.
처음 보는 코드가 있습니다. GetComponent함수는 내가 부착한 게임 오브젝트에게서 원하는 컴포넌트를 가져오는 함수입니다. Transform 컴포넌트는 유니티에서 자동으로 transform이라는 변수에 가져와줬지만 rigidbody는 아닙니다. 그래서 우리가 직접 가져온 겁니다.
// 이 스크립트가 부착된 게임 오브젝트로부터 원하는 컴포넌트 가져오기.
GetComponent<원하는컴포넌트>()
내 스크립트가 달린 rigidbody에게 속도를 변경했습니다. 앞에서 했던 transform.Translate함수와 달리 속도는 한 번만 바꾸면 되므로 Update문에 넣어줄 필요가 없습니다.
이제는 힘(Force)을 가해서 물체를 움직여보겠습니다
속도 바꾸는 방법과 거의 비슷합니다. 똑같이 Rigidbody가 필요해서 GetComponent로 rigidbody를 가져왔고 매 프레임마다 x축으로 1만큼의 힘을 가했습니다.
다른 방법과 다르게 매 프레임마다 힘이 가해지니 서서히 가속도가 붙을 겁니다.
댓글
이 글 공유하기
다른 글
-
[유니티] Unity 입문하기 5 :: Tag와 Name으로 게임 오브젝트 찾기
[유니티] Unity 입문하기 5 :: Tag와 Name으로 게임 오브젝트 찾기
2020.02.22 -
[유니티] Unity 입문하기 3 :: Scripting 기초, Time.deltaTime
[유니티] Unity 입문하기 3 :: Scripting 기초, Time.deltaTime
2020.01.04 -
[유니티] Unity 입문하기 2 :: 기본 개념 및 Script 소개
[유니티] Unity 입문하기 2 :: 기본 개념 및 Script 소개
2019.12.25 -
[유니티] Unity 입문하기 1 :: 유니티 설치 및 화면 구성
[유니티] Unity 입문하기 1 :: 유니티 설치 및 화면 구성
2019.12.24