Unity에서 원클릭으로 Steam 빌드 자동화하기
요약
본 영상은 Unity 에디터 내에서 Steam 빌드 업로드 과정을 원클릭으로 자동화하는 방법을 안내합니다. 스크립터블 오브젝트와 간단한 네트워크 프로세스를 활용하여, 게임 빌드를 실행함과 동시에 Steam에 자동으로 업로드하고 버전 관리를 수행할 수 있습니다.
핵심 포인트
- Unity 에디터 내에서 Steam 업로드 버튼을 구현할 수 있습니다.
- 스크립터블 오브젝트를 사용하여 Steam 관련 설정을 관리합니다.
- 빌드 후 자동화된 프로세스로 콘텐츠를 Steam에 즉시 업로드합니다.
- 버전 번호 증가 기능을 추가하여 빌드를 추적하기 용이합니다.
영상: Automate Your Steam Builds With One Click In Unity!
채널: Game Dev Guide
길이: 13m 24s
출처: 자막 (자동, 영어)
스크립트:
저는 Steam에 빌드를 업로드하는 과정을 완전히 자동화했고, 심지어 이를 위해 Unity 에디터를 벗어날 필요조차 없습니다. 제가 무슨 말을 하는지 한번 보시죠. 제 툴바에 이 버튼이 보이시나요? 이걸 클릭하면 새로운 에디터 창이 열립니다. 이 창을 사용해서 Steam 업로드 설정을 구성할 수 있습니다. 보시다시피, 앱 ID를 설정하고, Unity 빌드 폴더 위치와 콘텐츠 빌더용 Steam SDK 목적지를 선택할 수 있습니다. 또한 업로드하려는 디포(depot)와 빌드를 라이브로 설정하려는 브랜치(branch), 그리고 빌드 설명을 지정할 수도 있습니다.
시간이 지나면서 약간 발전했지만, 저는 제가 작업하는 모든 게임에서 이 도구를 사용합니다. 왜냐하면 이 버튼 한 번의 클릭으로 Unity가 게임을 빌드하고 즉시 Steam에 빌드를 업로드해주기 때문입니다. 한번 눌러서 작동하는 것을 보시죠. 보시다시피, 저는 또한 빌드를 시작할 때 게임의 버전 번호를 자동으로 증가시키는 프로젝트 내 도구를 가지고 있습니다. 저는 이렇게 하는 것이 좋습니다. 왜냐하면 필요할 때 콘텐츠 버저닝을 정확하게 제어할 수 있고, 빌드를 할 때마다 추적할 수 있게 해주기 때문입니다.
이것은 상당히 간단한 스크립트이며, 나중에 영상에서 탐구할 것입니다. 빌드가 완료되면, 이 도구가 Unity 빌드 폴더의 항목들을 Steam 콘텐츠 빌더 폴더로 복사합니다. 그런 다음 커맨드 라인에서 Steamppipe를 열고, 로그인하며, 저를 대신해서 콘텐츠 업로드를 시작합니다. 보시다시피, 이 새 버전이 이제 Steam에 업로드되어 라이브 상태입니다. 따라서 이번 영상에서는 여러분이 Unity 에디터 내부에서 이런 도구를 어떻게 만들고 업로드 프로세스를 자동화할 수 있는지 보여드릴 것이며, 여러분의 노력 없이도 빌드를 실행하면 게임이 즉시 Steam에 업로드되도록 설정하는 방법을 알려드리겠습니다.
그럼 이 툴은 어떻게 작동할까요? 아주 간단합니다. 본질적으로는 몇 가지 스크립터블 오브젝트(scriptable objects)와 단순한 네트워크 프로세스만으로 모든 것을 처리하게 됩니다. 먼저 스크립터블 오브젝트부터 살펴보겠습니다. 'Steam Builder Config'와 'Steam Builder Depot'라는 두 개의 새 스크립트를 만들 것입니다. 이들은 기본적으로 우리가 Steam이 업로드를 위해 사용하는 VDF 파일을 생성하는 데 필요한 모든 정보를 저장할 곳입니다. 먼저 디포트(depot) 설정 스크립터블 오브젝트를 정의해 보겠습니다. 여기에 디포트 ID(depot ID), 로컬 경로(local path), 디포트 경로(depot path), 재귀 값(recursive value), 그리고 파일 제외 목록(file exclusions)에 대한 문자열 항목을 추가할 것입니다.
대부분의 게임에서는 이 경우 디포트 ID만 필요할 가능성이 높지만, 만약을 대비해 이러한 추가 항목들도 포함하겠습니다. 또한 'create asset' 메뉴 속성을 추가하여 이 에셋을 생성하는 방법도 확보해야 합니다. 그런 다음 설정 스크립트(config script)에는 앱 ID(app ID), 유니티 빌드 폴더(Unity build folder), 빌드 출력 폴더(build output folder), 그리고 콘텐츠 루트 폴더(content root folder)에 대한 문자열 필드를 추가할 것입니다. 저는 프로젝트 내에 'builds'라는 이름의 폴더를 만들어서 빌드가 들어가는 곳을 사용합니다. 따라서 여기에서 기본 빌드 폴더로 설정하겠습니다.
다음으로, 출력 경로와 콘텐츠 루트 경로 모두에 대해 Steam SDK에서 기본 폴더 이름을 추가할 것입니다. 게임의 설정이 매우 기본적인 경우라면 이들을 변경할 필요가 없을 가능성이 높지만, 만약 그렇게 할 경우를 대비하여 나중에 에디터에서 사용자 정의할 수 있는 지원을 추가하겠습니다. 다음으로 브랜치 이름(branch names)에 대한 문자열 리스트와 현재 인덱스(current index)에 대한 정수 값을 추가합니다. 그런 다음 디포트 설정(depot settings)에 대한 리스트를 추가합니다. 마지막으로, 유니티로 돌아가서 프로젝트 내에 이 두 스크립터블 오브젝트를 모두 생성해 보겠습니다.
이제 게임에 필요한 설정을 구성할 수 있는 settings 에셋이 준비되었습니다. 다음으로, 이 에셋들을 설정하고 Steam으로 빌드를 제어하는 데 도움이 될 editor window를 만들어야 합니다. UI toolkit wizard를 사용하여 새로운 editor window를 생성해 보겠습니다. 이전 영상에서 툴바 버튼을 생성하는 방법을 이미 시연했기 때문에 여기서는 건너뛰겠습니다. 더 자세히 알고 싶다면 아래에 비디오 링크를 걸어두겠습니다. 하지만 본질적으로, 그 영상과 동일한 과정을 사용해서 여기에 Steam 아이콘이 있는 버튼을 만들고, 이 버튼이 방금 만든 새로운 editor window를 열도록 할 것입니다.
UI builder에서 우리의 창을 열고 패널 구축을 시작해 봅시다. 필요한 것과 일치하도록 빌더 설정을 editor dark mode로 설정하고, 에디터 요소들도 활성화되었는지 확인합시다. 컨테이너 시각적 요소를 하나 사용해서 시작한 다음, 또 다른 컨테이너 요소를 추가할 것입니다. 이곳이 메인 구성 정보가 들어갈 곳입니다. 여기에는 레이블과 버튼을 추가하여 구성 영역의 헤더를 만들 것입니다. 이 버튼은 결국 우리가 config 에셋을 열 수 있도록 해줄 것입니다. 보통 제가 조금 더 복잡한 작업을 한다면, 이것들을 위해 여러 USS 파일을 설정하겠지만, 간단한 도구이므로 일단 인라인으로 스타일링만 할 것입니다.
다음으로 몇 가지 텍스트 필드를 추가할 것입니다. 첫 번째는 앱 ID가 될 것입니다. 그다음에는 빌드 폴더(build folder), 콘텐츠 경로(content route), 그리고 빌드 출력(build output)을 위한 것을 하나씩 추가합니다. 이들은 버튼이 있는 시각적 요소 컨테이너 안에 배치될 것이며, 사용자가 직접 입력할 필요 없이 위치를 선택하고 자동으로 정의할 수 있도록 하는 데 사용할 것입니다. 그런 다음 우리가 원하는 추가 빌드 정보에 대한 또 다른 헤더를 추가할 것입니다. 여기 아래에는 브랜치 이름(branch name)을 위한 드롭다운 필드를 추가할 것입니다. 그리고 설명(description)을 위한 텍스트 필드도 추가합니다. 마지막으로, 맨 아래 네 개의 버튼이 들어갈 영역을 만들고 각 버튼을 추가하겠습니다.
그리고 이제 에디터 창이 준비되었습니다. 우리가 할 일은 이 창을 데이터에 연결하고 작동하게 만드는 것뿐입니다. 자, 그럼 여기서 필드들에 바인딩(binding)을 설정해 보겠습니다. 본질적으로, 우리는 모든 필드의 값을 해당 구성 스크립트 객체(config script object)의 항목과 매핑해야 합니다. 따라서 여기 에디터의 바인딩 시스템을 사용하여 양방향 값 바인딩(two-way value binding)으로 연결할 것입니다. 필드를 선택하고 값 속성(value property)에서 이 점들을 클릭한 다음 '바인딩 추가(add binding)'를 선택합니다. 유형(type)이 선택되었는지 확인하고, Steam 빌더 구성 클래스(Steam builder conflict class)를 데이터 유형(data type)으로 설정합니다.
다음으로, 여기 목록에서 해당 속성(property)을 가져와서, 이를 양방향으로 설정한 다음 '추가(add)'를 선택합니다. 그리고 나머지 필드들에도 이 과정을 반복하겠습니다. 기본적으로 창을 열면 아무 일도 일어나지 않습니다. 우리의 구성 파일(config file)을 창의 데이터 소스(data source)로 실제로 설정해야 합니다. 따라서 창용 C# 스크립트에서 Steam 빌더 구성 클래스(Steam builder config class)를 위한 속성(property)을 만들고 노출(exposed)되었는지 확인해 보겠습니다. CreateGUI 메서드에서, 먼저 루트 데이터 소스를 이 창으로 설정합니다.
다음으로, 우리의 구성 필드들을 담는 컨테이너에 대한 참조(reference)를 가져와서, 구성 스크립터블 객체(config scriptable object)를 해당 컨테이너의 데이터 소스로 설정합니다. 이제 모든 자식 필드들은 이것을 데이터 소스로 사용하게 됩니다. Unity에서 C# 스크립트를 선택하고 여기 필드에 우리의 구성 파일을 할당합니다. 이는 본질적으로 창이 열릴 때 사용할 기본값(defaults)을 정의하는 것입니다. 따라서 이제 창을 열면, 구성 파일에서 값이 가져와지는 것을 볼 수 있을 것입니다. 또한, 우리의 브랜치 필드(branches field)에도 구성 파일을 데이터 소스로 설정하겠습니다.
이제 이 필드에는 우리가 파일에 구성한 모든 브랜치가 표시되고 선택될 때 올바른 인덱스가 정의되는 것을 볼 수 있습니다. 여기 있는 '열기' 버튼을 누르면 다른 변경 사항을 적용하거나 새 브랜치 이름을 추가하고 싶을 경우, 실제 설정 파일을 열도록 하겠습니다. 이 버튼이 클릭되면 에디터 유틸리티의 openy editor 메서드를 사용하여 구성 파일에 대한 인스펙터를 새 창으로 불러올 것입니다. 또한, 저희 디포(depot) 배열을 위한 사용자 지정 속성 필드를 주입하는 줄도 추가하겠습니다. 이것은 어느 정도 선호도의 문제이지만, 여기 에디터에서 디포 목록을 설정할 수 있는 것이 좋습니다.
또한 빌드에 대한 설명을 위한 속성을 만들고 이를 에디터 필드에도 연결하겠습니다. 이제 우리의 모든 에디터가 작동하고 동기화되었습니다. 따라서 빌드 및 업로드 프로세스를 자동화할 준비가 되었습니다. 그리고 도구와 워크플로우 자동화라는 주제에 대해 이야기하는 김에, 이 비디오의 스폰서인 Farclip에게 감사의 말씀을 전하고자 잠시 시간을 내겠습니다. Farclip은 사용자가 씬을 구축하는 동안 씬을 평가하고 문제 해결하는 데 도움을 주는 공간 논리 도구입니다. Farclip은 사용자의 씬을 읽고 플레이어가 어디를 바라보는지, 어디를 보지 않을지, 그리고 플레이어에게 마찰을 일으킬 수 있는 잠재적인 영역이 있는지 강조 표시합니다.
이는 Unity 에디터에서 로컬로 실행되며 에디터 씬 위에 오버레이 형태로 분석 결과를 그려줍니다. 프로덕션 단계에 있는 씬을 포함하여 모든 유형의 레벨과 레이아웃에 사용할 수 있습니다. 레벨 흐름을 분석하거나, 잠재적인 내비게이션 문제를 식별하고, 결과 간의 레이아웃 변경 사항을 평가하며, 심지어 페이싱 개선 방법에 대한 조언이나 레벨의 디자인 의도를 검증하는 데까지 요청할 수 있습니다. 제가 준비한 이 테스트 씬에서 Farclip에게 전투 만남(combat encounter)으로 활용될 수 있는 잠재적인 영역이 있는지 보여달라고 요청했습니다.
이 도구는 여러 다른 영역을 강조하고 그곳에서 작동할 수 있는 만남(encounter)의 유형들을 표시해 주었습니다. 예를 들어, 저는 계단 위에서 원거리 전투를 하거나 이 구석 공간을 매복 장소로 활용하는 것에 대해 생각한 방식이 정말 마음에 들었습니다. 또한 레벨 내 여러 종류의 만남에 대한 잠재력을 각기 다른 지역으로 평가하여, 어떤 영역이 은신(stealth)이나 전투에 더 적합한지 보여주었습니다. [음악] 본질적으로 Farclipip은 여러분이 레벨과 레이아웃을 훨씬 쉽게 다듬을 수 있도록 힘을 실어줍니다.
제가 생각하기에 AI가 정말 잘하는 것이 바로 이런 종류의 일이며, 특히 플레이어에게 전달되기 전에 게임 디자인상의 잠재적인 문제들을 미리 파악하도록 돕는 이러한 분석 및 검증 도구들은 환영할 만합니다. 따라서 Unity에서 개발하고 Far Clip을 사용해보고 싶다면, 현재 얼리 액세스 단계가 시작되었고 무료로 체험할 수 있습니다. 관심이 있다면 farclipip.ai/gamedev 가이드에서 Farclipip을 다운로드하여 여러분의 레벨에서 어떤 것을 찾아내는지 확인해 보세요. 이 비디오를 후원해 준 Farclipip에게 다시 한번 감사드립니다.
이제 우리의 에디터 도구 제작으로 돌아가 보겠습니다. 제가 가장 먼저 하고 싶은 것은 필요한 다양한 경로들을 설정하는 것과, Steam 자격 증명(credentials)을 가져올 수 있는 방법을 마련하는 것입니다. 물론 저는 그 데이터를 프로젝트 어디에도 저장하여 제 자격 증명이 노출되는 것을 원하지 않습니다. 그래서 대신에 저희 PC의 환경 변수(environment variables)를 활용하여 그렇게 가져올 것입니다. 여기 클래스 상단에 세 개의 정적 속성(static properties)을 만듭니다. Steam SDK 경로용 하나, Steam ID용 하나, 그리고 Steam 비밀번호용 하나를 만들고, 그 다음 environment.getEnvironmentVariable 메서드를 사용하여 이 정보를 간단히 가져올 것입니다.
이제 할 일은 Windows 환경 변수로 이동하여 이 항목들을 각각 설정하는 것입니다. SDK 경로는 로컬 Steam SDK 디렉터리의 루트 폴더를 가리켜야 합니다. 그리고 당연히, Steam ID와 비밀번호 입력란에는 Steamworks 계정에 로그인할 때 사용할 정보를 넣으면 됩니다. 보시다시피, Steam 빌드 폴더 경로를 위한 문자열 항목도 추가했습니다. 이제 SDK가 어디 있는지 알았으니, 여기 에디터에 있는 나머지 세 가지 옵션들을 지원해 보겠습니다. 첫 번째 것은 원하는 곳에서 유틸리티 창을 열 수 있게 해줍니다.
앞서 말씀드렸듯이 제 프로젝트 루트에는 빌드 폴더가 있으므로 기본값으로 남겨두겠습니다. 그리고 getRelativePath 메서드를 사용하여 로컬 디렉터리 문자열을 계산합니다. 나머지 두 버튼에 대해서도 이와 같이 하겠지만, 상대 디렉터리로 Steam SDK를 사용하겠습니다. 좋습니다. 이제 주요 골격(boiler plate) 작업은 끝났습니다. 네 개의 버튼이 작동하도록 해봅시다. 각 버튼마다 새로운 메서드를 만들 것입니다. 그리고 네 번째 버튼은 다른 세 가지 메서드를 순차적으로 호출할 것입니다.
빌드 메서드에서는 먼저 빌드 옵션을 정의하는 것으로 시작하겠습니다. [음악] 빌드 대상에 따라 다른 빌드 이름이 필요합니다. 따라서 이를 반환하는 간단한 메서드를 만들겠습니다. 설정에서 지정된 경로를 getFullPath 메서드를 사용하여 해결하겠습니다. 그리고 빌드 대상에 따라 반환되는 파일 형식을 변경할 것입니다. 여기서는 하드 코딩된 앱 이름을 사용하고 있지만, 원한다면 플레이어 설정에서도 가져올 수 있습니다. 옵션 설정을 마쳤으니, 이제 이 값들을 buildPipeline.buildPlayer 메서드에 전달하여 빌드 프로세스를 시작하고 결과를 기록하겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube Game Dev Guide의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기