Portfolio

PROJECT CASE STUDY

말랑원정대

Slime Rancher 모작 프로젝트. Vacpack으로 슬라임과 오브젝트를 흡입·관리하고, XPBD 기반 물리 시뮬레이션과 데이터 중심 구조로 탐색·수집·성장 루프를 구현했습니다.

Unreal EngineC++XPBDSimulationData-Driven

프로젝트 개요

말랑원정대는 Slime Rancher를 모작한 Simulation / Action Adventure 프로젝트입니다. 슬라임을 단순한 적 오브젝트가 아니라 상호작용 가능한 시뮬레이션 대상으로 다루는 것을 목표로 했습니다.

프로젝트 정보

  • 개발 기간: 2026년 2월 9일 ~ 2026년 3월 13일, 31일
  • 참여 인원: 2명
  • 플랫폼: PC
  • 장르: Simulation / Action Adventure
  • 개발 환경: Unreal Engine

게임플레이 흐름

플레이어는 슬라임 세계를 탐색하며 슬라임과 아이템을 수집하고, 자원을 인벤토리와 상점에 연결해 능력을 확장합니다.

탐색 → 수집 → 관리 → 활용 → 성장의 반복 구조를 중심으로 이동·점프·시점 조작, NPC와 월드 오브젝트 상호작용, 상점 이용을 구성했습니다.

Vacpack

Vacpack을 이용해 슬라임과 아이템을 흡입하고, 보관한 대상을 발사할 수 있습니다. WaveCannon 기능과 숫자 키 기반 인벤토리 슬롯 선택을 함께 구현해 장비 사용과 자원 관리가 하나의 플레이 흐름으로 이어지도록 했습니다.

플레이어 상태와 UI

HP, MP, Newbucks, Level, PlayTime과 인벤토리 슬롯 상태를 UI에 연결했습니다. 플레이어 상태가 바뀌면 HUD, 스탯, 슬롯, 상점, 사망 UI가 필요한 정보만 갱신하도록 구성했습니다.

아키텍처와 주요 구현

Player / Controller / Equipment 분리

  • ASlimePlayer: 이동, 점프, 상호작용, 플레이어 상태
  • ASlimePlayerController: 입력 매핑과 UI 생성·연결
  • ASlimeVacpack: 흡입, 발사, 인벤토리 관리

플레이어 본체, 제어 흐름, 장비 로직을 나누어 한 클래스에 기능이 과도하게 집중되지 않도록 설계했습니다.

Delegate 기반 이벤트 드리븐 UI

UI는 게임 로직을 직접 계산하지 않고 SetUpSlimePlayer()를 통해 플레이어와 연결됩니다. HP·MP·Newbucks 업데이트, 아이템 정보, 슬롯 변경, 상점 인터랙션, 사망 UI 등의 변화는 Delegate와 이벤트를 통해 전달됩니다.

이 구조로 UI와 플레이어의 결합도를 낮추고, 위젯 교체·Blueprint 확장·상태 변경 로직 재사용을 쉽게 만들었습니다.

데이터 중심 설계

설정 저장과 플레이 진행 저장을 USlimeSettingSaveGameUSlimePlaySaveGame으로 분리했습니다. 아이템과 흡입 가능 오브젝트 정보는 FVacuumableInfo, FSlot, USlimeItemDefinition을 통해 Struct·DataAsset·DataTable 기반으로 관리합니다.

아이템 추가나 밸런싱 시 gameplay 코드의 수정량을 줄이고, 디자이너가 다루기 쉬운 데이터 파이프라인을 만드는 데 초점을 맞췄습니다.

인터페이스 기반 Vacuumable 구조

흡입 가능한 대상은 특정 클래스에 직접 의존하지 않고 IVacuumableInterface를 통해 공통 규약을 정의했습니다. ID 조회와 아이템 Actor 클래스 획득을 인터페이스로 추상화해 슬라임뿐 아니라 음식, Plort, 퀘스트 오브젝트 등 새로운 대상도 기존 Vacpack 구조를 유지하며 추가할 수 있도록 했습니다.

XPBD 기반 슬라임 시뮬레이션

슬라임은 엔진의 단순 물리 오브젝트가 아니라 별도의 시뮬레이션 구조로 다뤘습니다. FSlimeParticle, FDistanceConstraint, FTriangle을 기반으로 파티클·거리 제약·충돌·부피 계산을 구성하고, XPBD 관련 계산을 통해 슬라임의 변형과 물리 거동을 표현했습니다.

실시간 계산 비용을 고려해 Custom LOD로 시뮬레이션량을 조절할 수 있는 구조를 확보하고, 플레이어 Tick·Vacpack 감지·충돌 처리와 함께 최적화 지점을 분리했습니다.

문제 해결

플레이어 입력, 장비, UI, 상점, 상호작용을 한곳에 모으면 유지보수가 어려워질 수 있었습니다. 이를 Player / Controller / Equipment / UI / Interface 단위로 분리하고 Delegate 이벤트로 연결해 기능 간 결합도를 낮췄습니다.

또한 슬라임 시뮬레이션과 Vacpack 감지, UI 갱신은 실시간 비용이 발생할 수 있으므로 시뮬레이션 단위를 구조화하고 Custom LOD와 이벤트 기반 갱신을 적용할 수 있는 형태로 정리했습니다.

결과물