에코 위버: Unity 6에서 타임 루프 메트로이드브레인이야 구축하기
Fergus Baird - Unity Technologies
Senior Content Marketing Manager
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.
Echo Weaver, Moonlight Kids와 Akupara Games의 기대작인 메트로이드브레인이야가 오늘 PC와 콘솔로 출시됩니다. 우리는 게임 디자이너 크리스 서스키와 프로그래머 안킷 트리베디를 인터뷰하여 지식 게이티드 디자인, 루프 리셋 아키텍처, 그리고 Unity로 게임을 만드는 다른 소규모 팀들에게 전할 교훈에 대해 이야기했습니다.
3인 인디 스튜디오 Moonlight Kids가 Echo Weaver 작업을 시작했을 때, 그들은 게임 개발에서 가장 악명 높은 시스템 중 하나인 세이브 상태를 우회하는 허점을 찾았다고 생각했습니다.
"누군가 세이브 파일을 잃으면, 당신은 그 사람의 넘버 원 적이 된다"고 크리스가 말합니다. 팀은 데뷔작인 크리처 수집가 The Wild at Heart에서 세이브 상태 오류로 고전했기 때문에, Echo Weaver의 타임루프 전제는 꿈이 현실이 된 것 같았다: 우리는 "살릴 수 없어!" 같았어. 시간 여행! 모든 것이 초기화됩니다!
물론, 게임 개발에서 일이 이렇게 간단한 경우는 거의 없습니다. Echo Weaver는 로딩 화면 없이 상호 연결된 세계를 스트리밍하는데, 이는 플레이어가 세계를 탐색함에 따라 맵의 청크를 지속적으로 로드하고 언로드해야 함을 의미합니다. 이것은 다음과 같은 상황을 만듭니다: 플레이어가 이 루프에서 지름길 벽을 부쉈나요? 그들이 그 NPC와 이야기했나요? Echo Weaver의 세계는 플레이어가 시간을 다 소진하고 루프가 재시작될 때까지 어느 정도의 지속성을 유지해야 한다. "결국 우리는 모든 것을 저장해야 한다는 걸 알게 됐어." 크리스가 말한다. 하지만 무언가 잘못되었을 때 덜 해롭습니다. 왜냐하면 플레이어가 항상 루프를 재설정할 수 있기 때문입니다.

우주 파쿠르 탐정 게임
Echo Weaver에는 능력 게이트가 없습니다. 게임플레이 시작 첫분부터 세상은 완전히 개방되어 있지만, 그것을 완전히 탐험하는 방법은 플레이어가 알아내야 합니다. 안킷은 "우리의 내부 피치는 '우주 파쿠르 탐정'이었다"고 말합니다.
"아무것도 지속되지 않는 게임을 만들어야 한다고 상상해 보세요."라고 크리스가 말합니다. 플레이어가 느껴야 할 모든 진보감은 이미 존재하며, 단지 비밀의 층 아래에 묻혀 있을 뿐입니다. 이것은 우리가 Echo Weaver로 하고 있는 크고 이상한 일입니다. 저에게는 가장 멋진 것이자 가장 큰 도전이기도 한데, 왜냐하면 누구나 언제든지 어떤 능력에 부딪힐 수 있기 때문입니다.
개발 초기 단계에서 팀은 해당 프로젝트를 The Wild at Heart에 대한 의도적인 반응으로 포지셔닝했습니다. 당시에는 잘 팔리지 않았습니다. 다행히 나중에 상황이 바뀌었지만, 그래서 우리는 그 프로젝트와 반대되는 모든 것을 하려고 노력했습니다. "조금 더 어둡고, 조금 더 강하게 만들려고 생각했어요."라고 크리스가 말합니다. "물론, 이것은 우리가 잘하는 것과 반대로 가는 것이었고, 우리는 곧 우리의 잘못을 깨달았습니다!"

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
Echo Weaver의 The Wild at Heart에서 가져온 많은 요소들이 공동 설립자이자 크리에이티브 디렉터인 저스틴 볼드윈의 손으로 그린 스타일("같은 붓과 팔레트까지")부터 비밀로 가득 찬 크고 상호 연결된 공간, 그리고 해당 장르에서 종종 초점이 되지 않는 미묘한 스토리텔링에 대한 헌신에 이르기까지, 문라이트 키즈의 스튜디오 정체성에 근간을 이루고 있습니다.
기술적인 측면에서, 팀의 내부 도구 라이브러리도 대화 시스템, FMOD 인터페이스 계층, 컨트롤러 및 동적 입력 아이콘 코드, 화면 흔들림을 포함하여 The Wild at Heart에서 도약을 이루었습니다.

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
핵심 디자인 원칙: 직조공은 기억한다
능력 게이트가 없고 매 루프마다 초기화되는 세상에서, 문라이트 키즈는 실행 간에 무엇이 지속될지에 대한 규칙을 정해야 했다. 그들은 몰입을 깨지 않는 서사적 해결책에 도달했다. 플레이어 캐릭터인 직조공은 루프를 거치면서 기억을 유지합니다. 그들이 자신의 뇌에 기억하는 모든 것을 루프 안으로 가져오는 것이 허용됩니다. "직조공이 그것을 본다면, 플레이어도 그것을 봐야 한다"고 크리스가 설명합니다. "그것은 메트로이드브레인이야 규칙을 깨지 않는다."
이 결정은 플레이어가 잠금 해제한 지식을 추적하는 진행 화면부터 레벨 구성에 이르기까지 게임 전체에 영향을 미칩니다. 숨겨진 영역이 드러나면 전경 작품이 사라집니다. 플레이테스트 중에는 루프를 거치면서 지속되지 않았지만, 팀은 플레이어들이 어떤 단축키를 발견했는지 계속 잊어버린다는 것을 알게 되어 양보하고 플레이어들이 가장 자주 방문하는 지역의 전경을 영구적으로 흐리게 만들었습니다.

Echo Weaver | Moonlight Kids | Unity
영구적인 지름길 없는 레벨 디자인
플레이어 지식을 사용하여 특정 업그레이드보다 진행을 제한하는 것은 표준 레벨 디자이너의 도구 상자에서 중요한 도구를 제거하는 것입니다. 메트로이드바니아는 보통 일방통행 벽과 영구적인 지름길에 의존합니다. 벽을 부수면 그 경로는 나머지 플레이 동안 열려 있습니다. "시간 루프 게임인 Echo Weaver에서 벽을 부수고 루프를 리셋해도, 그 벽은 그냥 다시 나타난다고" 크리스가 말한다. "그것이 반드시 제 도구 상자에 있던 것은 아닙니다."
팀의 이 문제에 대한 해결책은 두 가지 규모에서 작동합니다. 단일 루프 내에서 – 플레이어가 얼마나 많은 시간을 모았는지에 따라 몇 분 동안 실행될 수 있는 – 크리스는 전통적인 메트로이드바니아 디자인 트릭을 구사할 수 있었는데, 이는 하나의 루프 안에 포함된 모든 것이 같은 루프 내에서 보상을 줄 수 있기 때문입니다. 팀은 이 제약 조건을 염두에 두고 게임의 각 레벨 분기와 영역을 설계했습니다.
더 크고 복잡한 단축키의 경우, "다크 소울의 파이어링크 신전을 생각해보라"고 안키트가 말하듯이, 유일한 실제 선택지는 은폐입니다. 통로가 한쪽 끝에서는 전경 예술품 뒤에 숨겨져 있고 다른 쪽 끝에서는 전경에 배치되어, 눈에 띄는 곳에 숨겨진 비밀을 만들어낼 수 있습니다. 그는 Tunic 같은 게임들이 원근감을 정말 잘 살린다고 덧붙인다.

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
선수 시간 관리하기
Echo Weaver의 시계는 가장 두드러진 시스템이며 플레이어에게 항상 보입니다. 모든 루프는 시계에서 1분의 시간으로 시작합니다. 플레이어들은 시간을 연장하기 위해 타임 크리스탈을 찾거나, 크리스탈을 희생하여 치유할 수 있습니다. 여기서 올바른 균형을 찾는 것이 성공에 매우 중요합니다.
게임 초기 버전에서는 타이머가 초 단위로 줄어들었는데, 플레이테스터들은 그것을 싫어했습니다. "그것은 많은 스트레스를 유발했다"고 크리스가 말합니다. 어느 날 우리가 "만약 시계를 없애버리면 어떨까?"라고 생각했어. 당신은 정말 초가 필요하지 않습니다. 당신이 알아야 할 것은 분뿐입니다."
최종 HUD는 시간 조각들의 행으로, 각 조각은 1분을 나타냅니다. 인게임 NPC들이 "8분에 돌아와"와 같은 말을 해서 판타지 분위기를 깨뜨렸기 때문에 이들을 "종"이라고 부릅니다. 세상의 거의 모든 것이 이 1분짜리 비트에 맞춰 신중하게 조율되어 있습니다. 플레이테스터들은 이 새로운 시스템에 긍정적으로 반응했고, 곧 "부트업 시퀀스"를 발명했는데, 이는 루프의 처음 몇 초 안에 엄청난 양의 시간을 절약하는 고도로 최적화된 시작 경로입니다.

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
시간 루프가 어떻게 작동하는가
그러면 Echo Weaver에서 타임 루프가 리셋되면 어떻게 되나요? 안키트의 아키텍처는 게임 세계를 청크로 나누고, 각 청크에 청크 스크립트를 태그하며, 미리 비용이 많이 드는 콘텐츠를 제거하는 사용자 지정 빌드 프로세스를 사용합니다.
무겁고 변하지 않는 레이어 – 모든 월드 지오메트리와 전환 마커 – 는 씬에 구워져 영구적으로 로드된 상태를 유지합니다. 가벼운 "필수" 장면은 휘발성 상태를 유지합니다: 게임 관리자, 플레이어 및 실행별 데이터. 재설정 시 게임은 활성 청크를 언로드하고 에센셜 씬을 완전히 폐기한 후 다시 로드하며, 루프 시작 시퀀스에 필요한 청크만 스트리밍으로 다시 불러옵니다.
"그것은 우리가 지속되는 것과 지속되어서는 안 되는 것을 완화하는 하나의 큰 방법입니다. 그냥 버리고 다시 하는 거죠."라고 안키트가 말합니다. 어차피 아주 가벼운 장면이라서 망치고 다시 하는 게 큰 걱정거리가 아니에요.
실행별 상태는 문자열 키의 인메모리 딕셔너리에 저장되며, 해당 딕셔너리를 지우는 것이 초기화의 일부입니다. 루프를 거쳐 생존해야 하는 모든 것들 – 루프 횟수, 본 능력들, 대화했던 캐릭터들 – 은 디스크에 직렬화됩니다. 각 객체는 청크가 스트리밍될 때 자신의 키를 확인하며, 종종 불리언이나 정수만 읽습니다.
그 접근 방식이 완전히 버그가 없는 것은 아닙니다. 안키트는 지속적인 전환 도어가 루프 사이에 UI 상태를 완전히 재설정하지 않는다는 것을 발견했고, 그래서 그냥 지속하는 것을 중단했습니다. 이제 각 문의 상호작용 구성 요소는 재설정될 때마다 다시 인스턴스화되는 복제본입니다. "20개 정도의 객체에 대해서는 중요하지 않아요. 성능에 영향을 미치지 않거든요."라고 그가 설명합니다.
열쇠와 같은 휴대 가능한 아이템은 더 미묘한 문제를 야기했습니다. 한 청크에 존재하는 아이템은 게임 세계 어디든 이동할 수 있었고, 청크 수준의 소유권은 이러한 객체들이 플레이어의 인벤토리에서 사라지거나 복제되는 것을 의미했습니다. 이것을 수정하기 위해 팀은 항목들을 영구 씬 레이어로 이동했습니다.

에코 위버의 에디터 내 계층적 환경 에셋

Unity 에디터 위버의 애니메이션 살펴보기
장면 로딩 중
게임을 로드하는 것이 더 어려운 문제를 제시했습니다. 인스턴스화는 메인 스레드에서 동기적으로 이루어지므로, 장식용 에셋은 빌드 시점에 청크에서 제거되고(크기, 회전 및 스프라이트 설정은 ManualOverrides로 유지됨) 비동기적으로 재인스턴스화되며 프레임당 몇 개의 객체로 배치됩니다. 인접 청크를 항상 로드하는 이웃 시스템과 결합되면, 팝인 현상은 눈에 띄지 않습니다.
배칭
저스틴의 손으로 그린 작품이 반복되는 패턴을 피하기 때문에 배치 기회가 드물었고, 그래서 안키트는 스프라이트 그룹을 단일 이미지(및 단일 드로우 콜)로 평탄화하는 도구를 작성했습니다. 예를 들어, Echo Weaver의 생물군계 중 하나의 하늘은 수십 개의 거의 동일한 플랫폼으로 구성되어 있는데, 이 도구를 사용하여 몇 가지 고유한 악센트와 함께 두 개의 합성 스프라이트로 축소했습니다.
조명
Echo Weaver의 초기 조명 설정은 비쌌습니다. 스프라이트는 원래 각기 네 가지 다른 라이트 유형(배경, 플레이어, 아이템, 바닥 변형)을 가지고 있었으며, 한때 한 번에 16가지의 고유한 조명 텍스처가 렌더링되었습니다. "여섯 개의 얇은 레이어를 세 개의 컷으로 통합하여 극적으로 줄였는데, '시각적인 부분은 손상되지 않았다고 생각합니다'라고 안키트가 말합니다."
물 효과
워터는 Unity Asset Store 가져왔습니다: Game2D Water Kit, 유니버설 렌더 파이프라인에서 실행 중입니다. "매우 유연하고 정말 좋은 결과를 만들어냅니다."라고 안키트가 말하지만, 각 수역이 카메라를 다시 렌더링하고, 표면 아래에 굴절되는 레이어 그룹 수에 따라 비용이 증가합니다. 팀은 수중 레이어를 통합했고, 퍼블리셔 아쿠파라 게임즈의 사내 포팅 팀은 저사양 하드웨어에 대해 더 나아가 플러그인의 가짜 표면 진입 시점 효과를 굴절 설정과 분리하여 약한 장치들도 다시 그리지 않고도 시각적 효과를 유지할 수 있도록 했습니다.

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
디버깅
Unity의 Frame Debugger는 이 최적화 작업의 많은 부분에서 중심적인 역할을 했으며, Ankit이 프레임 드로우 콜을 콜별로 단계별로 실행하며 배치(batching)가 정확히 어디서 깨지고 왜 깨지는지 볼 수 있게 해주었습니다. 그 후 작업은 통합하는 것이었습니다. 자료를 통일하고, 흩어진 스프라이트를 변환하며, 가능한 한 많은 프레임을 일괄 처리할 때까지 재확인하는 것이었습니다. "여전히 여기저기 배칭이 깨지는 것을 볼 수 있어요," 그가 말합니다. "하지만 예전보다는 훨씬 덜해요." 안키트의 다른 팀들에 대한 조언은 간단합니다. "지금 바로 프레임 디버거 아낌없이 사용하세요!"

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
2021 LTS에서 Unity 6까지
The Wild at Heart는 Unity 2021에 출시되었으며, Echo Weaver는 출시 직전에 한 버전으로 잠기는 Unity 6에 출시됩니다. 버전 간에 일상적인 변화가 무엇인지 묻자, 크리스는 망설이지 않았다: "중첩 프리팹과 편집 모드 – 그것들은 삶을 바꿔 놓았습니다."
Ankit은 팀이 Composite Collider 2D를 아낌없이 사용했다고 말했으며, Unity의 네이티브 오브젝트 풀 덕분에 그는 The Wild at Heart를 위해 작성했던 커스텀 오브젝트 풀 관리를 마침내 중단할 수 있었습니다. "적용 가능한 곳에서는 내장된 기능을 사용하는 것이 좋다"고 그는 언급합니다.

에코 위버 | 문라이트 키즈 | 아쿠파라 게임즈
소규모 팀을 위한 이별 조언
인터뷰를 마무리하며, 저희는 크리스와 안키트에게 Unity 게임을 만들고자 하는 다른 개발자들에게 어떤 조언을 해줄지 물었습니다.
"제가 이것 때문에 비난받을지도 모르겠네요," 안키트가 말을 꺼내며, "하지만 통념은 초기에 최적화하지 말라고 말합니다." 그것이 반드시 사실이라고 생각하지는 않아요. 초기에 성능을 고려하여 설계하면 나중에 많은 시간을 절약할 수 있습니다.
팀은 프로젝트 초기에 Echo Weaver의 청크 스트리밍 시스템을 구현했습니다. 입자는 첫날부터 모아졌습니다. 안키트는 가비지 컬렉션 압력이 빠르게 쌓일 수 있기 때문에 C#의 편의성을 항상 조심하려고 노력합니다. 게임을 출시하려고 한다면, 결국 성능이 좋아야 합니다. 왜 스스로 불가능해 보이는 구석으로 몰아넣는가? 나중에 성능을 높인다는 것은 거대한 변경 사항을 의미합니다."
크리스는 디자인과 스튜디오의 창의적 정체성을 활용하는 것의 중요성에 대해 몇 가지 조언을 해주었습니다. "이런 지식 게이트 게임을 만드는 것은 큰 그림에 극도로 의존한다"고 그는 말합니다. 우리는 전체 프로젝트가 완성될 때에야 비로소 끝낼 수 있는 부분들을 수년간 반복적으로 다듬었습니다. 이 많은 부분이 초기에 영화처럼 대본으로 짜여졌을 수도 있고, 여전히 많은 반복의 여지를 남길 수도 있었을 겁니다."
하지만 그가 다르게 할 한 가지는 직감을 믿고 익숙하고 옳다고 느껴지는 것을 계속 만드는 것입니다. 돌이켜보면, 아무도 The Wild at Heart를 원하지 않았으니 완전히 다른 것을 하자고 말한 것은 우리 잘못이었다. 사람들은 무엇을 원하는가? 아니요, 진정으로 자신의 강점을 살리세요. 우리는 시장에 맞춰 어떻게 플레이할지 알아내는 데 많은 시간을 낭비했습니다. 결국 우리는 그냥 "우리가 뭘 하고 있는 거지?" 같은 상태가 되었어요. 잘하는 것을 하세요. 당신이 만들고 싶은 게임을 만드세요.
Echo Weaver가 오늘 Steam, PlayStation®5, Nintendo Switch™ 2, Nintendo Switch, Xbox Series X|S에서 출시됩니다. Steam 큐레이터 페이지에서 Unity로 제작된 게임을 더 많이 탐색하고, Unity 블로그와 리소스 허브에서 Unity 개발자들의 더 많은 이야기를 확인하세요.
Nintendo Switch는 Nintendo의 등록상표입니다.