프로젝트 개요
- 프로젝트 명: LastLight
- 장르: 3D 로컬/멀티 협동 액션 플랫포머
- 개발 기간: 2025.01.20 ~ 2025.02.10
- 플레이 타임: 10~15분
- 소개: 평화로웠던 물건 나라에 갑자기 나타난 어둠. 물건들은 영혼을 잃고 세계는 빛을 잃어 얼어붙기 시작한다.
세상에 남은 유일한 빛인 양초형제는 세상에 빛을 전하기 위해 등대로 향하는데.... 빛이 꺼지지 않게 2명이서 협력하며 등대의 빛을 밝혀라!
개발 환경
- 개발 인원: 10명 (프로그래머 4명, 아트 3명, 기획 3명)
- 개발 언어: C++17
- 개발 도구: Microsoft Visual Studio 2022
- 사용 라이브러리: DX11, assimp, fmod, PhysX, Xinput, nlohmann, ImGui
개발 내용
- 담당 업무: 게임 엔진 제작, 에디터 툴 제작, 리소스 시스
게임 엔진 제작
※엔진 라이프 사이클 구성

- Tick: FixedUpdate 보다 먼저 업데이트가 필요한 경우가 생겨 만들게 되었다.
- Render: Window에 SwapChain의 화면을 출력하기 위한 일련의 모든 과정이다. 이 과정에 Camera의 Draw()와 UIManager의 Draw()등이 포함된다.
- Camera::Draw(): Render()중에 호출되는 메소드로, 각 월드의 Camera 컴포넌트 마다 해당 장면을 SwapChain에 그려준다.
- UIManager::Draw(): Render()중에 호출되는 메소드로, UICanvas의 UI들을 마지막에 한번에 SwapChain에 그려준다.
※엔진 기본 씬 그래프 구성

World
- Object의 모음을 관리하는 객체이다.
- Object의 생성과 삭제 및 검색을 담당한다.
- World는 기본적으로 Active(활성화), Non-Active(비활성화), Persistance(유지)의 3가지 상태로 나뉜다.
Active(활성화)상태는 하나의 World만 활성화될 수 있으며, 해당 World는 엔진의 라이프 사이클 업데이트를 돌게 된다.
Persistance(유지)상태는 Active상태가 아님에도 해당 World의 라이프 사이클 업데이트를 돌게 해주고 싶을 때 활성화 해준다. 캐릭터나 HUD UI 등과 같은 요소는 스테이지가 넘어가도 파괴되거나 비활성화 되면 안되기에 만들게 되었다.
- World는 각자 자신의 World가 무슨 Resource가 필요한지 알고, 활성화되어 있을 시 해당 Resource를 로드한다.
Object
- Object는 컴포넌트의 모음을 관리하는 객체이다.
- Component의 추가 및 검색을 할 수 있다.
- 중복 Component에 대한 상황이 생각보다 많아 중복 Component를 추가할 수 있게 만들었다.
Component
- Object에 소속되어 특정 역할을 수행하는 객체이다.
- 라이프 사이클마다 특정 역할을 수행하거나, 특정 정보를 지니는 역할을 한다.
Component의 종류는 여러 개지만, 대표적으로 다음이 있다.
Transform: Object의 위치 정보를 제공하고, 갱신하는 역할을 한다. 또한 Object간의 계층 구조를 이룰 수 있도록 해준다.
MeshRenderer / SkinnedMeshRenderer: Transform 컴포넌트를 통해 가져온 해당 위치에 Mesh를 렌더링하는 역할을 한다. 또한 Material을 적용시켜 질감을 표현할 수 있다.
Animator: Bone의 Transform 위치 정보를 애니메이션 프레임에 따라 바꿔주는 역할을 한다.
Camera: 윈도우의 특정 영역에 Transform의 위치 정보와 여러 속성을 통해 화면을 출력한다.
리소스 시스템
※리소스 시스템

Resource Handle
- 기존에는 Path를 Key값으로 동일하게 사용하려 했으나, 경로가 바뀔 경우에 각 Resource를 사용하는 모든 Object의 Key값을 바꿔줘야하는 경우가 발생하였다.
- 따라서 Key값과 Path를 같이 들고 있는 Handle을 만들어 관리하도록 변경하였다.

- Resource Manager는 Resource Handle과 실질적인 Resource를 매핑하여 관리한다.
- Resource는 Alloc과 Free상태로 나뉘며, Handle을 등록하면 기본적으로 Free상태이다.

에디터 툴 제작
3D는 3차원 공간이므로 에디터가 없다면 레벨배치가 힘들 것이라고 판단하여 에디터를 제작하였다.
※에디터 툴 구성
HierarchyView
- 월드의 속하는 오브젝트를 계층적으로 나열하여 보여주는 역할을 한다.
- 드래그&드랍 액션으로 오브젝트의 계층 구조를 변경하거나, 오른쪽 클릭을 통해 오브젝트를 삭제할 수 있다.

InspectorView
- Object, Resource, World 등의 모든 Entity들의 정보를 보여주거나 수정할 수 있게해주는 역할을 한다.

ResourceView
- 클라이언트가 쓴, 즉 등록된 모든 Resource를 보여주는 역할을 한다.
- Resource는 Handle을 통해 매핑하여 관리한다. Handle에는 Key와 Path 등이 포함된다.
- Alloc상태의 Resource는 초록색 탭, Free상태의 Resource는 빨간색 탭으로 보여준다.

'프로그래밍 > 게임 개발' 카테고리의 다른 글
행동 트리(Behavior Tree, BT) (3) | 2025.07.05 |
---|---|
ImGui NodeEditor 집중 탐구 (0) | 2025.06.09 |
[자체엔진, 유니티] 유니티의 모델 렌더링 구조를 하나하나 파헤쳐보자 (0) | 2024.12.19 |
[WinAPI] 유피의 소원 (2) | 2024.10.07 |
[연습작] 콘솔 오목게임 (0) | 2024.04.03 |