Ideias e funcionalidades do jogo

A tua próxima funcionalidade

Caixa do jogador

Notificações individuais e anúncios do projeto, com recompensas protegidas e uma única consulta social.

SDK: developRequer uma sessão de jogador
Unity
Ilustração de Caixa do jogador
O resultado visível

O jogo mostra mensagens e anúncios, marca como lidos e resgata cada recompensa protegida no máximo uma vez.

Vídeo em breve

Este passo ainda não tem vídeo. O guia e o pedido MCP já podem ser usados.

Caixa do jogador

Preparar o mesmo projeto

  1. Seleciona no painel o mesmo projeto que na configuração do teu jogo.

    Caixa do jogador →
  2. O primeiro pedido não exige outra definição. Um resultado vazio é válido enquanto faltarem dados do jogo.

    Registem o jogador antes de publicarem uma mensagem de texto coletiva neste projeto. Leiam a caixa de entrada com o mesmo jogador.

    O anúncio alcança jogadores atualmente ativos registrados no projeto até a publicação. Jogadores antes inativos podem se tornar elegíveis após reativação. Cadastros posteriores ficam excluídos.

Integra esta funcionalidade

Podes consultar o guia. Para o executar, precisas de uma chave de projeto ativa. Preparar o projeto

SDK instalado, configuração do projeto importada e jogador com sessão iniciada.

Este exemplo do SDK usa develop. Verifica se as API necessárias existem no SDK instalado.

Concluam a ligação do início rápido com o jogador escolhido. Chamem RunReviewedAction() através de um botão ou ação explícita da cena. Abrir o ficheiro não envia pedidos.

C#
Assets/Scripts/InboxDemo.cs
Chamada ao 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// Use a sessão autenticada do jogador atual. Repita um resgate incerto com
9// o mesmo ID de entrada. Substitua o estado pelo do servidor; nunca aplique
10// uma recompensa duas vezes.
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 o exemplo SDK completo ↗

Testa a tua nova funcionalidade.

O jogo mostra mensagens e anúncios, marca como lidos e resgata cada recompensa protegida no máximo uma vez.

Seleciona no painel o mesmo projeto que na configuração do teu jogo.

Endpoints da API
  • GET/inbox
  • POST/inbox/read
  • POST/inbox/claim
  • POST/inbox/remove
Todos os endpoints na referência da API
A nossa sugestão para o próximo passo

Dá uma pontuação máxima a cada partida.

Guarda a pontuação depois de uma partida e mostra quem está à frente. Continua a usar a ligação e a sessão do jogador.