ゲームのアイデアと機能

次に追加する機能

共有オブジェクト

明示的なアクセスポリシー、インデックス付きクエリ、元のリビジョンを使用して、内容を解釈されないゲームデータを共有します。

SDK:developプレイヤーセッションが必要
Unity
共有オブジェクトのイラスト
確認できる結果

作成前に所有者の使用状況を取得してください。作成にはその使用状況のリビジョンを使用し、更新と削除には元のオブジェクトのリビジョンを使用します。所有者、グループ、作成時に設定された有効期限は変わりません。

動画は後日公開

この手順の動画はまだありません。ガイドとMCPへの依頼は利用できます。

共有オブジェクト

同じプロジェクトを準備する

  1. ゲームの設定と同じプロジェクトをダッシュボードで選択してください。

    共有オブジェクト →
  2. ダッシュボードのフォームで次のテスト項目を作成するか、既存の項目を使います。表示値は例であり、現在のプロジェクトのデータではありません。

    キー
    bases
    読み取りポリシー
    all
    書き込みポリシー
    owner
    グリッド位置
    true
    オブジェクトの最大バイト数
    1024
    所有者あたりの最大オブジェクト数
    1

    キーの予約は解除されません。初回使用後は、ポリシー、検索スキーマ、TTL、位置を変更できません。アーカイブすると新規書き込みがブロックされますが、読み取りと削除は引き続き可能です。

    最初の例はデータの読み取りです。グループ、マッチ、オブジェクトは作成しません。空のリストも正常な初回応答です。

  3. 実行前に保存、再読み込み、確認を行います。他の定義は保持してください。

この機能を実装する

ガイドは閲覧できます。実行には有効なプロジェクトキーが必要です。 プロジェクトを準備する

SDK をインストールし、プロジェクト設定をインポート済みで、プレイヤーがログインしていること。

この SDK サンプルは develop を使用します。必要な API がインストール済みの SDK にあるか確認してください。

クイックスタートで対象プレイヤーを接続します。ボタンやシーンの明示的な操作からReadWorldMap()を呼び出してください。ファイルを開くだけではリクエストは送信されません。

C#
Assets/Scripts/SharedObjectsDemo.cs
horizOn 呼び出し
1using UnityEngine;
2using PM.horizOn.Cloud.Manager;
3using PM.horizOn.Cloud.Objects.Network.Responses;
4​
5public sealed class SharedObjectsDemo : MonoBehaviour
6{
7 // Initialize/connect and restore the existing player in the Quickstart first.
8 // Wire an explicit player action; do not add this read to a startup/poll loop.
9 public async void ReadWorldMap()
10 {
11 var user = UserManager.Instance.CurrentUser;
12 if (user == null || !user.IsValid()) return;
13 var result = await SharedObjectsManager.Instance.QueryObjects(user.UserId, "bases", new SharedQuery {
14 mode = SharedQueryMode.Rectangle,
15 minX = -10, maxX = 10, minY = -10, maxY = 10, limit = 20
16 });
17 if (!result.IsSuccess) {
18 Debug.LogWarning(result.ErrorCode);
19 return;
20 }
21 foreach (var item in result.Data.objects) {
22 byte[] bytes = item.data; // Opaque game bytes; validate your game's own format.
23 Debug.Log($"Object {item.id}: {bytes.Length} bytes");
24 }
25 // Respect result.Data.pollAfterSeconds; no automatic poll or next-page loop.
26 // Keep exact dataBase64 and typed search metadata unchanged on metadata edits.
27 // Persist original target, bytes and If-Match revision before a single mutation.
28 // Unknown CREATE: explicit GetRecoveryUsage/QueryRecoveryObjects; never resend.
29 // Generic/defense/ranked VA starts share one start/submit lease; do not replace a pending run.
30 // Trusted validation and durable ordinary Inbox delivery belong to the game backend.
31 }
32}
完全なSDKサンプルを開く ↗

ワールドマップ

所有者の拠点を、内容を解釈されないバイト列として保存します。設定済みの整数座標グリッドの矩形を明示的にクエリし、元のオブジェクトのリビジョンで更新してください。位置はクエリ用インデックスであり、ゲームルールを検証しません。

非同期PvP

範囲を限定した非一様な整数クエリで対戦相手を選びます。相手の防衛データのバイト列を読み込み、サーバー管理のValidated Actions実行でプレイを検証してください。信頼できるバックエンドだけが結果を決定し、変更不能なInbox通知を送信します。

対応するプレイヤーセッション、永続的に保持した元の書き込み意図、明示的で範囲を限定した読み取りを使用してください。信頼できる結果検証とInboxへの配信はゲームのバックエンドで行います。Account Keysをゲームのビルドに含めてはいけません。

新しい機能をテストしましょう。

作成前に所有者の使用状況を取得してください。作成にはその使用状況のリビジョンを使用し、更新と削除には元のオブジェクトのリビジョンを使用します。所有者、グループ、作成時に設定された有効期限は変わりません。

ゲームの設定と同じプロジェクトをダッシュボードで選択してください。

エンドポイント
  • GET/shared-objects/collections
  • GET/shared-objects/{collection}/usage
  • GET/shared-objects/{collection}/objects/{objectId}
  • POST/shared-objects/{collection}/query
  • POST/shared-objects/{collection}/objects
  • PUT/shared-objects/{collection}/objects/{objectId}
  • DELETE/shared-objects/{collection}/objects/{objectId}
API リファレンスのすべてのエンドポイント
次のステップへのおすすめ

毎ラウンドにハイスコアを。

ラウンド終了後にスコアを保存し、上位のプレイヤーを表示します。現在の接続とプレイヤーセッションを引き続き使用します。