Ide dan fitur game

Fitur berikutnya

Kotak masuk pemain

Notifikasi pribadi dan pengumuman proyek dengan hadiah terlindungi serta satu polling untuk pesan sosial.

SDK: developMemerlukan sesi pemain
Unity
Ilustrasi Kotak masuk pemain
Hasil yang terlihat

Gim menampilkan pesan dan pengumuman, menandainya dibaca dan mengambil setiap hadiah terlindungi paling banyak sekali.

Video akan tersedia

Langkah ini belum memiliki video. Panduan dan permintaan MCP sudah dapat digunakan.

Kotak masuk pemain

Siapkan proyek yang sama

  1. Pilih proyek yang sama di dasbor dan konfigurasi game.

    Kotak masuk pemain →
  2. Permintaan pertama tidak memerlukan definisi tambahan. Hasil kosong tetap sah sebelum ada data permainan yang sesuai.

    Daftarkan pemain uji sebelum menerbitkan siaran teks dalam proyek ini. Baca kotak masuk dengan pemain yang sama.

    Pengumuman diterima pemain proyek yang aktif saat ini dan terdaftar paling lambat saat publikasi. Pemain yang sebelumnya tidak aktif dapat memenuhi syarat setelah diaktifkan kembali. Pendaftar setelah publikasi dikecualikan.

Tambahkan fitur ini

Kamu dapat membaca panduan. Untuk menjalankannya, diperlukan kunci proyek aktif. Siapkan proyek

SDK terpasang, konfigurasi proyek diimpor, dan pemain sudah masuk.

Contoh SDK ini menggunakan develop. Periksa apakah API yang diperlukan tersedia di SDK yang terpasang.

Selesaikan koneksi mulai cepat dengan pemain yang dipilih. Panggil RunReviewedAction() dari tombol atau tindakan adegan yang eksplisit. Membuka berkas saja tidak mengirim permintaan.

C#
Assets/Scripts/InboxDemo.cs
Panggilan 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// Gunakan sesi terautentikasi pemain saat ini. Ulangi pengambilan yang
9// belum pasti dengan ID pesan yang sama. Ganti status nilai dari server;
10// jangan menambahkan hadiah dua kali.
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}
Buka contoh SDK lengkap ↗

Uji fitur barumu.

Gim menampilkan pesan dan pengumuman, menandainya dibaca dan mengambil setiap hadiah terlindungi paling banyak sekali.

Pilih proyek yang sama di dasbor dan konfigurasi game.

Titik akhir
  • GET/inbox
  • POST/inbox/read
  • POST/inbox/claim
  • POST/inbox/remove
Semua titik akhir di referensi API
Saran kami untuk langkah berikutnya

Berikan skor tertinggi untuk setiap ronde.

Simpan skor setelah ronde dan tampilkan siapa yang unggul. Tetap gunakan koneksi dan sesi pemainmu.