시티 빌더의 저장 시스템은 정말이지 괴물 같습니다
요약
시티 빌더 게임 Venusville의 복잡한 저장 및 복구 시스템 구축 과정을 다룹니다. 단순 데이터 저장을 넘어 프리팹, 의존성, AI 상태 및 관계를 올바르게 복구하기 위한 5단계 복구 프로세스 도입과 데이터 불일치 문제를 해결하는 과정을 설명합니다.
핵심 포인트
- 시티 빌더의 복잡한 객체 관계와 AI 상태 복구의 중요성
- 플레이 씬 외부에서 로드 프로세스를 처리하는 시작 흐름 단순화
- 엔티티, 의존성, 관계, 행동 트리 순의 5단계 복구 단계 도입
- 데이터 중복(Single Source of Truth 위반)으로 인한 시뮬레이션 오염 방지
드디어 제가 만들고 있는 시티 빌더(City builder) 게임인 Venusville의 저장 시스템(Save system)을 완성했습니다.
약 3개월 정도 걸렸네요.
첫 번째 게임에서 사용했던 저장/불러오기(Save/load) 라이브러리가 이미 있어서, 상황이 꽤 괜찮을 줄 알았습니다. 오브젝트(Objects)에는 ID가 있었고, ScriptableObject 상태는 문제없이 직렬화(Serialize)될 수 있었으며, 상태 데이터(State data)를 위한 깔끔한 마샬/언마샬(Marshal/unmarshal) 파이프라인도 이미 갖춰져 있었기 때문입니다.
하지만 시티 빌더는 완전히 차원이 다른 괴물이라는 사실이 밝혀졌습니다.
진짜 문제는 데이터를 저장하는 것이 아니었습니다. 모든 것을 올바르게 복구(Restore)하는 것이 문제였습니다:
- 프리팹 (prefabs)
- 의존성 (dependencies)
- 오브젝트 관계 (object relations)
- AI 상태 (AI state)
- 협조할 생각이 전혀 없어 보이는 서드파티 라이브러리들 (third-party libraries)
가장 큰 변화 중 하나는 시작 흐름(Start-up flow)을 단순화한 것이었습니다. 이제 저장 파일을 불러오는 것과 새 게임을 시작하는 것 모두 플레이 씬(Play scene) 외부에서 이루어지므로, 플레이 씬은 오직 하나의 책임, 즉 ScriptableObject 상태 데이터로부터 복구하는 일만 수행합니다.
이전에는 프리팹의 Start() 함수와 새 게임을 위한 에디터 할당 설정 데이터(Editor-assigned setup data)에 크게 의존했는데, 저장/불러오기가 도입되기 전까지는 괜찮았습니다. 하지만 저장/불러오기가 들어오자 의존성(Dependencies)이 매우 빠르게 불일치하기 시작했습니다.
결국 저는 5단계의 복구 단계(Restoration phases)를 도입하게 되었습니다:
- 핵심 오브젝트 복구 (사람, 건물 / 내부 / 자원과 같은 엔티티 (entities))
- 의존성 복구 (컴포넌트와 자식 컴포넌트 간의 의존성)
- 관계 복구 (사람이 자원을 운반하는 것과 같은 엔티티 간의 관계)
- 행동 트리(Behaviour trees) 복구 1단계
- 행동 트리(Behaviour trees) 복구 2단계
행동 트리(Behaviour tree) 부분이 특히 고통스러웠습니다.
저는 전반적으로 훌륭한 라이브러리인 [데이터 누락됨]을 사용하고 있지만, 내부적으로 정말 의심스러운 동작들을 몇 가지 수행합니다. 예를 들어, 제가 이미 복구해 놓은 GameObject를 참조하는 공유 변수(Shared variables)를 지워버리기도 합니다. 그런 문제들 때문에 행동 트리를 활성화할 때 데이터를 캐시(Cache)하고 복구해야 하는 일련의 지저분한 우회 시스템(Workaround systems)을 구축할 수밖에 없었습니다.
그러고 나서 숨겨진 버그들이 나타나기 시작했습니다.
단일 진실 공급원 (Source of truth)을 갖는 대신 데이터가 두 곳에 존재하는 경우가 몇 차례 있었습니다. 예를 들어, 발행자 (Issuers)와 사람들 (People) 모두 동일한 계약 데이터 (Atmos Factory의 생산량과 같은 데이터)의 복사본을 저장하고 있었습니다. 처음에는 모든 것이 정상적으로 보였지만, 로드된 게임은 서서히 망가진 상태로 변질되기 시작했습니다.
이것들은 서서히 타오르는 문제 (Slow-burn problems)였기 때문에 최악의 버그였습니다. 부작용은 5~20분 후에 나타나기 시작했고, 그 후 바이러스처럼 시뮬레이션 전체로 퍼져나갔습니다.
어쨌든.
이제 저는 시티 빌더를 저장하고 불러올 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/Unity3D (top/week)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기