
엔진 코어

엔진 컴포넌트

엔진 시스템
사용 기술 & 환경
<aside>
- 언어/표준:
C++17
- 그래픽스:
Direct2D(Dx11)
</aside>
아키텍처 한눈에
<aside>
💡 링크는 구조도 이미지로 연결되며, 마우스를 올리면 우측 상단의 ‘🔍펼치기’ 가 가능합니다.
- Engine: 엔진의 시작점. 시스템들을 초기화하고 메인 루프(초기화, 업데이트, 렌더링)를 실행하는 역할
- Systems: 입력, 사운드, 씬, 이벤트 등 엔진의 핵심 기능들을 관리하는 시스템들의 집합
- Game Object: 게임 세계(씬)를 구성하는 기본 단위. 컴포넌트들을 소유하며 자체적인 실행 주기를 가짐
- Component:
Game Object
에 부착되어 특정 기능(물리, 애니메이션 등)을 수행하는 부품
- Cycle Interfaces:
Update
, Render
등 Game Object
가 실행되어야 할 주기에 맞춰 기능을 구현하기 위한 인터페이스 집합
- Component: 모든 컴포넌트의 기반이 되는 추상 클래스
- Cycle Interfaces: 컴포넌트가
Update
, Render
등 특정 실행 주기에 참여하고 싶을 때 상속하는 인터페이스
- Transform: 오브젝트의 위치, 회전, 크기 등 공간 정보를 담당하는 가장 기본적인 컴포넌트
- Base Renderer: 화면에 무언가를 그리는 모든 렌더러 컴포넌트들의 부모 클래스
- Collider: 다른 오브젝트와의 충돌을 감지하는 물리 컴포넌트의 기반
- Event System: 시스템 및 오브젝트 간의 의존성을 낮추고 통신을 중재하는 중앙 집중형 이벤트 관리자
- Event / Listener: 발행될 이벤트의 데이터(ID, 파라미터)와, 이벤트를 구독하여 처리할 함수(리스너)의 정보
- Scene: 관련된 게임 오브젝트들을 하나의 그룹으로 묶어 관리하는 게임 월드의 단위
- Scene System:
Scene
의 생성, 전환, 소멸을 관리하고 현재 씬의 실행 주기를 호출하는 시스템
</aside>
엔진 설계 배경 & 목표
<aside>
이전의 게임 개발 경험을 통해 잘 설계된 엔진 구조의 중요성을 체감했습니다. 이를 바탕으로, 보다 체계적인 아키텍처를 구축하고 협업의 기반을 마련하고자 본 프로젝트를 시작했습니다. 주요 설계 목표는 다음과 같았습니다.
- 확장성 높은 이벤트 시스템 구축: 타입 캐스팅의 위험이 적고 확장이 용이하여, 참조가 어려운 클래스 간의 통신을 간단하게 해결하는 것을 목표로 했습니다.
- 컴포넌트 기반 설계: Unity 엔진을 참고하여, 다형성과 템플릿을 활용한 유연한 컴포넌트 관리 컨테이너를 구현하고자 했습니다.
- 엔진과 게임의 명확한 분리: 엔진(Core)은
lib
로, 게임(App)은 exe
로 분리하여 각 클래스의 책임과 역할을 명확히 부여하고 재사용성을 높이고자 했습니다.
- 실행 주기 최적화: 모든 라이프사이클 함수를 강제로 실행하는 대신, 사용자가 필요한 주기만 선택하여 실행할 수 있는 효율적인 구조를 목표로 삼았습니다.
</aside>
담당 역할
<aside>
프로젝트의 전반적인 엔진 아키텍처 설계 및 구현을 담당
- 오브젝트 관리, 씬(Scene) 전환, 컴포넌트 시스템, 이벤트 관리 매커니즘 개발
</aside>
핵심 기여 포인트
<aside>
- 실행 주기 인터페이스 도입:
IUpdatable
, IFixedUpdatable
등 실행 주기별 인터페이스를 정의하고, 이를 통해 컴포넌트의 실행 주기를 명확히 분리
- 컴포넌트 등록 및 관리 자동화:
AddComponent
템플릿 함수 내에서 dynamic_cast
를 활용, 컴포넌트가 구현한 인터페이스를 감지하여 실행 주기별 컨테이너에 자동으로 등록
- 타입-세이프 이벤트 시스템 구축:
std::function
과 std::any
를 활용해 파라미터 타입에 구애받지 않으면서도 타입 안정성을 확보한 이벤트 시스템 구현
- 엔진과 게임 로직의 물리적 분리: 엔진 코어와 게임 로직을 별도의 프로젝트로 분리하여 엔진의 독립성과 재사용성 확보
</aside>
기술적 관찰
<aside>
GameObject
와 실행 주기 관리
SceneSystem
의 지연 처리 메커니즘
EventSystem
의 구독 및 발행 구조
</aside>