Unity 에디터에서 씬을 빠르게 로드하는 도구 만들기
요약
본 기사는 게임 개발 과정에서 여러 개의 씬(Scene)을 효율적으로 관리하고 로드하는 도구 제작 방법을 다룹니다. 특히, 대규모 프로젝트의 멀티-씬 워크플로우를 지원하기 위해 필요한 특정 매니저나 비헤이비어를 한 번에 활성화할 수 있는 기능을 구현하는 것에 초점을 맞추고 있습니다.
핵심 포인트
- Unity 에디터에서 씬 접근성을 높이는 도구 제작 방법을 소개합니다.
- 단순히 씬을 미리 보는 것을 넘어, 여러 씬 그룹을 동시에 로드할 수 있습니다.
- 대규모 프로젝트의 복잡한 멀티-씬 워크플로우를 효율적으로 지원합니다.
게임 개발 과정에서 특정 목적으로만 설계된 씬들이 있는 것은 드문 일이 아닙니다. 예를 들어, 여기는 제가 차량 컨트롤러를 테스트하고 모든 소품(props)이 그것과 어떻게 상호작용하는지 확인하기 위해 사용하는 소품 갤러리 씬입니다. 원하는 특정 레벨을 찾기 위해 'scenes' 폴더로 이동하는 과정은 다소 번거롭습니다. 예를 들어, 캐릭터 쇼룸으로 들어가 테스트하고 싶거나, 아니면 현재 작업 중인 다운타운(downtown) 레벨에 빠르게 접근해야 할 수도 있습니다.
그래서 제가 이 게임을 위해 특별히 한 것은 에디터 상단에 작은 버튼을 추가하여 게임의 모든 씬에 접근할 수 있게 만든 것입니다. 지금 프로젝트는 매우 간단해서 어디서든 게임을 플레이하고 해당 씬을 테스트할 수 있지만, 대규모 프로젝트에서는 멀티-씬 워크플로우(multi-scene workflow)를 갖는 경우가 흔하며, 게임이 특정 상태에서 테스트되려면 다른 씬의 특정 매니저나 비헤이비어(behaviors)를 로드해야 할 수도 있습니다.
이 경우에는 UI가 없으므로, UI 모듈을 로드해야 합니다. 그러면 게임이 어떻게 보일지 확인하고 화면의 UI와 모든 것이 작동하는지 확인할 수 있습니다. 따라서 동시에 활성화되어야 하는 두 가지 다른 씬이 여기 있습니다. 그래서 저희는 단순히 게임의 모든 씬을 미리 볼 수 있게 할 뿐만 아니라, 한 번에 로드하고 싶은 씬 그룹을 정의할 수 있는 도구를 구축해 보겠습니다. 자, 어떻게 이런 것을 만들 수 있는지 살펴보겠습니다.
계속하기 전에, 이번 영상의 스폰서인 Xsolla에게 감사의 말씀을 전하고 싶습니다. 여러분도 아시다시피, Game Developers Conference(GDC)가 올해 막 끝났습니다. GDC는 업계 동료들로부터 최첨단 기술과 창의적인 아이디어를 배울 수 있는 개척지이며, Xsolla 역시 다르지 않습니다. 그들은 게임 개발자들에게 다음에 올 것들을 만들어가는 모든 것에 초점을 맞추고 있기 때문입니다. [music] Xsolla는 인디 스튜디오부터 AAA 퍼블리셔에 이르기까지 모든 플랫폼의 게임 개발자를 위해 특별히 설계된 도구와 서비스를 구축하는 글로벌 비디오 게임 커머스 회사입니다.
Web Shop, 글로벌 결제 시스템, 게임 출판 도구 같은 제품들을 통해 그들은 1,500명 이상의 게임 개발자들이 전 세계적으로 사업을 성장시키는 것을 도왔으며 [music] 개발자가 플레이어에게 도달하고 수익을 창출하는 방식을 재정의하고 있습니다. 저는 채널에서 Xsolla Web Shop에 대해 이전에 이야기한 적이 있는데, 이는 플레이어에게 직접 판매하여 플랫폼 수수료를 절약하고 플레이어와의 관계를 스스로 통제할 수 있어 자체적인 수익을 늘릴 수 있는 훌륭한 방법입니다. 장르, 잠재 고객 또는 라이브 운영(live ops) 계획에 관계없이 Xsolla Web Shop은 적응하며, 게임 내 인터페이스와 일치하는 완전한 [music] 웹 기반 생태계로 빠르게 출시하고 확장할 수 있도록 도와줍니다.
코딩이 필요 없고 통합 비용도 0원으로 몇 분 만에 전문적인 브랜드 스토어를 열 수 있습니다. 전 세계적으로 700개 이상의 상점이 개설되었고 플레이어의 재구매율이 60%가 넘는 실적을 가지고 있어, 그 결과가 스스로 말해줍니다. [music] 따라서 작업 중인 무언가를 수익화하고 그 경험에 대한 더 나은 통제권을 원한다면, Xsolla보다 더 찾아볼 필요가 없습니다. [music] Xsolla의 사명은 간단합니다. 개발자들이 훌륭한 [music] 게임을 만드는 데 집중할 수 있도록 출시하고, 성장하고, 승리하는 데 필요한 모든 것을 제공하는 것입니다.
Xsolla와 그 도구에 대해 더 알고 싶다면 아래 설명란의 링크를 따르거나 화면의 QR 코드를 스캔하세요. 이 비디오의 이 부분을 후원해 주신 Xsolla에게 다시 한번 감사드립니다. 계속 진행하겠습니다. 이전에는 GitHub에서 찾을 수 있는 이러한 확장 프로그램과 같은 것을 사용하여 툴바를 확장해야 했지만, 6.3 버전에서는 Unity가 메인 툴바 요소(main toolbar element)에 대한 지원을 실제로 추가하여 Unity 내에서 직접 커스터마이징할 수 있게 되었습니다. 그래서 오늘 저희는 이것을 할 것이며, 데모에는 6.3 버전을 사용하지만, 더 많은 커스터마이징 기능에 관심이 있다면 아래에 이 확장 프로그램 링크를 남겨둘 테니, 제가 몇 년 전에 Unity 5 이후로 제 툴바를 확장했을 때 작성했던 비디오도 확인해 보세요.
따라서 특정 수준의 커스터마이징에 더 관심이 있다면 사용할 수 있는 강력한 확장 프로그램이 있지만, 오늘은 가장 접근성이 좋은 내장 버전을 사용할 것입니다. 자, 그럼 시작하기 위해 assets 폴더 안에 scripts라는 새 폴더를 만들고 [music] 그 안에 editor라는 새 폴더를 만든 다음, 새로운 에디터 스크립트를 만들겠습니다. [music] 그리고 이것을 'editor toolbar scene button'이라고 이름 붙이겠습니다. 그래서 이것은 거의 모든 일반적인 정적(static) 에디터 메서드처럼 작동할 것입니다.
자, 우리는 public static main toolbar element get scene button을 만들고, 그런 다음 새로운 메인 [music] 툴바 버튼인 new main toolbar content를 반환할 것이며, 현재는 이것을 'scenes'라고만 부르고, 그리고 'on open scenes'라는 액션을 가질 것입니다. 그리고 그 메서드를 생성하겠습니다. 그러고 나서 우리는 메인 툴바 요소 속성(main toolbar element attribute)을 추가하기만 하면 됩니다. 이것을 'scene button'이라고 이름 붙일 것이고, 저는 오른쪽이 좋지만, 물론 원하는 대로 설정할 수 있습니다. 모든 것이 설정되면 순서를 옮길 수도 있으니 크게 중요하지는 않지만, 저는 그냥 오른쪽에 놓겠습니다.
자, 여기서 'scene'을 검색해 보면 씬 에셋 아이콘이 보이는데, 이게 어두운 색깔의 거예요. 다른 하나는 여기 있는 이 씬 에셋 아이콘이에요. 그리고 이 지식을 가지고 텍스처 2D 에셋 아이콘과 편집기 GUI 유틸리티(editor GUI utility) 콘텐츠를 사용하고, 그리고 씬 에셋 아이콘을 사용할 수 있어요. 그런 다음 [music] 이미지를 텍스처 2D로 가져와서 여기에 그냥 전달하면 돼요. 이걸 해야 하고 그 다음에 여기로 전달하고 '툴팁: 씬 선택 도구 열기(tooltip open the scene selection tool)'라는 것을 작성할 거예요.
자, 이제 구석에 우리 씬 아이콘이 생겼어요. 좋아요, 그럼 모든 씬에 대한 참조를 가져올 거예요. 아주 간단해서, 에셋 데이터베이스로 가서 에셋을 찾고 우리 씬 에셋들을 검색할 거예요. 그러면 GUID(Globally Unique Identifier)가 주어지고, 그리고 일반 메뉴([music])도 만들 거예요. 이걸 열어서 컨텍스트(context)로 보여줄 거예요. 여기에서 우리의 GUID를 반복하면서 경로를 얻을 거예요. 그런 다음 씬 에셋을 로드하고 우리 에셋에 대한 메뉴 항목을 만들 거예요.
그래서 에셋 이름(asset.name)을 추가하고, 우리가 씬을 로드할 새로운 메서드를 만들고, 여기에 우리 씬의 경로를 전달할 거예요. 그리고 아래에서 editor scene manager.openScene을 호출한 다음 그냥 이걸 전달하면 돼요. 만약 선택해야 할 씬이 몇 개 안 되고 빠르고 쉽게 [music] 접근하고 싶다면 정말 유용해요. 보시다시피, 원하는 것들을 아주 빠르게 가져와서 각 씬으로 이동하며 [music] 무엇이든 편집할 수 있어요. 하지만 여러 씬을 사용하는 워크플로우(multi-scene workflow)라면, 이건 당연히 그 문제를 해결하지는 못합니다.
따라서, 게임을 플레이 테스트할 수 있도록 한 번에 여러 개의 씬(scenes)이 로드되어야 하는 상황들을 지원해야 합니다. 에디터 폴더에서 새로운 스크립터블 오브젝트(scriptable object)를 만듭니다. 이제 스크립팅 > 스크립트 오브젝트로 이동하여 이것을 'editor scene collection'이라고 이름 붙일 것입니다. 이 것은 매우 간단합니다. 우리가 원하는 모든 씬들의 기본적인 컬렉션일 뿐입니다. 따라서, 씬 에셋(scene assets)의 배열을 만들 것입니다. 그리고 'open'이라는 공개 메서드(public method)를 만든 다음, 여기서 모든 씬 에셋을 순회하며 해당 에셋의 경로를 찾고 'editor scene manager'를 호출할 것입니다.
open scene, 우리의 경로를 전달합니다. 우리가 씬을 열 때, 이것이 로드하려는 첫 번째 인덱스인지 확인하고, 만약 그렇다면 그것을 씬으로 로드하여 이미 열려 있는 모든 것을 언로드(unloads)하게 합니다. 그리고 그 이후의 모든 것들은 추가적으로(additively) 로드합니다. 이렇게 하면 한 번에 모든 씬을 로드할 수 있고, 현재 보고 있는 것도 언로드되도록 할 수 있습니다. 예를 들어, 메뉴 레벨과 UI 씬이 동시에 열리기를 원한다면, 지금 새로운 오브젝트를 만들 수 있습니다.
따라서, 새로운 에셋 세트를 만듭니다. 'Resources'로 이동하여 'scene collections'라는 폴더를 만들고, 그 안에 새로운 'scene collection'을 만들어 이것을 'main menu scenes'라고 이름 붙입니다. 그리고 우리의 씬 에셋들을 추가합니다. 제 UI 씬과 메뉴 레벨을 추가하고 원하는 순서대로 넣겠습니다. 그러면, 이 새로운 'scene collections'을 사용하여, 우리가 해야 할 일은 단순히 리소스 폴더에서 로드한 다음, for-each 루프를 돌면서 그것들을 우리 메뉴 항목에 추가하고, 우리의 'scene collection'에 대해 open 함수를 호출하여 열어주는 것뿐입니다.
예를 들어, 시작 장면(startup scene)이 열려 있다고 가정하고, UI와 배경 장면을 포함하는 메인 메뉴로 로드하고 싶다고 해봅시다. 그러면 'Scenes'를 클릭하고 'Main Menu Scenes'를 선택할 수 있습니다. 이렇게 하면 기존 장면을 대체하며 두 개의 장면 모두에 로드됩니다. 따라서 한 번에 여러 장면에 접근해야 하는 경우, 그리고 이를 장면(scene) 컬렉션(collection)을 통해 쉽고 빠르게 처리할 수 있다는 것이 매우 유용하다는 것을 알 수 있습니다. 잠깐 곁가지로 이야기하자면, 여기 아이콘을 변경하고 싶습니다. 이전에 사용했던 저희의 아이콘 메서드를 사용하여 실제로는 'Scene Set Icon'이 존재합니다.
그래서 우리가 할 수 있는 것은 Unity의 작은 아이콘 기능을 해킹하는 것입니다. 그냥 일반적인 아이콘을 선택하면 [music] 우리의 스크립트가 그 아이콘으로 바뀌고, 메타 파일(meta file)에 파일 ID를 찾고자 하는 ID로 설정합니다. 그러면 Unity가 다시 로드되면서 우리의 아이콘이 해당 값으로 설정됩니다. 그리고 재임포트(reimport)를 하면, 우리의 장면 컬렉션(scene collections)은 'Scene Set Icon'을 갖게 되는데, 이것이 정말 좋습니다. 그래서 마지막 단계로, 보시다시피 게임에 상당히 많은 장면에 있는 경우, 즉 거대한 게임을 만들고 있다면, 이것은 꽤 쓸모가 없습니다.
음, 곧 통제가 불가능해질 것입니다. 이 메뉴는 단지 [music] 지저분한 것이 되기 전에 사용할 수 있는 장면이 다섯 개나 열 개 정도밖에 안 됩니다. 그래서 차라리 이것을 검색 가능한 창(searchable window)으로 전환하는 것이 더 좋을 것 같습니다. 따라서 'Open Scenes'라는 일반적인 메뉴를 호출하는 대신, 검색 가능한 메뉴를 열고 단순히 SearchWindow.open과 우리의 새로운 SearchableMenu 클래스를 호출할 것입니다. 그리고 여기서는 세 가지 주요 그룹을 구성할 것입니다. 먼저 저희의 장면 에셋(scene assets)인 헤더 그룹으로 시작하고, 다음으로 컬렉션(collections)에 대한 그룹, 그리고 개별 장면(individual scenes)에 대한 그룹을 가질 것입니다.
따라서 이렇게 해서 컬렉션과 장면 그룹을 갖게 됩니다. 그리고 이 그룹들 사이에는 반복(iterating)하면서 각 컬렉션에 대해 새로운 검색 항목을 추가하고, 검색 트리 항목의 레벨을 다음 단계인 2로 설정하며, 사용자 데이터(user data)를 우리의 장면 컬렉션으로 설정하는 방식으로 에디터 컬렉션을 추가할 수 있습니다. 그러면 우리의 컬렉션이 여기에 나타납니다. 그리고 우리의 장면에 대해서도 똑같은 작업을 할 수 있습니다. >> 그래서요, 우리의 모든 장면의 GUID를 가져와서 반복하고, 경로(path)를 가져오고, 장면 에셋을 가져온 다음 [음악] 이를 장면 그룹 뒤에 트리 내 새로운 검색 항목으로 추가할 것입니다.
이렇게 하면 컬렉션과 장면에 모두 표시될 수 있으며, 우리가 찾는 모든 것을 검색할 수 있습니다. 예를 들어 메인 메뉴 장면들이 필요하다면 그렇게 로드할 수 있습니다. 그리고 로드는 정말 간단합니다. 우리가 선택했을 때 사용자 데이터가 컬렉션인지 확인하고 그것을 열고, 만약 항목이 에셋이라면 그 장면에 직접 수동으로 접근하여 엽니다. 이렇게 해서 우리는 게임에서 장면을 찾고 로드하는 매우 간단하지만 훨씬 사용하기 쉬운 방법을 갖게 되었습니다.
마지막 단계로 객체 콘텐츠 이미지와 우리의 작은 임시방편적인 모음(hacky gathering) >>을 그룹 항목과 검색 트리 항목 자체에 추가할 수 있습니다. 이렇게 하면 우리가 컬렉션을 여는지 아니면 장면을 여는지를 한눈에 알 수 있게 해줍니다. 그래서 '메인 메뉴'라고 입력하면 그것이 그룹이라는 것을 알고, [음악] 그리고 장면에 대한 내용을 보면 개별 장면들이라는 것을 알게 됩니다. 따라서 네, 이제 우리의 장면에 로드하는 매우 쉽고 효과적인 방법입니다. 그리고 프로젝트가 성장하고 더 많은 장면을 추가할수록, 우리가 찾는 것을 찾고 접근하는 것이 훨씬 쉬워집니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube Game Dev Guide의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기