Boîte des joueurs

Boîte des joueurs

Envoyez des notifications et des messages personnels limités.

Démarrer gratuitement

Boîte des joueurs

Envoyez des notifications et des messages personnels limités.

SDK et REST

Intégrez Unity, Godot ou Unreal, ou utilisez l’interface REST.

Tableau de bord du projet

Configurez chaque fonction et gérez ses données actuelles dans votre projet.

Intégration rapide

Intégration rapide

Boîte des joueurs
Vidéo bientôt disponible

Préparez une annonce, prévisualisez les récompenses protégées et consultez une boîte joueur sans déclencher d’action joueur.

Intégration rapide
Unity (C#)
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.

Ces exemples utilisent le SDK Unity (C#) et l'API REST. Godot et Unreal ont les mêmes appels dans leurs propres SDK : voir le démarrage rapide

Questions fréquentes

Questions fréquentes

Prêt à intégrer ?

Commencez à construire avec horizOn dès aujourd'hui. Tier gratuit inclus.