
Posta del giocatore
Invia notifiche e messaggi personali limitati.
SDK e REST
Integra Unity, Godot o Unreal oppure usa l’interfaccia REST.
Dashboard del progetto
Configura ogni funzionalità e gestisci i dati attuali nel tuo progetto.
Integrazione rapida
Posta del giocatore
Video in arrivo
Crea un annuncio, controlla le ricompense protette e consulta la posta senza eseguire azioni del giocatore.
using UnityEngine;
using PM.horizOn.Cloud.Manager;
using PM.horizOn.Cloud.Objects.Network.Responses;
var userId = UserManager.Instance.CurrentUser.UserId;
var manager = InboxManager.Instance;
var loaded = await manager.GetInbox(userId, since: null);
if (!loaded.IsSuccess) { Debug.LogWarning(loaded.ErrorCode); return; }
foreach (var entry in loaded.Data.entries) Debug.Log(entry.textKey);
// The manager retains full cached entries when the wire response is unchanged.
// Poll again only after loaded.Data.pollAfterSeconds, and stop with the game lifecycle.
bool claimInFlight = false;
async System.Threading.Tasks.Task ClaimSelectedReward(string entryId)
{
if (claimInFlight) return;
const string projectId = "YOUR_PROJECT_ID";
string pendingKey = "horizOn_inbox_claim_" + projectId + "_" + userId;
string pending = PlayerPrefs.GetString(pendingKey, "");
if (pending.Length > 0 && pending != entryId) return; // Resolve the original claim first.
if (pending.Length == 0)
{
var current = manager.CurrentInbox; // Authorized for the current project/session.
if (current == null || current.userId != userId) return;
var selected = System.Array.Find(current.entries, entry => entry.id == entryId);
if (selected == null || selected.claimed || selected.attachment?.values == null ||
selected.attachment.values.Length == 0) return;
}
// Previously saved IDs remain replayable even after their visible state changes.
PlayerPrefs.SetString(pendingKey, entryId);
PlayerPrefs.Save();
if (PlayerPrefs.GetString(pendingKey) != entryId) return;
claimInFlight = true;
try
{
var claimed = await manager.Claim(userId, entryId);
if (!claimed.IsSuccess) { Debug.LogWarning(claimed.ErrorCode); return; }
// Display claimed.Data.inbox and replace values with claimed.Data.playerValues.
// The SDK refreshes its cache. Never add reward deltas yourself.
if (PlayerPrefs.GetString(pendingKey, "") == entryId)
{
PlayerPrefs.DeleteKey(pendingKey);
PlayerPrefs.Save();
}
}
finally { claimInFlight = false; }
}
// Invoke ClaimSelectedReward only from an explicit player action.
// Retry the saved entryId after a lost response; no replacement grant or new action ID.
// Other deliberate actions: await manager.MarkRead(userId, entryId);
// await manager.Remove(userId, entryId); // Protects unclaimed rewards.Questi esempi usano l'SDK per Unity (C#) e la REST API. Godot e Unreal hanno le stesse chiamate nei loro SDK: vedi la quickstart
Domande frequenti
Pronto per l'integrazione?
Inizi a costruire con horizOn oggi stesso. Tier gratuito incluso.
