Idées et fonctionnalités de jeu

Votre prochaine fonctionnalité

Boîte des joueurs

Notifications individuelles et annonces du projet, avec récompenses protégées et une seule interrogation pour les échanges sociaux.

SDK : developSession de joueur requise
Unity
Illustration de Boîte des joueurs
Votre résultat visible

Le jeu affiche messages et annonces, les marque comme lus et récupère chaque récompense protégée au plus une fois.

Vidéo à venir

Cette étape n’a pas encore de vidéo. Le guide et la demande MCP sont utilisables.

Boîte des joueurs

Préparer le même projet

  1. Sélectionnez dans le tableau de bord le même projet que dans la configuration de votre jeu.

    Boîte des joueurs →
  2. Aucune définition supplémentaire pour la première requête. Un résultat vide est valide tant que les données du jeu manquent.

    Inscrivez le joueur de test avant de publier une diffusion en texte brut dans ce projet. Lisez la boîte avec ce même joueur.

    L’annonce vise les joueurs actuellement actifs, inscrits au plus tard lors de sa publication. Un joueur inactif peut devenir éligible après réactivation. Les inscriptions ultérieures sont exclues.

Intégrer cette fonctionnalité

Vous pouvez consulter le guide. Son exécution nécessite une clé de projet active. Préparer le projet

SDK installé, configuration du projet importée et joueur connecté.

Cet exemple du SDK utilise develop. Vérifiez que les API nécessaires existent dans votre SDK installé.

Terminez la connexion du démarrage rapide avec le joueur choisi. Appelez RunReviewedAction() via un bouton ou une action de scène explicite. Ouvrir le fichier seul n’envoie aucune requête.

C#
Assets/Scripts/InboxDemo.cs
Appel horizOn
1using PM.horizOn.Cloud.Objects.Network.Responses;
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// Utilisez la session authentifiée du joueur actuel. Réessayez un retrait
9// incertain avec le même identifiant de message. Remplacez l’état des
10// valeurs par celui du serveur ; n’appliquez jamais deux fois une
11// récompense.
12public sealed class InboxDemo : MonoBehaviour
13{
14 public async void RunReviewedAction()
15 {
16 var sessionUser = UserManager.Instance.CurrentUser;
17 if (sessionUser == null || !sessionUser.IsValid()) return;
18 var userId = UserManager.Instance.CurrentUser.UserId;
19 var manager = InboxManager.Instance;
20 var loaded = await manager.GetInbox(userId, since: null);
21 if (!loaded.IsSuccess) { Debug.LogWarning(loaded.ErrorCode); return; }
22 foreach (var entry in loaded.Data.entries) Debug.Log(entry.textKey);
23 // The manager retains full cached entries when the wire response is unchanged.
24 // Poll again only after loaded.Data.pollAfterSeconds, and stop with the game lifecycle.
25​
26 bool claimInFlight = false;
27 async System.Threading.Tasks.Task ClaimSelectedReward(string entryId)
28 {
29 if (claimInFlight) return;
30 const string projectId = "YOUR_PROJECT_ID";
31 string pendingKey = "horizOn_inbox_claim_" + projectId + "_" + userId;
32 string pending = PlayerPrefs.GetString(pendingKey, "");
33 if (pending.Length > 0 && pending != entryId) return; // Resolve the original claim first.
34 if (pending.Length == 0)
35 {
36 var current = manager.CurrentInbox; // Authorized for the current project/session.
37 if (current == null || current.userId != userId) return;
38 var selected = System.Array.Find(current.entries, entry => entry.id == entryId);
39 if (selected == null || selected.claimed || selected.attachment?.values == null ||
40 selected.attachment.values.Length == 0) return;
41 }
42 // Previously saved IDs remain replayable even after their visible state changes.
43 PlayerPrefs.SetString(pendingKey, entryId);
44 PlayerPrefs.Save();
45 if (PlayerPrefs.GetString(pendingKey) != entryId) return;
46 claimInFlight = true;
47 try
48 {
49 var claimed = await manager.Claim(userId, entryId);
50 if (!claimed.IsSuccess) { Debug.LogWarning(claimed.ErrorCode); return; }
51 // Display claimed.Data.inbox and replace values with claimed.Data.playerValues.
52 // The SDK refreshes its cache. Never add reward deltas yourself.
53 if (PlayerPrefs.GetString(pendingKey, "") == entryId)
54 {
55 PlayerPrefs.DeleteKey(pendingKey);
56 PlayerPrefs.Save();
57 }
58 }
59 finally { claimInFlight = false; }
60 }
61 // Invoke ClaimSelectedReward only from an explicit player action.
62 // Retry the saved entryId after a lost response; no replacement grant or new action ID.
63 // Other deliberate actions: await manager.MarkRead(userId, entryId);
64 // await manager.Remove(userId, entryId); // Protects unclaimed rewards.
65 }
66}
Ouvrir l’exemple SDK complet ↗

Testez votre nouvelle fonctionnalité.

Le jeu affiche messages et annonces, les marque comme lus et récupère chaque récompense protégée au plus une fois.

Sélectionnez dans le tableau de bord le même projet que dans la configuration de votre jeu.

Points de terminaison
  • GET/inbox
  • POST/inbox/read
  • POST/inbox/claim
  • POST/inbox/remove
Tous les points de terminaison dans la référence API
Notre suggestion pour la suite

Donnez un meilleur score à chaque partie.

Enregistrez le score après une partie et montrez qui est en tête. Continuez avec votre connexion et la session du joueur.