[Unity 입문 강좌] 유니티 게임 엔진의 원리

1. Unity 게임 엔진

 

유니티 게임 엔진은 기본적으로 컴포넌트 기반 객체지향 디자인 원칙을 따르며, 그래픽스 렌더링, 물리 엔진, 사운드 처리 등 다양한 기능을 기본으로 제공합니다. 이러한 기능들은 모두 컴포넌트의 형태로 구성되며, 각각의 게임 오브젝트에 붙여 사용할 수 있습니다. (컴포넌트란 게임 오브젝트의 기능과 속성을 구현하는 기본 단위입니다.) 쉽게 말하면 게임을 조립해서 만드는 컨셉이라고 할 수 있습니다.

 

아래 그림은 유니티 에디터 모습이며, Cube라는 게임 오브젝트가 Scene에 배치된 모습입니다. 여기서 Cube라는 오브젝트는 Transform, Mesh Renderer, Box Collider 등과 같은 컴포넌트를 가지고 있습니다.

 

 


1.1 컴포넌트 방식

 

컴포넌트 방식은 게임 오브젝트에 컴포넌트를 추가해 기능을 구현하는 방식입니다. 유니티에서 제공하는 게임 오브젝트는 기본적인 컴포넌트들이 부착되어있습니다. 아래 Cube 게임 오브젝트도 여러개의 컴포넌트(Transform, Cube(Mesh Filter), Mesh Renderer ...)가 기본적으로 부착된 것을 확인할 수 있습니다. 사용자가 코드를 작성하여 컴포넌트를 추가할 수도 있습니다. 게임 오브젝트에 어떤 컴포넌트를 추가하느냐에 오브젝트의 기능이 달라집니다.

 

 


1.2 컴포넌트 방식의 활용과 장점

컴포넌트 방식은 복잡한 시스템을 구성하는 기본 단위를 작은 조각으로 분리하고 이들을 조합하여 원하는 기능을 얻는 방법입니다. 이를 유니티 게임 엔진에 적용하면, 게임 오브젝트는 여러 컴포넌트들로 이루어져 있고, 각 컴포넌트는 게임 오브젝트가 수행하는 특정 기능을 담당합니다. 또한 이러한 컴포넌트들을 프리팹으로 저장하여 재사용하면, 비슷한 특성을 가진 다양한 캐릭터와 몬스터를 쉽게 구현할 수 있습니다. (프리팹이란 다양한 컴포넌트를 가지고 있는 게임 오브젝트를 재활용하기 쉽게 만든 템플릿이라고 생각하면 됩니다.)

 

예를 들어 아래 이미지와 같은 '스페이스 쉽'이라는 게임에서 비행기 오브젝트를 만든다고 가정해 보겠습니다. (스페이스 쉽 게임은 비행기를 조종해서 적을 쓰러트리는 게임입니다. ) 비행기가 움직이고, 레이저를 발사하고, 충돌할 때 소멸하는 기능이 필요하다면, 이 각각의 기능을 컴포넌트로 분리할 수 있습니다.

 

 

  • 움직임 컴포넌트:  스페이스 쉽의 위치를 제어합니다. 사용자의 입력을 받아 스페이스 쉽이 움직이는 기능을 수행합니다.
  • 레이저 발사 컴포넌트: 사용자가 레이저 발사 버튼을 누르면 이 컴포넌트가 레이저 게임 오브젝트를 생성하고 발사하는 기능을 담당합니다.
  • 충돌 및 소멸 컴포넌트: 스페이스 쉽이 다른 게임 오브젝트와 충돌하면 이 컴포넌트가 스페이스 쉽의 소멸을 처리합니다.

 

이 처럼 게임 오브젝트는 여러 개의 컴포넌트로 분리되며, 각 컴포넌트는 특정 기능을 수행하고 독립적으로 작동합니다. 이 방식은 코드의 재사용성을 높여줍니다. 또한 각 컴포넌트는 독립적이기 때문에 개발과 디버깅이 용이하며, 게임의 복잡성을 관리하는 데 도움이 됩니다.

 

만약 새로운 기능이 필요하면 새로운 컴포넌트를 만들어 추가할 수 있습니다. 또한, 기존 컴포넌트를 업데이트하거나 변경하는 것이 쉽습니다. 예를 들어, 스페이스 쉽이 대신 미사일을 발사하도록 변경하려면 '레이저 발사 컴포넌트'를 '미사일 발사 컴포넌트'로 교체하면 됩니다. 이처럼 컴포넌트 방식을 사용하면 기존의 게임 오브젝트 구조를 크게 변경하지 않고도 새로운 기능을 추가하거나 기존 기능을 변경하는 것이 용이합니다.

 

마지막으로, 컴포넌트 방식은 팀 작업을 용이하게 합니다. 각 팀원은 특정 컴포넌트에 집중하여 작업할 수 있으며, 각자의 컴포넌트를 게임 오브젝트에 추가하거나 수정하면 됩니다. 이는 작업의 분업화를 가능하게 하고, 팀원 간의 협업을 쉽게 만듭니다.

 


2.1 이벤트 시스템

 

1.1 컴포넌트 방식에서 컴포넌트를 이용해 게임 오브젝트의 기능을 구현해 게임을 만든다고 했습니다. 그러나 단순히 컴포넌트를 가진 오브젝트들만으로 각 객체간의 상호작용이나 사용자 입력에 반응하는 등의 동적인 부분을 처리하기는 어렵습니다. 이를 위해 유니티의 이벤트 시스템을 사용해야 합니다. 

 

이벤트 시스템은 특정 이벤트를 '구독'하는 컴포넌트가 있고, 이 이벤트가 발생할 때 이에 반응하는 코드를 실행합니다. 이렇게 하면, 여러 컴포넌트 사이에서 정보를 교환하고 작용하는데 유용합니다. 이벤트 시스템은 컴포넌트들 뿐만 아니라 키보드와 마우스 입력, 오브젝트 충돌과 같은 상황에서도 사용됩니다.

 

예를 들어, 플레이어가 적을 공격했을 때, 이 이벤트를 '적의 체력' 컴포넌트가 구독하고 있을 수 있습니다. 이 이벤트가 발생하면, '적의 체력' 컴포넌트는 이에 반응하여 체력을 감소시키는 코드를 실행합니다. 또 다른 예로는 플레이어가 아이템을 획득했을 때를 들 수 있습니다. 이 이벤트를 '인벤토리' 컴포넌트가 구독하고 있으면, 아이템 획득 이벤트가 발생하면 '인벤토리' 컴포넌트는 이에 반응하여 인벤토리에 아이템을 추가하는 코드를 실행합니다.

 

유니티 컴포넌트의 이벤트처리 예시

 


3.1 라이프 사이클

 

2.1 이벤트 시스템에서 컴포넌트들과의 상호작용 그리고 사용자 입력에 대한 반응들을 유니티에서 할 수 있다고 했습니다. 이러한 상호작용과 반응은 순차적이고 구조화된 방식으로 이루어져야 합니다. 게임 개발에서는 각 컴포넌트나 게임 오브젝트가 특정 시점에 어떤 행동을 해야하는지를 제어해야 합니다. 이를 가능하게 하는 것이 바로 유니티의 라이프 사이클입니다. 라이프 사이클은 아래 이미지 처럼 게임 오브젝트의 생성부터 파괴까지 일련의 과정을 통제하는 일련의 메서드로 구성됩니다. 라이프 사이클에 대한 자세한 내용은 다음글에서 설명하도록 하겠습니다.

 

유니티 생명주기(Life cycle : 라이프사이클)