Idee e funzionalità per il gioco

La tua prossima funzionalità

Posta del giocatore

Notifiche personali e annunci del progetto, con ricompense protette e un’unica richiesta per i messaggi sociali.

SDK: developSessione del giocatore richiesta
Unity
Illustrazione di Posta del giocatore
Il risultato visibile

Il gioco mostra messaggi e annunci, li segna come letti e ritira ogni ricompensa protetta al massimo una volta.

Video in arrivo

Questo passaggio non ha ancora un video. La guida e la richiesta MCP sono già utilizzabili.

Posta del giocatore

Preparare lo stesso progetto

  1. Seleziona nella dashboard lo stesso progetto presente nella configurazione del gioco.

    Posta del giocatore →
  2. La prima richiesta non richiede altre definizioni. Un risultato vuoto è valido finché mancano i dati del gioco.

    Registrate il giocatore prima di pubblicare un messaggio collettivo di testo nel progetto. Leggete la posta con lo stesso giocatore.

    L’annuncio raggiunge i giocatori attualmente attivi, registrati nel progetto entro la pubblicazione. Chi era inattivo può diventare idoneo dopo la riattivazione. Le registrazioni successive sono escluse.

Integra questa funzionalità

Puoi consultare la guida. Per eseguirla serve una chiave di progetto attiva. Prepara il progetto

SDK installato, configurazione del progetto importata e giocatore connesso.

Questo esempio del SDK usa develop. Verifica che le API necessarie siano disponibili nel SDK installato.

Completate la connessione rapida con il giocatore scelto. Chiamate RunReviewedAction() tramite un pulsante o un’azione esplicita della scena. Aprire il file non invia richieste.

C#
Assets/Scripts/InboxDemo.cs
Chiamata 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// Usa la sessione autenticata del giocatore attuale. Ripeti un ritiro
9// incerto con lo stesso ID del messaggio. Sostituisci lo stato con quello
10// del server; non applicare due volte una ricompensa.
11public sealed class InboxDemo : MonoBehaviour
12{
13 public async void RunReviewedAction()
14 {
15 var sessionUser = UserManager.Instance.CurrentUser;
16 if (sessionUser == null || !sessionUser.IsValid()) return;
17 var userId = UserManager.Instance.CurrentUser.UserId;
18 var manager = InboxManager.Instance;
19 var loaded = await manager.GetInbox(userId, since: null);
20 if (!loaded.IsSuccess) { Debug.LogWarning(loaded.ErrorCode); return; }
21 foreach (var entry in loaded.Data.entries) Debug.Log(entry.textKey);
22 // The manager retains full cached entries when the wire response is unchanged.
23 // Poll again only after loaded.Data.pollAfterSeconds, and stop with the game lifecycle.
24​
25 bool claimInFlight = false;
26 async System.Threading.Tasks.Task ClaimSelectedReward(string entryId)
27 {
28 if (claimInFlight) return;
29 const string projectId = "YOUR_PROJECT_ID";
30 string pendingKey = "horizOn_inbox_claim_" + projectId + "_" + userId;
31 string pending = PlayerPrefs.GetString(pendingKey, "");
32 if (pending.Length > 0 && pending != entryId) return; // Resolve the original claim first.
33 if (pending.Length == 0)
34 {
35 var current = manager.CurrentInbox; // Authorized for the current project/session.
36 if (current == null || current.userId != userId) return;
37 var selected = System.Array.Find(current.entries, entry => entry.id == entryId);
38 if (selected == null || selected.claimed || selected.attachment?.values == null ||
39 selected.attachment.values.Length == 0) return;
40 }
41 // Previously saved IDs remain replayable even after their visible state changes.
42 PlayerPrefs.SetString(pendingKey, entryId);
43 PlayerPrefs.Save();
44 if (PlayerPrefs.GetString(pendingKey) != entryId) return;
45 claimInFlight = true;
46 try
47 {
48 var claimed = await manager.Claim(userId, entryId);
49 if (!claimed.IsSuccess) { Debug.LogWarning(claimed.ErrorCode); return; }
50 // Display claimed.Data.inbox and replace values with claimed.Data.playerValues.
51 // The SDK refreshes its cache. Never add reward deltas yourself.
52 if (PlayerPrefs.GetString(pendingKey, "") == entryId)
53 {
54 PlayerPrefs.DeleteKey(pendingKey);
55 PlayerPrefs.Save();
56 }
57 }
58 finally { claimInFlight = false; }
59 }
60 // Invoke ClaimSelectedReward only from an explicit player action.
61 // Retry the saved entryId after a lost response; no replacement grant or new action ID.
62 // Other deliberate actions: await manager.MarkRead(userId, entryId);
63 // await manager.Remove(userId, entryId); // Protects unclaimed rewards.
64 }
65}
Aprire l’esempio SDK completo ↗

Prova la tua nuova funzionalità.

Il gioco mostra messaggi e annunci, li segna come letti e ritira ogni ricompensa protetta al massimo una volta.

Seleziona nella dashboard lo stesso progetto presente nella configurazione del gioco.

Endpoint dell'API
  • GET/inbox
  • POST/inbox/read
  • POST/inbox/claim
  • POST/inbox/remove
Tutti gli endpoint nel riferimento API
Il nostro suggerimento per il prossimo passo

Dai un record a ogni partita.

Salva il punteggio dopo una partita e mostra chi è in testa. Continua a usare la connessione e la sessione del giocatore.