Oyun fikirleri ve özellikleri

Sıradaki özelliğin

Oyuncu posta kutusu

Korunan ödüllerle kişisel bildirimler ve proje duyuruları; sosyal iletiler için tek sorgulama.

SDK: developOyuncu oturumu gerekli
Unity
Oyuncu posta kutusu görseli
Görünür sonuç

Oyun kişisel iletileri ve duyuruları gösterir, okundu işaretler ve her korunan ödülü en fazla bir kez alır.

Video yakında

Bu adımın videosu henüz yok. Rehber ve MCP isteği kullanıma hazır.

Oyuncu posta kutusu

Aynı projeyi hazırlayın

  1. Panelde oyun yapılandırmandaki projeyle aynı projeyi seç.

    Oyuncu posta kutusu →
  2. İlk istek için ek tanım gerekmez. Eşleşen oyun verisi yokken boş sonuç geçerlidir.

    Projede düz metin yayını yayımlamadan önce test oyuncusunu kaydedin. Gelen kutusunu aynı oyuncuyla okuyun.

    Duyuru, en geç yayın sırasında kaydolmuş ve şu anda etkin proje oyuncularına ulaşır. Önceden etkin olmayanlar yeniden etkinleşince hak kazanabilir. Daha sonra kaydolanlar kapsam dışıdır.

Bu özelliği ekle

Kılavuzu inceleyebilirsin. Çalıştırmak için etkin bir proje anahtarı gerekir. Projeyi hazırla

SDK kurulu, proje yapılandırması içe aktarılmış ve oyuncu oturum açmış olmalı.

Bu SDK örneği develop kullanır. Gerekli API'lerin kurulu SDK sürümünde bulunduğunu kontrol et.

Hızlı başlangıç bağlantısını ilgili oyuncuyla tamamlayın. RunReviewedAction() çağrısını açık bir düğme veya sahne eyleminden yapın. Dosyayı açmak tek başına istek göndermez.

C#
Assets/Scripts/InboxDemo.cs
horizOn çağrısı
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// Geçerli oyuncunun doğrulanmış oturumunu kullanın. Belirsiz almayı aynı
9// girdi kimliğiyle yineleyin. Değerleri sunucu durumuyla değiştirin; ödülü
10// iki kez eklemeyin.
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}
Tam SDK örneğini aç ↗

Yeni özelliğini test et.

Oyun kişisel iletileri ve duyuruları gösterir, okundu işaretler ve her korunan ödülü en fazla bir kez alır.

Panelde oyun yapılandırmandaki projeyle aynı projeyi seç.

Uç noktalar
  • GET/inbox
  • POST/inbox/read
  • POST/inbox/claim
  • POST/inbox/remove
API referansındaki tüm uç noktalar
Sıradaki adım için önerimiz

Her tura bir yüksek puan ekle.

Turdan sonra puanı kaydet ve kimin önde olduğunu göster. Bağlantını ve oyuncu oturumunu kullanmaya devam et.