Get Out Of
3D 호러 서바이벌
3D 호러 서바이벌
“8번 출구”에서 영감을 받은 리미널 스페이스 호러 장르의 게임입니다.
버려진 병원에서 반복되는 이상 현상을 경험하며 탈출을 시도하는 플레이어의 심리적 긴장감을 표현했습니다.
Level Sequence 기반의 이벤트 출력 시스템으로 연출 타이밍을 세밀히 제어하고, 렌더링 최적화를 통해 몰입감 있는 환경을 구현했습니다.
음성 재생과 함께 자막이 실시간으로 출력되는 대사 동기화 시스템을 제작하여 시네마틱한 연출을 강화했습니다.
개발 환경
C++, Unreal Engine
개발 인원
1인 개발
Steam
-----------
1. 렌더링 최적화
(1) 모델링 최적화
Size Map을 활용한 모델별 크기 파악
- Modeling Mode → Mesh → Simplify 로 Vertex 최적화
: 278MB → 12MB (95.7% 감소)
(2) 텍스처 최적화
필터링 기능으로 텍스처별 크기를 파악
텍스처의 Max Size 혹은 LOD Bias를 조절하여 텍스처 최적화 진행
: 162MB → 1MB (99.4% 감소)
2. 이벤트 출력 시스템
DataTable을 활용하여 스테이지 별 출력할 이벤트 관리
StageSubsystem에서 현재 스테이지에 맞는 이벤트를 출력하는 구조로 구현
재생한 Level Sequence에서 이벤트를 Spawn 하는 구조
스테이지 별로 발생할 이벤트를 Level Sequence로 관리함으로 이벤트 추가 및 수정 작업이 효율적
3. 대사 동기화 시스템
DataTable을 활용하여 SoundCue와 대사를 관리
SoundSubsystem으로 대사에 맞는 Enum 값을 매개변수로 전달 받아 음성과 대사 출력
DialogueWidget에서 대사 길이에 따라 출력 시간을 동적으로 조절
문제점
문제 상황
UStageSubSystem에서 LoadObject()를 통해 DataTable을 런타임에 직접 로드하도록 구현
에디터 상에서는 정상적으로 참조 유지되었으나 Shipping 빌드 패키징 후에는 DataTable 참조가 손실되는 문제 발생
원인 분석
LoadObject( ) 방식은 패키징 시 리소스가 강제로 포함되지 않기 때문에, 참조된 DataTable이 빌드 결과물에 누락될 수 있음
즉, 하드 레퍼런스가 아닌 런타임 동적 로드 방식으로 인해 참조 보장이 이루어지지 않음
LoadObject 소드 코드
개선 방향
해결 방법
Primary Asset Label을 활용하여 DataTable을 Primary Asset으로 등록
해당 라벨을 통해 패키징 시 리소스가 강제로 포함되도록 보장
결과
에디터 / Shipping 빌드 모두에서 참조 일관성 확보
런타임 환경에서도 안정적으로 DataTable 로드 및 접근 가능
Primary Asset Label
문제점
문제 상황
튜토리얼 전용 HUD를 다른 레벨에서도 참조함
그 결과, 각 레벨의 Size Map이 약 600MB씩 불필요하게 증가하는 문제 발생
원인 분석
모든 레벨에서 공통으로 사용하는 PlayerController가 HUD를 소유하는 구조로 구현되어 있었음
HUD가 하드 레퍼런스로 연결되어 있어, 사용하지 않는 레벨에서도 리소스가 포함됨
하드 레퍼런스로 인한 SizeMap 과부하 현상
회고 및 개선 방향
해결 시도 및 대안
공통 기능은 부모 PlayerController에 두고 튜토리얼 전용 기능은 자식 TutorialController로 분리하는 방식으로 해결 가능성을 검토
그러나 시간 제약으로 구조적 수정은 진행하지 못함
배운 점
PlayerController의 상속 구조 설계의 중요성을 인식함
**하드 레퍼런스(Strong Reference)**와 **소프트 레퍼런스(Soft Reference)**의 차이를 이해하고 리소스 관리 방식 개선의 필요성을 체감함
25-1 EDGE 게임개발 경진대회 1등