使用 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 客戶端 |
初始化模式
每個 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 | 玩家登入(匿名、社交、Unity、使用者名稱/密碼)、身分識別 | AuthenticationService.Instance |
| Services APIs | 所有 UGS 服務的已產生 REST 客戶端;透過服務帳戶進行管理 API 存取 | 直接 API 類別 |
玩家資料與設定
| 套件 | 用途 | 單例 / 進入點 |
|---|---|---|
| Cloud Save | 每個玩家的鍵值資料(預設、公開、受保護)及遊戲範圍的自訂資料 | CloudSaveService.Instance.Data.Player / .Data.Custom |
| Remote Config | 伺服器端遊戲設定、功能開關、JSON 定義 | RemoteConfigService.Instance |
| Economy | 虛擬貨幣、庫存物品、購買、商店 | EconomyService.Instance |
伺服器邏輯與安全性
| 套件 | 用途 | 單例 / 進入點 |
|---|---|---|
| Cloud Code | 服務器授權 C# 模組,用於可信寫入和驗證 | CloudCodeService.Instance → CallModuleEndpointAsync |
| Tooling | 編寫和部署存取控制 (.ac) 和遊戲覆蓋 (.ugo) 檔案 | 僅限編輯器(部署視窗) |
| Deployment | 從 Unity Editor 部署雲端資源 (.rc、.ac、.ccmr、.lb 等) | 僅限編輯器(服務 > 部署) |
社交與競技
| 套件 | 用途 | 單例 / 進入點 |
|---|---|---|
| Multiplayer | 階段、配對、大廳。建置區塊:多人遊戲階段、配對階段、伺服器階段 | MultiplayerService.Instance |
| Leaderboards | 分數提交、排名、層級、版本歷史。建置區塊:排行榜 | LeaderboardsService.Instance |
遙測
| 套件 | 用途 | 單例 / 進入點 |
|---|---|---|
| Analytics | 自訂事件、標準事件、同意管理 | AnalyticsService.Instance |
架構 — 套件如何組合
UnityServices.InitializeAsync()
│
▼
AuthenticationService
(登入 → PlayerId)
│
┌───────────────┼───────────────┐
▼ ▼ ▼
Remote Config Cloud Save Economy
(遊戲設定、 (玩家狀態、 (貨幣、
定義、 進度、 庫存、
功能開關) 偏好設定) 購買)
│ │ │
└───────┬───────┘ │
▼ │
Cloud Code │
(伺服器授權 │
寫入、驗證、 ◄─────────┘
反作弊邏輯)
│
┌───────┼───────┐
▼ ▼ ▼
Cloud Save Economy Leaderboards
(受保護 (伺服器 (分數
寫入) 授予) 提交)
關鍵原則: 對於任何影響遊戲完整性(經驗值、獎勵、貨幣)的資料,請透過 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
- 建置區塊: 玩家帳號 — 即用型登入 UI 和身分識別管理
Cloud Code
套件: com.unity.services.cloudcode (>= 2.10.3)
執行伺服器端 C# 模組 (.NET 9) 以進行可信操作。模組以 .ccmr 檔案部署。客戶端呼叫:
var result = await CloudCodeService.Instance.CallModuleEndpointAsync<TResult>(
"ModuleName", "FunctionName", args);
在生產環境中,建議優先使用 C# 模組而非 JavaScript 指令碼。模組也支援透過訂閱傳送即時推送訊息、事件驅動觸發器和多人遊戲階段範圍。
- 完整參考: references/cloud-code.md
Cloud Save
套件: com.unity.services.cloudsave (>= 3.4.0)
每個玩家的鍵值儲存,具有三種存取類別,以及遊戲範圍的自訂資料:
| 存取類別 | 讀取 | 寫入 | 使用案例 |
|---|---|---|---|
| 預設 | 擁有者 | 擁有者 | 私人設定、偏好設定 |
| 公開 | 任何人 | 擁有者 | 公開個人檔案、顯示名稱 |
| 受保護 | 擁有者 | 僅限伺服器 (Cloud Code) | 反作弊資料、伺服器授予的狀態 |
| 自訂 | 任何玩家 | 僅限伺服器 | 共享遊戲狀態、全域設定 |
值序列化為 JSON。支援透過 SaveItem 的寫入鎖定並發控制、透過 QueryAsync 的伺服器端查詢,以及二進位檔案儲存。
- 完整參考: references/cloud-save.md
- 建置區塊: 由成就(使用 Cloud Save 的受保護資料)和玩家進度(使用 Cloud Save 的預設資料)使用。
Remote Config
套件: com.unity.remote-config (>= 4.2.5)
從伺服器端調整遊戲行為,無需更新應用程式。支援:
- 設定值 — 鍵值配對(整數、浮點數、字串、布林值)
- JSON 定義 — 結構化資料區塊
- 功能開關 — 布林值開關,用於逐步推出或區域鎖定
- 遊戲覆蓋 — 針對特定玩家(透過工具套件)的臨時覆蓋
RemoteConfigService.Instance.FetchConfigs(new UserAttributes(), new AppAttributes());
float difficultyMultiplier = RemoteConfigService.Instance.GetFloat("difficulty", 1.0f);
bool isSeasonPassActive = RemoteConfigService.Instance.GetBool("season_pass_enabled", false);
- 完整參考: references/remote-config.md
- 建置區塊: 功能開關與 A/B 測試
Economy
套件: com.unity.services.economy (>= 3.4.0)
管理虛擬經濟。支援貨幣(軟性、硬性、高級)、庫存物品(消耗品、耐久品、捆綁包)、商店(每日/每週商品)和購買驗證。所有貨幣和庫存授予必須由 Cloud Code 處理:
// 客戶端(僅用於顯示)
var balances = await EconomyService.Instance.GetBalancesAsync();
// 伺服器(透過 Cloud Code 授予/花費)
// modules/economy/GrantCurrency.ccmr
- 完整參考: references/economy.md
- 建置區塊: 虛擬經濟(貨幣、庫存、商店)
Multiplayer
套件: com.unity.services.multiplayer (>= 1.2.0)
提供階段、配對、大廳和即時訊息傳遞。三個關鍵建置區塊:
- 多人遊戲階段 — 玩家可以自由加入/離開的持久階段
- 配對階段 — 具有技能/區域/佇列預設條件的自動配對階段
- 伺服器階段 — 由專用伺服器託管的階段
var session = await MultiplayerService.Instance.CreateSessionAsync(
new CreateSessionOptions { MaxPlayers = 10 });
await session.JoinAsync();
- 完整參考: references/multiplayer.md
- 建置區塊: 多人遊戲階段、配對階段、伺服器階段
Leaderboards
套件: com.unity.services.leaderboards (>= 1.1.0)
分數提交、基於百分比的排名、分層排行榜、版本歷史和時間範圍。
var entry = await LeaderboardsService.Instance.AddPlayerScoreAsync(
"global_leaderboard", 1500);
var scores = await LeaderboardsService.Instance.GetScoresAsync(
"global_leaderboard");
- 完整參考: references/leaderboards.md
- 建置區塊: 排行榜
Analytics
套件: com.unity.services.analytics (>= 5.1.0)
自訂事件、標準事件和同意管理。用於追蹤玩家行為、留存和營利指標。所有事件在佇列中分批處理,並在背景發送以最小化效能影響。
- 完整參考: references/analytics.md
資產儲存庫建置區塊
這些是可從 Unity Asset Store 下載的即用型功能包,與 UGS 整合。每個建置區塊都包含 UI、指令碼和遊戲設計師設定。
| 建置區塊 | 描述 | 使用哪些服務 |
|---|---|---|
| 玩家帳號 | 登入 UI、身分管理、玩家資料 | 驗證、Cloud Save(公開資料) |
| 玩家進度 | 關卡、經驗值、等級、解鎖 | Cloud Save(預設資料)、Cloud Code(升級驗證) |
| 成就 | 成就追蹤、掉落獎勵、UI | Cloud Save(受保護資料)、Cloud Code |
| 虛擬經濟 | 貨幣、庫存、商店 UI | Economy、Cloud Code(授予/花費) |
| 功能開關與 A/B 測試 | 可設定的功能開關、遠端變體 | Remote Config、Tooling(遊戲覆蓋) |
| 排行榜 | 排行榜 UI、分數提交、層級 | Leaderboards、Cloud Code(分數驗證) |
| 多人遊戲階段 | 階段列表、建立/加入 UI | Multiplayer(階段) |
| 配對階段 | 配對佇列 UI、自動階段建立 | Multiplayer(配對) |
| 伺服器階段 | 專用伺服器、遊戲狀態、生命週期 | Multiplayer、Cloud Code |
現成功能藍圖
功能藍圖是完整功能的實作模式,顯示多個套件如何協同工作。
每日獎勵
玩家 A 登入
→ 檢查上次領取時間(Cloud Save:預設,"last_claim_date")
→ 如果不同日期:呼叫 Cloud Code
→ Cloud Code 驗證日期
→ Economy 授予貨幣
→ Cloud Save 寫入"last_claim_date"(受保護)
→ 顯示 UI
季票 / 戰鬥通行證
Remote Config 定義通行證獎勵和經驗值門檻
Cloud Save 追蹤玩家的經驗值、等級和已領取獎勵
Cloud Code 驗證等級進度和獎勵領取
Economy 授予付費通行證解鎖後的溢價獎勵線
反作弊驗證管道
玩家完成回合
→ 客戶端發送:分數、遊戲時間戳、輸入哈希
→ Cloud Code 接收
→ 驗證哈希與伺服器模擬
→ 檢查時間戳合理性(防止時間操縱)
→ 將分數寫入 Leaderboards(受保護 Cloud Save 支援)
常見架構模式
僅客戶端模式(原型/單人遊戲階段)
遊戲 → Cloud Save(玩家資料)
→ Remote Config(設定)
→ Analytics(事件)
適合不需要伺服器驗證的原型或單人遊戲階段。所有寫入都是客戶端發起的。
伺服器授權模式(競爭性/排行榜/經濟)
遊戲 → Cloud Code(所有寫入) → Cloud Save(受保護資料)
→ Remote Config(設定) Economy(授予)
→ Analytics(事件) Leaderboards(分數)
對於任何具有競爭性或貨幣價值的資料都是必需的。Cloud Code 模組是任何寫入操作的唯一授權者。
多人遊戲模式(階段/配對)
遊戲 → Multiplayer(階段管理)
→ Cloud Code(階段內邏輯)
→ Cloud Save(玩家綁定資料)
→ Analytics(階段結束事件)
將 Multiplayer 用於階段生命週期,使用 Cloud Code 進行階段內伺服器邏輯(例如回合驗證、玩家計分)。
驗證
將以下驗證添加到您的遊戲整合測試套件中:
- 初始化驗證:
UnityServices.InitializeAsync()不會拋出ServicesInitializationException - 登入驗證:
SignInAnonymouslyAsync()完成後,AuthenticationService.Instance.PlayerId不為空 - Cloud Save 讀取/寫入循環: 寫入一個鍵,讀取回來,驗證值
- Cloud Code 模組呼叫: 對雲端部署的模組進行端到端測試
- Remote Config 取得:
FetchConfigs完成且GetFloat/GetBool/GetString傳回預期值 - Economy 餘額:
GetBalancesAsync()成功,所有配置的貨幣都已定義 - Leaderboards 分數提交:
AddPlayerScoreAsync成功,GetScoresAsync包含提交的條目 - Multiplayer 階段建立: 使用預期選項建立階段,成功加入
- Analytics 事件: 自訂事件在不拋出異常的情況下排入佇列
部署檢查清單
- 已安裝所有必要的 UGS 套件(請參閱套件地圖)
- 在 Unity 雲端儀表板上設定專案
- 環境(開發/測試/生產)已正確設定
- 所有 Cloud Code 模組已透過部署套件部署(.ccmr 檔案)
- 存取控制已套用至 Cloud Code 模組(僅由玩家呼叫)
- Remote Config 設定已在儀表板上建立並已推送
- Economy 配置(貨幣、物品、商店)已定義
- Leaderboard 配置已建立
- Multiplayer 階段設定已設定
- 測試玩家已在 UGS 儀表板上註冊
- 已執行整合驗證測試(請參閱驗證)
- 部署後:在編輯器外部(獨立建置)測試以確保正確初始化
詳細參考資料
| 主題 | 檔案 |
|---|---|
| Authentication | references/authentication.md |
| Cloud Code | references/cloud-code.md |
| Cloud Save | references/cloud-save.md |
| Remote Config | references/remote-config.md |
| Economy | references/economy.md |
| Multiplayer | references/multiplayer.md |
| Leaderboards | references/leaderboards.md |
| Analytics | references/analytics.md |
| Tooling (Access Control) | references/access-control.md |
| Tooling (Game Overrides) | references/game-overrides.md |
| Deployment | references/deployment.md |