이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

[유니티] Unity 입문하기 4 :: Transform, Rigidbody로 게임 오브젝트 이동시키기

Coding Groot

[유니티] Unity 입문하기 4 :: Transform, Rigidbody로 게임 오브젝트 이동시키기

  • 2020.02.22 02:07
  • Game Programming/Unity Tutorial
글 작성자: Coding Groot

* 이번 글부터는 제가 이전에 만든 자료를 많이 캡처해서 올립니당.

이번 글에서는 유니티 스크립트를 사용해서 게임 오브젝트를 이동시키는 방법에 대해서 설명하겠습니다.

유니티에서는 게임 오브젝트의 위치를 다루기 위한 여러 가지 방법들을 제공해줍니다. 

그중에서 가장 대표적으로 Transform, Rigidbody 컴포넌트를 이용하는 방법이 있습니다. 컴포넌트는 기능이라고 저번 포스트에서 설명했습니다. Transform과 Rigidbody는 어떤 기능일까요?


먼저 Transform에 대해 알아봅시다.

좌측 상단의 Transform을 컴포넌트를 살펴봅시다. 

Transform은 게임 오브젝트의 위치, 회전, 스케일을 관할합니다. 이와 관련된 함수들도 Transform에 속해있습니다.

모든 게임 오브젝트는 유니티 월드상에 존재해야 하므로 모두 Transform 컴포넌트를 달고 다닌다고도 설명했었습니다.


다음으로 Rigidbody 컴포넌트입니다. 

좌측 하단의 Rigidbody 컴포넌트를 살펴봅시다.

Rigidbody는 물리엔진을 적용받도록 하는 컴포넌트입니다. 그래서 이 컴포넌트를 달고난 이후부터는 중력을 받거나 속도를 부여하거나 물체끼리 충돌을 시키거나 할 수 있게 됩니다. 

그런데 이름이 왜 Rigidbody일까요?

Rigidbody는 한국어로 번역하면 강체입니다. 강체란 형태가 고정되어 변하지 않는 물체를 뜻합니다. 우리는 중학교 때 물리를 할 때 모든 물체를 강체(찌그러지지 않는다고) 가정하고 풀었습니다. 주로 물리를 풀 때 Free-Body Diagram을 그렸을 텐데 물체를 점으로 그렸었습니다. 그래서 물리엔진을 담당하는 컴포넌트의 이름이 강체입니다. 우리가 이 컴포넌트를 게임 오브젝트에 추가한다는 것은 강체로 가정하겠다는 뜻이 내포되어 있다는 것이죠.  

강체(剛體, Rigid body)란 물리학에서 형태가 고정되어 변하지 않는 물체를 가리킨다. 강체는 외력이 가해져도 모양이나 크기가 변형되지 않는다. 실제 세계에서 모든 물체는 외력을 가함에 따라 조금씩 모양이나 크기가 변형될 수 있으며 따라서 강체라고 할 수 없지만, 변형되는 정도가 무시할 수 있을 만큼 작다면 어떤 물체를 강체로 가정하기도 한다. 물체의 운동을 분석할 때에 보통 물체를 강체로 가정한다.

출처: https://ko.wikipedia.org/wiki/%EA%B0%95%EC%B2%B4

이제 컴포넌트들을 사용해서 게임 오브젝트를 움직여봅시다.

먼저 Transform 컴포넌트를 사용해서 물체를 움직이는 방법입니다.

transform.Translate으로 매 프레임마다 deltaTime만큼 움직이고 있다. 1초 후엔 유니티 미터만큼 움직이게 됨.

Scene View에서 Cube를 하나 만드세요. 그리고 스크립트를 하나를 만들고 게임 오브젝트에 넣습니다. 저는 스크립트의 이름을 MoveByTranslate이라고 했습니다.

위의 그림과 같이 생성하신 스크립트의 Update함수를 수정한 후 게임을 실행시켜보겠습니다. 잘 움직이시나영?

스크립트에서 transform변수는 부착한 게임 오브젝트의 Transform컴포넌트를 자동으로 불러와줍니다. 그리고 Transform에는 매 프레임마다 인자로 준 좌표만큼 움직이는 함수인 Translate이 있습니다. 우리는 그것을 호출해준 것이죠!

void Update()
{
transform.Translate(1,0,0);
}

위와 같이 업데이트 함수를 짜면 어떻게 될까요? 그렇다면 매 프레임마다 1 유니티 미터만큼 움직이게 됩니다. 그런데 이렇게 짜면 게임을 플레이하는 디바이스의 성능에 따라서 움직이는 거리가 달라지겠죠. 그래서 Time.deltaTime을 곱해줘야 한다고 설명했었습니다. 


다음으로 유니티에 내장된 물리 엔진을 이용을 해서 움직이는 방법입니다. 물리 엔진을 사용하면 속도도 바꿀 수 있고 중력을 가할 수 있고 토그도 가할 수도 있고 여러 가지 물리적인 움직임을 만들어낼 수 있습니다. 

간단하게 속도부터 바꿔보겠습니다.

내가 부착한 게임 오브젝트의 Rigidbody를 가져와서 물체의 초기 속도를 바꿔주고 있다.

유니티에 내장된 물리 엔진을 사용하려면 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를 가져와서 물체에 매 프레임마다 힘을 가하고 있다.

속도 바꾸는 방법과 거의 비슷합니다. 똑같이 Rigidbody가 필요해서 GetComponent로 rigidbody를 가져왔고 매 프레임마다 x축으로 1만큼의 힘을 가했습니다.

다른 방법과 다르게 매 프레임마다 힘이 가해지니 서서히 가속도가 붙을 겁니다.

반응형

댓글

댓글을 사용할 수 없습니다.

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [유니티] 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
다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (186)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (20)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

인기 글

공지사항

태그

  • Github
  • 회고
  • 서평
  • tutorial
  • 한빛미디어
  • javascript
  • git
  • aws
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.