Unity Gaming Services를 사용한 라이브 게임 구축하기
UGS 패키지
| 패키지 | 최소 버전 | 목적 |
|---|---|---|
com.unity.services.core | 1.16.0 | 초기화, 의존성 그래프 |
com.unity.services.authentication | 3.6.1 | 플레이어 로그인 및 신원 |
com.unity.services.cloudcode | 2.10.3 | 서버 권한 C# 모듈 |
com.unity.services.cloudsave | 3.4.0 | 플레이어별 및 공유 키-값 저장소 |
com.unity.remote-config | 4.2.5 | 서버 측 게임 구성 |
com.unity.services.deployment | 1.7.2 | 에디터에서 클라우드 리소스 배포 |
com.unity.services.tooling | 1.4.1 | 액세스 제어 및 게임 오버라이드 |
com.unity.services.apis | 1.1.1 | 모든 UGS 서비스용 생성형 REST 클라이언트 |
- 초기화 패턴
- 패키지 맵
- 아키텍처 — 패키지 결합 방식
- 핵심 서비스 — 빠른 참조
- Asset Store 빌딩 블록
- 바로 사용 가능한 기능 청사진
- 일반적인 아키텍처 패턴
- 검증
- 배포 체크리스트
- 상세 참조
초기화 패턴
모든 UGS 게임은 동일한 방식으로 시작됩니다. com.unity.services.core가 먼저 초기화된 후, 플레이어가 로그인합니다:
using Unity.Services.Core;
using Unity.Services.Authentication;
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();
// 이제 다른 모든 서비스를 사용할 수 있습니다
InitializeAsync()가 완료되면 서비스 싱글톤(예: CloudSaveService.Instance, CloudCodeService.Instance)을 사용할 수 있습니다.
패키지 맵
기반
| 패키지 | 목적 | 싱글톤 / 진입점 |
|---|---|---|
| Core | 초기화, 의존성 그래프, 컴포넌트 레지스트리 | UnityServices.InitializeAsync() |
| Authentication | 플레이어 로그인(익명, 소셜, 유니티, 사용자명/비밀번호), 신원 | AuthenticationService.Instance |
| Services APIs | 모든 UGS 서비스용 생성형 REST 클라이언트; 서비스 계정을 통한 관리 API 접근 | 직접 API 클래스 |
플레이어 데이터 및 구성
| 패키지 | 목적 | 싱글톤 / 진입점 |
|---|---|---|
| Cloud Save | 플레이어별 키-값 데이터(Default, Public, Protected) 및 게임 전체 Custom 데이터 | CloudSaveService.Instance.Data.Player / .Data.Custom |
| Remote Config | 서버 측 게임 구성, 기능 플래그, JSON 정의 | RemoteConfigService.Instance |
| Economy | 가상 화폐, 인벤토리 아이템, 구매, 상점 | EconomyService.Instance |
서버 로직 및 보안
| 패키지 | 목적 | 싱글톤 / 진입점 |
|---|---|---|
| Cloud Code | 신뢰할 수 있는 쓰기 및 검증을 위한 서버 권한 C# 모듈 | CloudCodeService.Instance → CallModuleEndpointAsync |
| Tooling | Access Control(.ac) 및 Game Overrides(.ugo) 파일 작성 및 배포 | 에디터 전용(배포 창) |
| Deployment | Unity 에디터에서 클라우드 리소스(.rc, .ac, .ccmr, .lb 등) 배포 | 에디터 전용(서비스 > 배포) |
소셜 및 경쟁
| 패키지 | 목적 | 싱글톤 / 진입점 |
|---|---|---|
| Multiplayer | 세션, 매치메이킹, 로비. 빌딩 블록: Multiplayer Session, Matchmaker Session, Server Session | MultiplayerService.Instance |
| Leaderboards | 점수 제출, 순위, 계층, 버전 기록. 빌딩 블록: Leaderboards | LeaderboardsService.Instance |
텔레메트리
| 패키지 | 목적 | 싱글톤 / 진입점 |
|---|---|---|
| Analytics | 커스텀 이벤트, 표준 이벤트, 동의 관리 | AnalyticsService.Instance |
아키텍처 — 패키지 결합 방식
UnityServices.InitializeAsync()
│
▼
AuthenticationService
(로그인 → PlayerId)
│
┌───────────────┼───────────────┐
▼ ▼ ▼
Remote Config Cloud Save Economy
(게임 구성, (플레이어 상태, (화폐,
정의, 진행, 인벤토리,
기능 플래그) 환경설정) 구매)
│ │ │
└───────┬───────┘ │
▼ │
Cloud Code │
(서버 권한 │
쓰기, 검증, ◄─────────────┘
안티 치트 로직)
│
┌───────┼───────┐
▼ ▼ ▼
Cloud Save Economy Leaderboards
(Protected (서버 (점수
쓰기) 지급) 제출)
핵심 원칙: 게임 무결성에 영향을 미치는 데이터(XP, 보상, 화폐)는 Cloud Code 모듈을 통해 쓰기를 수행하세요. 직접적인 클라이언트 쓰기는 민감하지 않은 데이터(환경설정, 디스플레이 설정)에만 적합합니다.
핵심 서비스 — 빠른 참조
Authentication
패키지: com.unity.services.authentication (>= 3.6.1)
플레이어 신원을 처리합니다. 로그인 방식: 익명, 소셜 제공자(Google, Apple, Steam, Facebook, Oculus 등), Unity 브라우저, 사용자명/비밀번호, 디바이스 코드 흐름.
로그인 후: PlayerId와 PlayerName을 사용할 수 있습니다. 모든 로그인 방식은 SignedIn 이벤트를 발생시킵니다. PlayerAccountService(Unity 브라우저 로그인용)는 별도 어셈블리(Unity.Services.Authentication.PlayerAccounts)에 있습니다.
- 전체 참조: references/authentication.md
- 빌딩 블록: Player Account — 즉시 사용 가능한 로그인 UI 및 신원 관리
Cloud Code
패키지: com.unity.services.cloudcode (>= 2.10.3)
신뢰할 수 있는 작업을 위해 서버 측 C# 모듈(.NET 9)을 실행합니다. 모듈은 .ccmr 파일로 배포됩니다. 클라이언트는 다음을 호출합니다:
var result = await CloudCodeService.Instance.CallModuleEndpointAsync<TResult>(
"ModuleName", "FunctionName", args);
프로덕션에서는 JavaScript 스크립트보다 C# 모듈을 선호하세요. 모듈은 구독을 통한 실시간 푸시 메시지, 이벤트 기반 트리거, 멀티플레이어 세션 범위 지정도 지원합니다.
- 전체 참조: references/cloud-code.md
Cloud Save
패키지: com.unity.services.cloudsave (>= 3.4.0)
세 가지 액세스 클래스와 게임 전체 Custom 데이터를 포함한 플레이어별 키-값 저장소:
| 액세스 클래스 | 읽기 | 쓰기 | 사용 사례 |
|---|---|---|---|
| Default | 소유자 | 소유자 | 비공개 설정, 환경설정 |
| Public | 모든 사용자 | 소유자 | 공개 프로필, 표시 이름 |
| Protected | 소유자 | 서버 전용(Cloud Code) | 안티 치트 데이터, 서버 부여 상태 |
| Custom | 모든 플레이어 | 서버 전용 | 공유 게임 상태, 전역 구성 |
값은 JSON으로 직렬화됩니다. SaveItem을 통한 쓰기 잠금 동시성 제어, QueryAsync를 통한 서버 측 쿼리, 바이너리 파일 저장을 지원합니다.
- 전체 참조: references/cloud-save.md
- 빌딩 블록: Achievements에서 사용