sample-game 타이틀을 생성하고, XBOX Series X|S 콘솔용으로 빌드하며, 전체 게임을 XBOX 개발 키트에 배포하고, 시작 실패를 진단하며, 설치 가능한 XVC를 생성하는 엔드-투-엔드 프로세스를 다룹니다.
완성된 샘플은 C++, Direct3D 12, XBOX Extensions를 포함한 GDK(GDKX)를 사용합니다. 또한 선택적 렌더링 헬퍼로 DirectXTK12를 사용합니다. 두 패들 모두 컴퓨터가 조작하므로 그래픽, 게임플레이, 효과를 반복 작업하는 동안 게임이 무인으로 실행될 수 있습니다.
무엇을 빌드하나요
이 워크스루가 끝나면 다음을 얻게 됩니다:- 네이티브 XBOX GDK 프로젝트 (UWP 프로젝트 아님).
- XBOX Series X|S 콘솔 및 XBOX One 제품군 콘솔용 Debug, Profile, Release 구성.
- 점수, 예측 패들 AI, 파티클 효과, 모션 트레일, 텍스처가 적용된 원형 퍽이 있는 자동 플레이 샘플 게임.
- XBOX 개발 키트에서 실행되는 완전한 loose 파일 배포.
- 개발 키트에서 설치 및 테스트 가능한 선택적 Store 연결 XVC.
시작하기 전에
이 워크스루는 다음 환경에서 검증되었습니다:- Visual Studio 2022 Enterprise 17.14.
- 2026년 4월 Update 2 GDKX, 에디션
260402. - XBOX Series X|S 콘솔용
Gaming.XBOX.Scarlett.x64. - XBOX One 제품군 콘솔용
Gaming.XBOX.XboxOne.x64. - DirectXTK12 커밋
e656d54637b2830fc6eb5ecd9b329a9c72cb87d4.
260402 대신 개발 PC에 설치된 GDK 에디션을 사용하세요.
1단계: 작업 폴더 생성
PowerShell을 열고 빈 루트 폴더를 만듭니다.DeviceResources.*, Main.cpp, pch.*, StepTimer.h, 셸 비주얼 PNG 파일을 생성합니다. 샘플별 소스를 추가할 때 이러한 생성된 파일을 그대로 유지하세요.
2단계: XBOX GDK 설치 확인
GDKX와 함께 설치된 XBOX Series X|S VS 2022 Gaming Command Prompt를 엽니다. 바로가기는 일반적으로 시작 메뉴의 Microsoft GDK 아래에 있습니다. 일반 명령 프롬프트에서 환경을 초기화할 수도 있습니다:GXDKEDITION이 비어 있음.- XBOX 명령 프롬프트 바로가기가 없음.
- Visual Studio에 XBOX 프로젝트 템플릿이 표시되지 않음.
Gaming.XBOX.Scarlett.x64MSBuild 플랫폼을 사용할 수 없음.xbconnect또는xbapp을 찾을 수 없음.
3단계: 네이티브 XBOX 프로젝트 생성
1
Visual Studio 2022를 열고 Create a new project 선택
Language를 **C++**로, Platform을 XBOX로, Project type을 Games로 설정합니다.
2
Direct3D 12 XBOX Game 선택
프로젝트 이름을
sample-game으로, 위치를 D:\repos\sample-game으로 설정합니다.3
Place solution and project in the same directory는 선택 해제
솔루션은 루트에, 프로젝트는
D:\repos\sample-game\sample-game에 위치하도록 합니다.4
프로젝트 생성
d3d12game_gx 템플릿 파일을 수동으로 복사하는 것은 복구 기법일 뿐, 권장되는 새 프로젝트 워크플로가 아닙니다.
프로젝트가 UWP가 아닌지 확인
게임 코드를 추가하기 전에 프로젝트가 다음 조건을 만족하는지 확인합니다:MicrosoftGameConfig.mgc를 포함.Gaming.XBOX.*.x64프로젝트 플랫폼 사용.- XBOX GDK 플랫폼 라이브러리에 링크됨.
- 타이틀 구성으로
Package.appxmanifest를 사용하지 않음. - Universal Windows 템플릿이 아닌 Direct3D 12 XBOX Game에서 생성됨.
4단계: GDK 에디션 고정 및 콘솔 대상 구성
GDK 에디션을 고정하면 향후 GDK 설치가 프로젝트에서 사용하는 툴체인을 조용히 변경하는 것을 방지할 수 있습니다.sample-game.vcxproj의 주 속성 그룹에 다음을 설정합니다:
타이틀이 XBOX Series X|S 콘솔만 지원하는 경우, XBOX One 제품군 콘솔 구성을 생략할 수 있습니다. 세대 간 동일 타이틀 출시에 관해서는 Cross-gen을 참조하세요.
5단계: 수정되지 않은 템플릿 빌드
종속성이나 게임 코드를 추가하기 전에 생성된 템플릿을 빌드합니다. 이렇게 하면 툴체인 문제와 샘플에서 발생하는 문제를 분리할 수 있습니다. XBOX Series X|S VS 2022 Gaming Command Prompt에서:6단계: DirectXTK12를 선택적 헬퍼로 추가
DirectXTK12는 GDK 타이틀 생성에 필수는 아닙니다. XBOX GDK 템플릿은 이미 Direct3D 12를 사용해 게임을 빌드하는 데 필요한 Direct3D 12 디바이스, 커맨드 큐, 스왑 체인, 게임 루프를 제공합니다. 이 샘플은 별도의 Microsoft 오픈 소스 DirectXTK12 라이브러리를 사용하여 스프라이트 렌더링, 디스크립터 관리, 텍스처 로딩, 리소스 업로드, 그래픽 메모리 관리에 필요한 저수준 렌더링 유틸리티 코드의 양을 줄입니다. 타이틀은 이러한 헬퍼를 자체 엔진이나 직접적인 D3D12 구현으로 대체할 수 있습니다. DirectXTK12를 프로젝트에 클론합니다:external\DirectXTK12\DirectXTK_GDKX_2022.vcxproj를 솔루션에 추가합니다.sample-game에서 DirectXTK12를 프로젝트 참조로 추가합니다.- include 디렉터리에
$(SolutionDir)external\DirectXTK12\Inc를 추가합니다. - 두 프로젝트를 동일한 XBOX 플랫폼 및 구성으로 빌드합니다.
sample-game 프로젝트는 다음 속성을 사용합니다:
CompileShaders.cmd를 호출하도록 변경되었습니다:
7단계: 게임 코드 추가
이 샘플은 시뮬레이션이 Direct3D 코드를 변경하지 않고 조정될 수 있도록 게임플레이 상태를 렌더링과 분리합니다.DeviceResources.*, Main.cpp, pch.*, StepTimer.h와 5개의 셸 비주얼 PNG 파일을 포함한 템플릿 생성 파일을 그대로 유지합니다. 다음 샘플별 파일을 프로젝트에 추가합니다:
고정 시뮬레이션 스텝 사용
이 프로젝트는 템플릿의StepTimer를 120Hz 고정 업데이트로 사용합니다. 고정 스텝은 프레임 시간이 변동해도 충돌 반응과 AI 동작을 안정적으로 유지합니다.
시뮬레이션은 다음을 포함합니다:
- 두 개의 패들 상태.
- 하나의 원형 퍽 상태.
- 좌우 점수.
- 서브 지연 및 교대로 이루어지는 서브 방향.
- 패들, 벽, 골 충돌에 대한 임팩트 이벤트.
원형 퍽 충돌 구현
각 패들을 축 정렬 사각형으로, 퍽을 원으로 처리합니다:- 퍽 중심에 가장 가까운 패들 사각형 위 지점을 찾습니다.
- 해당 지점에서 퍽 중심까지의 제곱 거리를 측정합니다.
- 거리가 퍽 반지름의 제곱보다 크지 않으면 충돌이 발생한 것입니다.
- 반복 겹침을 방지하기 위해 퍽을 패들 밖으로 이동합니다.
- 히트 오프셋과 패들 속도로부터 나가는 각도를 계산합니다.
- 퍽의 속도를 최대치까지 조금씩 증가시킵니다.
예측 자동 플레이 추가
각 패들은:- 퍽이 자신의 수평 위치를 가로지를 지점을 예측합니다.
- 예측 좌표를 위/아래 아레나 벽에서 반사시킵니다.
- 고정된 반응 간격으로 목표를 업데이트합니다.
- 스냅 대신 가속과 최대 속도 제한을 사용합니다.
- 작은 결정론적 조준 오차를 추가합니다.
DirectXTK12로 장면 렌더링
다음을 생성합니다:GraphicsMemory.- 흰색 텍스처와 퍽 텍스처를 포함하는 디스크립터 힙.
- 일반 알파
SpriteBatch. - 파티클용 가산
SpriteBatch. ResourceUploadBatch및CreateDDSTextureFromFile을 통한 DDS 텍스처.
SpriteBatch로 아레나, 중앙선, 패들, 점수, 퍽 트레일, 퍽을 그립니다. 가산 패스에서 파티클을 그립니다.
완성된 샘플은 1920x1080 가상 좌표계로 렌더링되며 해당 장면을 출력 뷰포트로 스케일링합니다.
효과는 절제된 수준으로 유지
최종 튜닝은 다음과 같습니다:- 짧게 지수적으로 감쇠하는 화면 흔들림.
- 더 작은 줄무늬 모양의 임팩트 파티클.
- 벽 히트보다 패들 히트에서 더 많은 파티클.
- 골에서는 더 강한 버스트.
- 낮은 알파의 퍽 트레일.
- 짧은 녹색 임팩트 플래시.
8단계: 텍스처 자산 생성 및 배포
샘플에는 다음이 필요합니다:Assets\white.dds: 사각형과 파티클을 그리는 데 사용되는 1x1 흰색 RGBA 텍스처.Assets\xbox_logo.dds: 퍽에 사용되는 256x256 RGBA 텍스처.
- 소스 로고를 로드합니다.
- 256x256으로 크기를 조정합니다.
- 원형 알파 마스크(페더링)를 적용합니다.
- DX10 헤더가 있는 RGBA8 DDS를 씁니다.
- 1x1 흰색 DDS를 만듭니다.
sample-game.vcxproj에서 두 DDS 파일 모두를 배포 콘텐츠로 등록합니다:
표준 헤더에 DX10 확장을 포함한 DDS 파일은 픽셀 데이터 앞에 148바이트가 있습니다. 원래 세션에서 사용자 지정 DDS 라이터는 152바이트를 방출했고 타이틀은 텍스처 로딩 중
0x8007000D로 실패했습니다. 사용자 지정 DDS 라이터를 사용하는 경우 배포 전에 헤더 레이아웃을 검증하세요.9단계: 게임 빌드
XBOX Series X|S VS 2022 Gaming Command Prompt에서:sample-game.exeMicrosoftGame.config- 셸 비주얼 PNG 파일
Assets\white.ddsAssets\xbox_logo.dds- 필수 런타임 DLL
- 빌드가 생성한 Game OS 이미지 또는 기타 배포 메타데이터
MicrosoftGameConfig.mgc라는 이름입니다. GDK MGCCompile 빌드 항목이 이를 검증하고 빌드 출력에 MicrosoftGame.config를 내보냅니다. 배포와 패키징 모두 생성된 .config 파일을 사용합니다. Game config를 참조하세요.
10단계: XBOX 개발 키트에 연결
콘솔의 Tools IP 주소 또는 호스트 이름을 사용하여 기본 콘솔을 설정합니다:11단계: 전체 게임 배포
전체 빌드 출력 폴더를 배포합니다:xbapp list를 사용하여 등록된 패키지 전체 이름과 애플리케이션 사용자 모델 ID(AUMID)를 찾습니다. AUMID는 !Game으로 끝납니다.
12단계: 게임 실행 및 확인
xbapp list가 보고한 정확한 AUMID를 실행합니다:
13단계: 즉시 실행 실패 진단
게임이 즉시 종료된다면 실행 파일이 복사되었다는 이유만으로 배포가 성공했다고 가정하지 마세요.마지막 타이틀 결과 가져오기
디버그 출력 모니터링
한 명령 프롬프트에서 디버그 출력 모니터를 시작합니다:OutputDebugStringA 메시지를 추가했습니다:
- 게임 초기화.
- DirectXTK12 리소스 생성.
- 각 텍스처 로드.
- 스프라이트 파이프라인 생성.
- 텍스처 업로드 완료.
- 프레임 예외.
white.dds 로딩으로 좁혀졌습니다. 로더는 0x8007000D를 반환했고, 이는 잘못된 형식의 DDS 데이터를 식별했습니다. DDS 헤더를 수정하고 깨끗한 전체 배포를 수행하자 실행이 정상화되었습니다.
더 많은 실행 진단은 실패를 재현하면서 xbWatson을 실행하세요. Error handling도 참조하세요.
14단계: 안전하게 반복 작업
대부분의 코드 전용 변경 사항의 경우:- Debug를 빌드합니다.
- 실행 중인 패키지를 종료합니다.
- 전체 출력 폴더를 배포합니다.
- 등록된 AUMID를 실행합니다.
- 패키지 상태를 쿼리합니다.
MicrosoftGameConfig.mgc, 자산 또는 배포 메타데이터가 변경된 경우 다시 배포하기 전에 이전 loose 배포를 제거하세요. 이렇게 하면 오래된 파일이나 등록 데이터가 수정 사항을 가리는 것을 방지할 수 있습니다.
선택: XVC 생성 및 테스트
Loose 배포는 가장 빠른 개발 루프입니다. 소매 유사 설치를 테스트하거나 Partner Center에 제출할 패키지를 준비할 때 XVC를 생성하세요. 전체 패키징 레퍼런스는 Packaging을 참조하세요.MicrosoftGame.config를 Partner Center와 연결
제품의 Game setup > Identity details에서 다음 값을 얻습니다:- Package Identity Name.
- Package Identity Publisher.
- Publisher Display Name.
- Store ID.
- XBOX Title ID.
- MSA App ID.
TargetDeviceFamily="Scarlett"이 필요합니다. XBOX One 제품군 콘솔 패키지에는 별도의 구성을 사용하세요.
Release 구성 빌드
패키지 콘텐츠 준비
Release 출력을 준비 디렉터리에 복사하되,gameos.xvd는 콘텐츠 맵 바깥에 유지하고 PDB 파일은 일반 패키지 콘텐츠로 포함하지 마세요.
레이아웃 생성
개발 키트 테스트 패키지 생성
기본 테스트 암호화는 로컬 개발 키트 설치에 유용합니다:Partner Center 패키지에는 제출 암호화 사용
sample-game 패키지는 처음에 설치와 실행을 확인할 수 있도록 개발 키트 테스트 암호화로 생성되었습니다. 제출될 패키지의 경우 현재 패키징 정책을 따르고/lk 또는 /l을 사용하세요.
권장되는 반복 가능한 /lk 워크플로:
