플레이어 우편함

플레이어 우편함

알림과 개수 제한이 있는 개인 메시지를 전달하세요.

무료로 시작하기

플레이어 우편함

알림과 개수 제한이 있는 개인 메시지를 전달하세요.

SDK 및 REST

Unity, Godot, Unreal과 통합하거나 REST 인터페이스를 사용하세요.

프로젝트 대시보드

프로젝트에서 각 기능을 설정하고 현재 데이터를 관리하세요.

빠른 통합

빠른 통합

플레이어 우편함
동영상 준비 중

프로젝트 공지를 작성하고 보호된 보상을 확인하며 플레이어 동작 없이 우편함을 살펴봅니다.

빠른 통합
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.

이 예시는 Unity SDK(C#)와 REST API를 사용합니다. Godot과 Unreal도 각자의 SDK에서 같은 호출을 제공합니다: 퀵스타트 보기

자주 묻는 질문

자주 묻는 질문

통합할 준비가 되셨나요?

오늘부터 horizOn으로 게임 백엔드를 구축하세요. 무료 플랜 포함.