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}