게임 오브젝트와 컴포넌트 (유니티 게임 프로그래밍)

게임 오브젝트는(Game Object) 유니티 에디터에서 가장 중요한 개념입니다.

캐릭터, 아이템, 광원, 카메라, 특수 효과, 등 게임 세상을 구성하는 모든 오브젝트는 게임 오브젝트인데요. 이런 다재다능한 게임 오브젝트가 어떻게 이루어져 있는지 알아봅시다.

게임 오브젝트는 껍데기이다


빈 게임 오브젝트를 생성하면 필수 컴포넌트인 Transfrom 컴포넌트만 가지고 있습니다. 위치와 방향을 나타내기 위해 필수이며 제거할 수 없는 컴포넌트입니다.

<게임 오브젝트 생성과 수정>에서 Cube 오브젝트를 생성했었죠? 위 사진에서 생성한 빈 게임 오브젝트를 Cube 오브젝트와 똑같이 만들어 보겠습니다. Cube가 가지고 있는 컴포넌트를 빈 게임 오브젝트에도 연결시켜야 됩니다. 

Hierarchy 창에서 빈 게임 오브젝트를 선택하고 Inspector 창에서 Add Component를 클릭하면 컴포넌트 브라우저를 사용할 수 있습니다. 브라우저로 컴포넌트를 카테고리별로 편리하게 탐색할 수 있으며 검색 상자를 통해서 컴포넌트를 찾을 수 있습니다.

빈 게임 오브젝트에 유니티 기본 오브젝트 Cube와 똑같은 컴포넌트를 연결하고 똑같은 프로퍼티(?)를 부여하겠습니다.

프로퍼티는 C# 문법 중 하나인데 일단은 데이터에 값을 대입한다고 생각합시다. 확실한 뜻은 다른 시간에 설명할 수 있을 거예요.

Cube가 연결하고 있는 것처럼 Transform, Mesh Filter, Mesh Renderer, Box Collider를 연결하니 Cube 오브젝트와 똑같은 오브젝트가 되었습니다. 특이하죠?

이처럼 게임 오브젝트는 컴포넌트와 프로퍼티에 따라 완전히 다른 게임 오브젝트가 될 수 있습니다. 쉽게 생각하면 게임 오브젝트는 컴포넌트를 소유하고 있는 껍데기(Holder)입니다. 좀 더 정확히 말하면 게임 오브젝트는 다양한 컴포넌트의 컨테이너(?)입니다.

컨테이너(container)는 프로그래머가 작성한 코드의 처리 과정을 맡기는 독립적인 존재라고 생각하면 됩니다. 유니티 게임 오브젝트는 컴포넌트의 기능이 구현되는 독집적인 존재라고 말할 수 있겠죠.

컴포넌트


컴포넌트(Component)는 저희가 유니티 에디터를 사용하는 핵심이라 말할 수 있습니다. 컴포넌트 브라우저를 보면 알 수 있겠지만 많은 컴포넌트가 있습니다. 유니티 에디터가 미리 만들어 놓은 게임 오브젝트를 구성하기 위한 부품들이지요. 만약 저희가 모든 컴포넌트를 처음부터 만든다고 생각해 보세요. 이는 매우 비생산적이겠죠.

게임이 실행되는 동안 게임 오브젝트에 연결되어 있는 컴포넌트는 개별로 독립적인 기능을 수행합니다. 게임 개발에 있어서 상당히 강력한 이점입니다.

예를 들어 위 기능을 하는 컴포넌트들이 있다고 가정해보겠습니다. 각 컴포넌트는 적혀있는 기능을 수행합니다. 게임 오브젝트에 해당 컴포넌트들을 조합하면 어떤 게임 오브젝트를 만들 수 있는지 예상해 봅시다.

우선 사람을 만들 수 있겠군요. 다르게 조합해볼까요?

상어라고 우기기엔 조금 억지긴 하지만 그냥 넘어가 주세요 ^^;

다른 조합으로 상어를 만들었습니다! 거기다가 사람과 겹치는 컴포넌트가 두 개나 있네요! 굳이 상어 게임 오브젝트를 만들기 위해 육식과 척추 기능을 새로 만들 필요가 없다는 겁니다. 컴포넌트의 이점 중 하나는 위 경우처럼 만들어진 컴포넌트를 재사용하기 좋다는 것입니다.

그리고 각 컴포넌트마다 독립적인 기능을 수행하기 때문에 추가와 삭제가 쉽습니다. 이 뜻은 삭제 또는 추가하고 싶은 컴포넌트를 수정함으로써 다른 컴포넌트가 영향을 받아 게임 오브젝트가 손상될 걱정을 할 필요가 없다는 것입니다.

일부 컴포넌트는 다른 컴포넌트와 결합해서 기능이 합쳐진 모습을 보여주기도 합니다.

제 생각에 대표적인 조합(?)은 리지드바디(Rigidbody)와 모든 콜라이더(Collider) 조합인데요. 리지드바디는 트랜스폼을 제어하고 콜라이더는 리지드바디가 다른 콜라이더와 충돌 및 상호작용하도록 만듭니다. 상당히 많이 사용하는 조합이죠.

컴포넌트의 독립성 덕분에 위와 같은 이점들이 생기는데 “컴포넌트가 독립성이 짙다면 우리가 원하는 기능을 외부 입력(유저 입력)을 받아 어떻게 동작시킬까?”라는 문제가 생깁니다. 이 문제는 역시 게임 엔진 유니티가 해결해 주는데 다음 시간에 알아봅시다!

다음 시간에 만나요~ 제발~

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다