你的下一项功能
玩家统计
按会话批量上报回合数、击败数和最佳成绩,支持求和、最大值、最小值或最新值规则。
Unity

可见的结果
游戏在一个批次中上报完整会话,并显示当前计数器和周期。
此步骤尚无视频。指南和MCP请求已可使用。
玩家统计
准备同一个项目
在仪表盘中选择与游戏配置相同的项目。
玩家统计 →在控制台表单中创建或复用这些测试条目。这些是示例值,并非项目当前数据。
- 统计定义
kills: mode=sum, reset=none; best_score: mode=max, reset=none
求和会累加每次上报。最大值和最小值保留极值;最新值直接替换。最大值、最小值和最新值均由首次上报初始化。数值必须是安全范围内的有符号整数。
运行示例前先保存、重新加载并核对条目。保留其他定义。
实现此功能
你可以预览指南。运行需要有效的项目密钥。 准备项目
已安装 SDK、导入项目配置,且玩家已登录。
此 SDK 示例使用 develop。请检查已安装的 SDK 是否具备所需 API。
先通过快速入门连接目标玩家,再通过明确的按钮或场景操作调用RunReviewedAction()。仅打开文件不会发送请求。
C#
1using PM.horizOn.Cloud.Objects.Network.Requests;
2using UnityEngine;
3using PM.horizOn.Cloud.Core;
4using PM.horizOn.Cloud.Manager;
5
6// Existing SDK/project configuration and authenticated player session required.
7// Call RunReviewedAction explicitly after reviewing this example and its data.
8// 先读取快照,重试时保留同一操作ID和原始批次。操作过期或结果不明时必须先核对,不能自动换用新ID上报。
9// This explicit action reports the shown persisted batch.
10public sealed class StatisticsDemo : MonoBehaviour
11{
12 public async void RunReviewedAction()
13 {
14 var sessionUser = UserManager.Instance.CurrentUser;
15 if (sessionUser == null || !sessionUser.IsValid()) return;
16 var manager = StatisticsManager.Instance;
17 var snapshot = await manager.GetStatistics();
18 if (snapshot == null) { Debug.LogWarning(manager.LastErrorCode); return; }
19 string pendingKey = "horizOn_statistics_pending_" + snapshot.userId;
20 var pending = PlayerPrefs.HasKey(pendingKey)
21 ? JsonUtility.FromJson<UpdateStatisticsRequest>(PlayerPrefs.GetString(pendingKey))
22 : new UpdateStatisticsRequest {
23 userId = snapshot.userId, operationId = manager.CreateOperationId(),
24 updates = new[] { new StatisticUpdate("kills", 3), new StatisticUpdate("best_score", 250) }
25 };
26 string originalJson = JsonUtility.ToJson(pending);
27 PlayerPrefs.SetString(pendingKey, originalJson);
28 PlayerPrefs.Save();
29 var result = await manager.UpdateStatistics(pending.updates, pending.operationId);
30 if (result == null) {
31 // Keep the saved ID and batch. Reconcile OPERATION_EXPIRED before a new logical report.
32 Debug.LogWarning(manager.LastErrorCode);
33 return;
34 }
35 // A late success for O1 must never acknowledge a newer pending O2.
36 if (PlayerPrefs.GetString(pendingKey, null) == originalJson) {
37 PlayerPrefs.DeleteKey(pendingKey);
38 PlayerPrefs.Save();
39 }
40 foreach (var counter in result.values) Debug.Log(counter.key + "=" + counter.value);
41 }
42}
测试你的新功能。
游戏在一个批次中上报完整会话,并显示当前计数器和周期。
在仪表盘中选择与游戏配置相同的项目。


