Ideas y funciones para tu juego

Tu próxima función

Buzón del jugador

Notificaciones individuales y anuncios del proyecto, con recompensas protegidas y una sola consulta social.

SDK: developRequiere una sesión de jugador
Unity
Ilustración de Buzón del jugador
El resultado visible

Tu juego muestra mensajes y anuncios, los marca como leídos y recoge cada recompensa protegida como máximo una vez.

Vídeo próximamente

Este paso aún no tiene vídeo. La guía y la solicitud MCP ya se pueden utilizar.

Buzón del jugador

Preparar el mismo proyecto

  1. Selecciona en el panel el mismo proyecto que en la configuración de tu juego.

    Buzón del jugador →
  2. La primera petición no necesita otra definición. Un resultado vacío es válido mientras no existan datos del juego.

    Registrad al jugador antes de publicar una difusión de texto en este proyecto. Leed el buzón con ese mismo jugador.

    El anuncio llega a jugadores actualmente activos registrados en el proyecto antes o durante su publicación. Los antes inactivos pueden ser elegibles tras reactivarse. Se excluyen registros posteriores.

Implementa esta función

Puedes consultar la guía. Para ejecutarla necesitas una clave de proyecto activa. Preparar el proyecto

SDK instalado, configuración del proyecto importada y jugador conectado.

Este ejemplo del SDK usa develop. Comprueba si las API necesarias están disponibles en el SDK instalado.

Completad la conexión de inicio rápido con el jugador elegido. Llamad a RunReviewedAction() mediante un botón o acción de escena explícita. Abrir el archivo no envía peticiones.

C#
Assets/Scripts/InboxDemo.cs
Llamada a 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 sesión autenticada del jugador actual. Repite una recogida
9// incierta con el mismo identificador de entrada. Sustituye el estado por
10// el del servidor; no apliques dos veces una recompensa.
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}
Abrir el ejemplo completo del SDK ↗

Prueba tu nueva función.

Tu juego muestra mensajes y anuncios, los marca como leídos y recoge cada recompensa protegida como máximo una vez.

Selecciona en el panel el mismo proyecto que en la configuración de tu juego.

Endpoints de la API
  • GET/inbox
  • POST/inbox/read
  • POST/inbox/claim
  • POST/inbox/remove
Todos los endpoints en la referencia de la API
Nuestra sugerencia para el siguiente paso

Dale una puntuación máxima a cada partida.

Guarda la puntuación después de una partida y muestra quién va primero. Sigue usando tu conexión y la sesión del jugador.