본문 바로가기
Unity

[Unity] 유니티 동작 방식과 원리

by ifhead 2022. 8. 19.
반응형

본 포스팅은 유니티를 설명하기 위해 모노비헤이비어, 컴포넌트 패턴, 메시징 시스템을 다룹니다.

 

재사용은 곧 생산성

반복하지 말라는 DRY 원칙을 기억하시나요?

프로그래밍에서 코드의 재활용은 생산성에 큰 도움이 됩니다. 

 

마찬가지로 유니티는 엔진에 내장된 방대한 코드 베이스를 제공하고

우리는 그것을 '재사용'합니다.

게임엔진을 사용하는 일은 곧 재사용을 의미합니다.

 

재사용은 게임 분야를 넘어 모든 개발에 널리 적용되는 개념입니다.

게임엔진은 재사용을 통해 생산성을 극대화합니다.

컴포넌트와 유니티 스크립팅

당신의 코드는 모노비헤이비어MonoBehaviour를 상속받음으로써 컴포넌트가 됩니다.

우리는 유니티가 제공하는 방식에 맞추어서 게임오브젝트를 제어해야만 합니다.

이러한 특성이 유니티 응용 프로그래밍을 "스크립팅"이라고 불리게 만듭니다.

 

유니티 게임 = 조립된 컴포넌트들

우리는 컴포넌트를 만들고 한 데 모아 조립하면서 게임을 완성해 나가게 됩니다.

이미 있는 컴포넌트와, 새로 만든 컴포넌트들은 서로 협동하면서 게임을 움직입니다.

 

Transform과 Rigidbody 컴포넌트

프로그래밍을 하다 보면 코드들은 서로 의존하게 되는데 여기서 문제가 발생합니다.

흔히 한 번 수정할 때마다 여러 곳을 고쳐야만 하는 상황이 생긴다는 점입니다.

 

이러한 문제는 프로그래머가 자초한 일이고, 프로그래머밖에 해결할 수 없습니다.

팀원이 개입할 여지가 없어서 기능을 변경, 추가해야 할 때마다 프로그래머가 일해야만 합니다.

 

유니티는 이 문제를 컴포넌트 패턴으로 해결하고 있습니다.

프로그래머는 부품을 만들고 팀원은 조립하며 게임을 만들 수 있습니다.

 

컴포넌트 패턴을 이용하면서도 당연히 상속을 사용하게 될 것입니다.

하지만 컴포넌트는 기본적으로 독립적이기 때문에 좋은 출발점이 됩니다.

컴포넌트 패턴은 '부품과 조립'을 지향합니다.

 

 

게임 오브젝트 = 컴포넌트를 담는 빈 상자

게임 오브젝트는 무엇이든 될 수 있지만, 그 자체로는 아무것도 아닙니다.

동작하려면 컴포넌트들이 필요합니다.

 

유니티에서 위치, 애니메이션, 로직 등은 모두 컴포넌트입니다.

우리는 비어 있는 게임 오브젝트에 컴포넌트들을 조립해서 기능을 만들어야 합니다.

 

컴포넌트 패턴 덕분에 당신의 팀은 다음과 같은 장점을 누립니다. (혼자서 개발하더라도요!)

  • 효율적인 재사용
  • 협업, 분업 가능
  • 자유로운 기능 추가
  • 기능을 빼더라도 망가지지 않음

게임엔진의 존재 의의는 생산성에 있습니다.

저는 유니티를 사용하면서 SOLID / KISS / DRY 원칙이 떠오르고는 했습니다.

게임엔진은 노동을 최소화하면서도, 품질은 높이고자 하는 목표를 가집니다.

 

 

메시징 시스템

유니티의 모든 컴포넌트는 MonoBehaviour를 상속받습니다.

* DOTS기반 프로그래밍에서의 ECS는 논외로 하겠습니다. 

 

컴포넌트 패턴에서 컴포넌트들은 서로 독립적입니다.

코드들은 서로 협동해야하는데 무인도에 갇혀 있는 셈입니다.

 

 

메시지의 내용

독립적인 컴포넌트끼리 협동하려면 메시지를 주고 받아야 합니다.

메시지는 이런 내용을 가집니다.

 

1. "너 어딨어?" = 컴포넌트를 '찾아 내려는' 메시지입니다.

2. "이거 해주라." = 행동을 '요청하는' 메시지입니다.

 

다르게 말하면, 당신은 컴포넌트로부터 이런 대답을 듣게 될 수 있다는 이야기입니다.

1. "그 컴포넌트 없던데."

2. "그런 일은 못 하는데"

 

다양한 이유로 컴포넌트를 '찾아내지 못하는' 상황이 생깁니다.

게다가 행동을 '요청' 했으나 해주지 않을 수도 있습니다.

우리는 이 문제를 해결하기 위해서 예방적으로 스크립팅을 하게 됩니다.

 

 

메시지의 특성

문제 상황이 왜 생기는지 알기 위해서는 메시지의 특성을 봐야 합니다.

  • 메시지를 발생시키는 쪽은, 메시지의 전달에는 관여하지 않는다.
  • 메시지를 받는 쪽은, 자기가 할 수 있는 일을 시켜야만 해준다.

컴포넌트가 발생시킨 메시지는 유니티 엔진에 의해 '모든 컴포넌트들'에 전달됩니다.

이를 브로드캐스팅이라고 합니다.

 

자주 사용하는 Start(), Update()와 OnTriggerEnter() 등은

브로드캐스팅 방식으로 동작하는 유니티 이벤트 메소드입니다.

유니티는 언제나 내부적으로 명령을 주고받는 메시지들로 가득 차있습니다.

 

 

반응형

댓글