用 Unity 游戏服务构建在线游戏
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 编辑器部署云资源(.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 模块进行写入。直接客户端写入仅适用于非敏感数据(偏好、显示设置)。
核心服务——快速参考
身份验证
包: 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
- 构建块: 玩家账户 —— 现成的登录界面和身份管理
云代码
包: 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
云存档
包: com.unity.services.cloudsave (>= 3.4.0)
每位玩家的键值存储,具有三种访问类别,以及游戏范围内的自定义数据:
| 访问类别 | 读取 | 写入 | 用例 |
|---|---|---|---|
| 默认 | 所有者 | 所有者 | 私人设置、偏好 |
| 公开 | 任何人 | 所有者 | 公开资料、显示名称 |
| 受保护 | 所有者 | 仅服务器(云代码) | 反作弊数据、服务器授予的状态 |
| 自定义 | 任何玩家 | 仅服务器 | 共享游戏状态、全局配置 |
值以 JSON 序列化。支持通过 SaveItem 进行写锁定并发控制、通过 QueryAsync 进行服务器端查询,以及二进制文件存储。
- 完整参考: references/cloud-save.md
- 构建块: 被成就使用(