본문 바로가기

프로그래밍/디자인패턴

[디자인패턴] 컴포넌트 패턴(Component Patterns)

컴포넌트 패턴(Component Patterns)란

AI, 물리, 렌더링, 사운드처럼 분야가 다른 코드끼리는 최대한 서로 모르는 게 좋다. 이런 코드를 한 클래스 안에 전부 욱여넣는다면 결과는 뻔하다. 클래스 하나가 5천 줄 넘는 거대한 쓰레기 코드로 뒤덮여버려 유지보수가 어려울 것이다.

(게임 프로그래밍 패턴, 한빛미디어)

 

 

 

프로젝트 정보(Project Informaion)

클래스 다이어그램(Class Diagram)

 

 

사진 및 프로젝트 설명

 

처음 프로젝트를 실행하면 나오는 화면이다. 기본적인 움직임 외에는 아무것도 작동하지 않는 간단한 클라이언트 환경이다.

 

GameObject를 구성하는 클래스의 모습이다. 보이는 것처럼 GameObject는 자신의 좌표(x, y)를 제외한 나머지는 Component 멤버 포인터 변수에게 모든 행동을 위임하는 것을 볼 수 있다. x, y는 모든 컴포넌트에서 사용하기 때문에 어느 컴포넌트에 둘지 애매하기 때문이며 이렇게 바뀐 GameObject 클래스의 역할은 자신을 정의하는 컴포넌트 집합을 관리, 컴포넌트들이 공유하는 상태를 들고 있는 역할이다.

 

InputComponent 인터페이스와 그걸 상속받는 PlayerInputComponent 클래스이다.

이덕분에 어떤 클래스라도 InputComponent 인터페이스의 컴포넌트가 될 수 있다. Update()는 가상 함수가 되면서 속도가 좀 느려졌지만 대신 무엇을 얻을 수 있을까? 대부분의 콘솔 게임들은 "데모 모드"를 지원해야 한다. 플레이어가 주 메뉴에서

아무것도 안하고 가만히 앉아 있을 때, 대신 컴퓨터가 자동으로 게임을 플레이하는 모드로 화면에 주 메뉴만 계속 나오는 것을 막을 수 있고, 매장에서도 게임을 근사하게 보여줄 수 있다. 입력 컴포넌트 클래스를 인터페이스 밑에 숨긴 덕분에 이런 걸 만들 수 있다. (게임 프로그래밍 패턴, 한빛미디어)

Render를 담당하는 클래스이다. GraphicsComponent에서 넘겨주는 Texture, x, y 값을 토대로 플레이어를 그린다.

(배경화면은 기존과 동일하게 그리게 했다.) Render를 담당하는 Instance는 오직 한 개만 존재해야 하기 때문에 싱글톤을 사용할까 했지만 assert를 사용해서 처리를 진행했다. assert 함수에 관한 설명은 밑에 참조 글에 싱글턴에 해당 내용이 있다.

 

 

이 외에도 많은 클래스가 있지만 대부분 비슷한 내용이라 Git에 있는 프로젝트를 참조하는 걸 추천한다.

후기

컴포넌트 패턴을 이용해서 간단하게 구현을 해보았다. 컴포넌트 패턴의 핵심은 디커플링 패턴으로 코드의 의존성을 낮추는 것에 목표를 두고 있다. 대표적으로 상용 게임엔진인 Unity 또한 이 패턴을 사용하고 있다. 

Graphics, Input 등 Class와 Inturface를 만들다보니 지금까지 진행한 디자인 패턴 중 가장 많은 소스코드를 가지고 있다.

 

 

출처 및 소스코드 링크

git: github.com/SnowFleur/2020-Design-Patterns/tree/master/컴포넌트%20패턴

Book: goF의 디자인 패턴(프로젝트 미디어), 게임 프로그래밍 패턴(한빛미디어)