デベロッパーのよくある質問
このセクションでは、AccelByte Gaming Services を使用してゲームを構築する際の一般的なデベロッパーの質問と回答を紹介しています。
管理者ポータル
名前空間内のすべてのプレイヤーを表示するにはどうすればよいですか?
[User Management / Users (ユーザー管理/ユーザー)]に移動し、[Search User (ユーザーを検索)]エントリーを[by Creation Date (作成日)]に変更します。その後、日付を名前空間が作成される前の時間に設定します。これですべてのプレイヤーを表示できます。
**管理者ポータルに他のユーザーを追加するにはどうすればよいですか?
管理者ポータルのスーパー管理者である場合、[Platform Configurations / Admins / Invite Admins (プラットフォーム設定/管理者/管理者を招待)]に移動します。そこから招待者のメールアドレスを入力し、スーパー管理者、ゲーム管理者、または利用可能なその他のロールを設定します。
フルフィルメントとエンタイトルメント付与の違いは何ですか?
フルフィルメントは実際にエンタイトルメント付与を呼び出しますが、主な違いは、フルフィルメントは管理者ポータルのフルフィルメントタブにトランザクション情報を記録する点です。これにより、付与されたすべてのエンタイトルメントを追跡できます。
ログビューアとは何ですか?
ログビューアは、管理者ポータルに組み込まれているツールであり、バックエンドに行われた API 呼び出しを確認できます。トレース ID、ユーザー ID、応答ステータスコードなどを調べるためのフィルターがあります。フィルターはお互いに組み合わせて使用することもできます。[Platform Configurations (プラットフォーム設定)]をクリックし、[Log Viewer (ログビューア)]をクリックするとアクセスできます。
サーバーイメージをアップロードする場合、アップロードの進行状況と残りのアップロード時間を確認できますか?
現在、サーバーイメージのアップロードの進行状況と残りのアップロード時間を確認するための指標を提供していません。ビルドステータスのみが報告されます。
ロビーから切断すると、すぐにユーザーのプレゼンスの状況はオフラインに変わりますか?
はい、管理者ポータルのロビー設定で
keepPresenceActivityOnDisconnect
を有効にしていない限り、すぐにリセットされます。
AGS アーキテクチャと動作
アクセストークンの取得または更新に失敗した場合、どのようなサービスの動作が想定されますか?サービスをキルし、Kubernetes で再起動すべきですか、それとも再試行を続けるべきですか?
サービス側にエラーをスローする前に、1 回以上再試行することをお勧めします。
AccelByte OSS はブループリントをサポートしていますか?
設計上、OSS はブループリントをサポートしていません。ブループリントで OSS を使用するには、プラグインをいくつか使用するか、ブループリント用の独自のラッパーを作成する必要があります。
ロビー告知がクライアントに正常に送信されたかどうかを確認するにはどうすればよいですか?
ロビー告知が正常に送信されたかどうかを確認する方法として、サービスログを確認する方法があります。正常な告知は、「info (情報)」ログが利用可能な場合にのみ記録されます。ただし、対象ユーザーがオフラインの場合は、この限りではありません。
プレイヤーが持てるフレンド数に上限はありますか?
現在はありません。
クラウドベースのバックエンドシステムに不慣れで、用語に苦労しています。
新しいドキュメントポータルに AGS 用語集を追加しました。この用語集に追加してほしい新しい用語があれば、お知らせください。
API エンドポイント
すべてのプレイヤーレポートをクエリする管理者 API とは何ですか?また、OAuth クライアントがこの呼び出しを行うのにどのような権限が必要ですか?
クエリがチケットに基づいているかレポートに基づいているかどうかに応じて、2 つのエンドポイントがあります。
チケットに基づいてクエリを実行するには:
GET /reporting/v1/admin/namespaces/{namespace}/tickets
レポートに基づいてクエリを実行するには:
GET /reporting/v1/admin/namespaces/{namespace}/reports
必要な関連権限は次のとおりです。
Permission: ADMIN:NAMESPACE:{namespace}:TICKET [READ]
チケットは、単一の報告されたオブジェクトを表すモデルであることに注意してください。オープンかクローズドかを示すステータスが含まれています。報告された新しいオブジェクトのチケットが作成されます。報告されたオブジェクトにオープンチケットがない場合を除き、同じオブジェクトを持つ後続のレポートは同じチケットを使用します。
レポートは、単一のオブジェクトについてユーザーが送信するレポートです。カテゴリは、レポートの対象となる機能を定義します (例:チャット、マッチメイキング、UGC)。オブジェクトタイプは、報告されるタイプを定義します (例:ユーザー、またはコンテンツ)。オブジェクト ID レコードは、一意の ID です。
API 呼び出し
queryUserIAPOrders
は、管理者ポータルの機能/メニューによって呼び出されますか?いいえ。
API コマンドを呼び出しているとき/ログインしようとしているとき、
LogAccelByte: INVALID RSP HTTP
という警告が表示されます。これはどういう意味で、解決するために何ができますか?このエラーには通常、API 呼び出しが不正な形式であることを示す 400 応答が伴います。これが Unreal Engine を使用している場合、呼び出している API コマンドの形式に問題がある可能性があります。API 呼び出し URL にダブルスラッシュ (//) がないこと、および defaultEngine.ini が正しく設定されていることを確認してください。次のようになるよう、BaseUrl の末尾にスラッシュがないことを確認してください。
[/Script/AccelByteUe4Sdk.AccelByteSettings]
ClientId=<client_id>
ClientSecret=
Namespace=<namespace>
PublisherNamespace=<publisher_namespace>
RedirectURI="http://127.0.0.1"
BaseUrl=<base_url>
AppId=<app_id>
[/Script/AccelByteUe4Sdk.AccelByteServerSettings]
ClientId=<client_id>
ClientSecret=<client_secret>
Namespace=<namespace>
PublisherNamespace=<publisher_namespace>
RedirectURI="http://127.0.0.1""現在のフルアカウントからヘッドレスアカウントにリンクされている場合、
Get
競合結果でlinkedGames
パラメータは何を返しますか?linkedGames
パラメータはゲームの名前空間を返します。現在のフルアカウントからヘッドレスアカウントにリンクされている場合、
oneTimeLinkCode
パラメータは何を返しますか?oneTimeLinkCode
パラメータはゲームの名前空間を返します。2000 の制限がある
query
パラメータをプレイヤーのフレンドに使用した場合、プレイヤーに約 64 人を超えるフレンドがいると、これは過負荷になる可能性がありますか?はい、各プレイヤー ID には 32 文字が必要になるため、ID 数の上限は約 64 になります。回避策として、フレンド ID の数を制限するか、複数のリクエストを行う方法があります。
##認証と承認
エンタイトルメントを一括で付与または取り消すことはできますか?
はい、API によりゲーム管理者は一度に複数のエンタイトルメントを付与したり、取り消したりできます。
IAM サービスや、Steam での認証の場合、どこで
steamopenid
の情報を見つけることができますか?Steam ウェブサイトの User Authentication and Ownership (ユーザー認証と所有権確認) を参照してください。
ベストプラクティス
最善の方法に関するユーザーからの質問
専用サーバー
専用サーバーが作成を開始しないのですが、何が間違っているでしょうか?
考えられる理由として、設定があります。[Dedicated Server Management/Configurations (専用サーバー管理/設定)]で、デプロイメントを確認して、最大値が 0 に設定されているか確認する必要があります。その後、Pod 設定を確認してください。
これらが小さすぎると、サーバーのリソースが不足します。大きすぎると、仮想マシンがサーバーを実行できなくなります。通常、デフォルトで使用する仮想マシンには 5 GHz の CPU と 8 GiB のメモリ (AWS EC2 m5a.large インスタンス) があるため、それらを念頭に置いて Pod 設定を調整します。
場合によっては、より適切な EC2 インスタンスをリクエストできます (特に本稼働の場合)。方法については、所属している組織または AccelByte の担当者にお問い合わせください。
サーバーが作成している間、またはユーザーと実行している間、サーバーが終了するようです。これはしばらくした後に起こる傾向がありますが、何が間違っているのでしょうか?
これはおそらくタイムアウトのせいです。作成のタイムアウトとセッションのタイムアウトが適切に設定されていることを確認してください。専用サーバービルダーまたは専用サーバー自体が無期限に実行されないように、タイムアウトが必要です。これは何か問題が発生したときのためです。作成のタイムアウトは、300 秒 (5 分) 以上にすることをお勧めします。新しいサーバーイメージがアップロードされると、ビルダーと仮想マシンがサーバーイメージをダウンロードしてキャッシュするのに時間がかかります。セッションのタイムアウトは、ゲームセッションが完了するまでに通常かかる時間の 2 倍以上にすることをお勧めします。
E コマース
マネタイゼーション、製品ストアなどに関するユーザーからの質問
エラーと例外
ロビーサーバーにアクセスすると、エラーコードが表示されました。そのコードの関連する説明を見つけるにはどうすればよいですか?
ロビーエラーコードでエラーの一覧を検索してください。
エラーコード 401
invalid_client
は何を意味しますか?このエラーは、クライアント ID またはクライアントの秘密が間違っているため発生します。アップロードしようとしている名前空間のクライアント ID とクライアントの秘密が正しいことを再度確認してください。
エラーメッセージ
unable to grant client token
は何を意味しますか?このエラーは、IAM クライアントで不適切な権限が使用されていると起こります。ドキュメントガイド[リンク]で権限を再確認してください。
エラーメッセージ
Docker file pushed to registry but unable to update DSM config. Please contact the Administrator
は何を意味していますか?このエラーコードは、DS アップローダーのバージョンと環境バージョンが一致していない場合に表示されます。管理者ポータルから DS アップローダーの最新バージョンをダウンロードすると、このエラーが発生しなくなります。
エラーコード 720743
unable to create image patch, invalid request: patch version is empty
は何を意味していますか?このエラーコードは、DS アップローダーのバージョンと環境バージョンが一致していない場合に表示されます。管理者ポータルから DS アップローダーの最新バージョンをダウンロードすると、このエラーが発生しなくなります。
エラーメッセージ
"conflict image version" error=conflict
は何を意味しますか?このエラーは、アップロードしようとしている新しいイメージのバージョンが既に存在することを意味します。同じバージョンを維持したい場合は、コマンドに
--patch
フラグを追加します。そうでない場合は、アップロードコマンドのバージョンを変更する必要があります。エラーコード
20013 access forbidden: insufficient permissions
は何を意味しますか?このエラーは、サーバーイメージをアップロードするために IAM クライアントで誤った権限が設定されていると発生します。IAM クライアントの権限を再確認し、権限に関するドキュメントと一致していることを確認してください。
PS4 および/または PS5 の PlayStation ログインを設定しましたが、ログインしようとすると、
"unable to exchange auth code: unable to unmarshal error response: invalid character '\u003c' looking for beginning of value"
というエラーが表示されます。これはどのように解決すべきでしょうか?\u003c
は<
の数値コードです。これは、HTML ページが応答として返されていることを意味します。通常、このページは Sony の環境への不正アクセスを指します。アクセス権を取得するには、お使いの環境を Sony のホワイトリストに登録するためにいくつかの作業を行う必要があります。1.ホワイトリスト登録のために、環境の IAM サービスの静的 IP アドレスを AccelByte にリクエストします。
1.どの Sony の環境にアクセスするかを決定します (例:
sp-int
、prod-qa
)。1.組織の PlayStation Partners サポートページに移動します。
1.一般的なサポートリクエストを送信して、ホワイトリスト登録が必要な環境で提供された IP アドレスをホワイトリストに登録します。
publicBulkClaimUserRewards
エンドポイントがエラーメッセージ49124 Manual claim not supported
を返す場合はどうすればよいですか?このエンドポイントは、
Automatically
報酬要求設定に基づいて応答を返します。これが有効になっていると、手動で要求できません。これにより、エンドポイントは 49124 エラーメッセージを返します。ゲームの名前空間からパブリッシャーの名前空間にゲームアイテムを複製しようとすると、エラー
Default Region is required
が表示されます。パブリッシャーとゲームの名前空間には、既に同じリージョンと言語の設定があります。ここでの問題は何ですか?ゲームの名前空間で、そのアイテムの地域価格が設定されていることを確認してください。そうすることで、パブリッシャーの名前空間がアイテムの複製時に確認すべき基本価格を把握できます。これを行うには、ストアに移動し、アイテムの詳細を開き、料金設定パネルの[Add New (新規を追加)]をクリックします。
Armada に専用サーバーをアップロードする際に問題が発生しました。
"errorMessage": "access forbidden: insufficient permissions. Required permission: NAMESPACE:{namespace}:DSM:CONFIG [READ]"
というエラーが表示されます。エラーメッセージに、足りない権限の定義が含まれていることに注意してください。
テンプレート ID を入力すると
Cannot use dynamic template data with a legacy template ID
エラーが発生するのですが、APP_SUBSCRIPTION_EMAIL_TEMPLATE_SUBSCRIBED
といった変数の正しい値は何ですか?これは想定された動作です。テンプレート ID ではなく、テンプレート名を入力する必要があります。
機能リクエスト
リージョンのチャットルームをサポートする予定はありますか?
現在、その予定はありません。リージョン全体のチャットルームを実現するには、チャットルームの紐付けられたセッションに多数のプレイヤーを追加する必要があります。
インシデントからの回復
- AccelByte マルチプレイヤーサーバーの設定中に、コードにバグが発生し、V2 セッションがスタックしました。これにより、セッション検索関数が破損します。セッションを破棄してクリーンアップしようとしましたが、ローカルでセッションを破棄できないというエラーが発生しました。テストを再開するために、ハングした V2 セッションを破棄するにはどうすればよいですか?
参加しているすべてのセッションをクエリして、ゲームの起動中にそれぞれの LeaveRestoredSession
を呼び出します。ユーザー数が 0 になるとセッションが削除されるため、DestroySession
を呼び出さないでください。
ログイン
ユーザーが未認証のメールアドレスを使用している場合、メールアドレス - パスワードログインを行い、アクセストークンを取得できますか?また、アクセストークンは他のサービスにアクセスするために使用できますか?
はい。
1 .エンタイトルメントを一括で付与または削除することは可能ですか?
API と管理者ポータルは、複数のエンタイトルメントを付与または取り消すことができます。**[User Management (ユーザー管理)] > [Users (ユーザー)]**に移動して、エンタイトルメント設定を見つけます。API 呼び出しは [`grantUserEntitlement`](https://docs.accelbyte.io/gaming-services/services/monetization/entitlements/entitlements-update-notifications/#updated-entitlements-notifications) および `revokeUserEntitlements` です。
これは現在、サードパーティログインの機能ですが、ユーザー名 - パスワードログインの機能ではありません。サードパーティのログインでは、IAM は IP アドレスに基づいてユーザーの国を自動的に設定します (国フィールドが空欄の場合)。
マッチメイキング
**Armada サーバーデプロイメントのデフォルトイメージになるイメージのアップロードを設定するにはどうすればよいですか?
[Generate Command (コマンドを生成)]ページに移動すると、[Deployment (デプロイメント)]ドロップダウンがあります。コマンド生成フォームに入力し、デプロイメント名を選択してコマンドを生成します。
--deployment {deployment-name}
引数があるはずです。ゲームサーバーを Armada にアップロードすると、選択したデプロイメントイメージのバージョンが最新のイメージに変更されます。
パフォーマンス
AGS のパフォーマンスを改善する方法を知りたいユーザーからの質問
プレイヤーポータル
たとえば、顧客自身のバナーを使用して AccelByte プレイヤーポータルをリブランドすることは可能ですか?
可能です。ただし現在は AccelByte に連絡して行う必要があります。プレイヤーポータル UI エディタは、今後のリリースのロードマップに含まれています。
プレイヤーは他のプレイヤーの統計データを表示できますか?
はい、デフォルトで、すべてのユーザーロールに次の権限が付属しています。アクション 2 は読み取りアクセス権を意味するので、プレイヤーには自動的に表示権限が付与されます。
"Resource": "NAMESPACE:{namespace}:USER:*:STATITEM", "Action": 2
リリース
完成したゲームをリリースする方法に関するユーザーからの質問
ロールと権限
ユーザーに通貨を提供するには、管理者ポータルのロールにどのような権限が必要ですか?
必要な権限は次のとおりです。
resource="ADMIN:NAMESPACE:{namespace}:USER:{userId}:WALLET", action=4 (UPDATE)
どのように必要な権限を判断すればよいですか?
使用する API エンドポイントに応じて、必要な権限は異なります。
使用したい API の API エンドポイントのリストを確認し、各呼び出しに必要な権限を見つけます。
API が公開の場合はユーザーロールの権限が必要ですが、API が管理者の場合はゲームの IAM/OAuth クライアントの権限が必要です。
どのロールでユーザーを設定すべきですか?
デフォルトで、スーパー管理者ロールとゲーム管理者ロールを使用することをお勧めしています。スーパー管理者ロールは、ユーザーにすべての名前空間へのフル管理者アクセスを提供します。これは、デベロッパーリードに適しています。ゲーム管理者は、割り当てられた名前空間に対してフル管理者アクセス権を持ちます。スーパー管理者などの環境全体へのアクセス権限を必要とするものは含まれません。ローンチが近くなると、モデレーターと非デベロッパーのためにカスタムロールの作成を検討することをお勧めします。
ユーザーにロールを付与するにはどうすればよいですか?
特定のユーザーにロールを付与するには、プロファイルに移動し、[Role (ロール)]タブをクリックして[Add Role (ロールを追加)]を選択します。
セキュリティ
dsm-controller には、オリジン間リソース共有 (CORS) ホワイトリスト機能がありますか?
CORS ホワイトリストは、サーバーが特定の送信元からのリソース読み込みを許可できるようにするシステムです。これは AccelByte dsm-controller によってサポートされています。
エンタイトルメントを一括で付与または削除することは可能ですか?
API と管理者ポータルは、複数のエンタイトルメントを付与または取り消すことができます。[User Management (ユーザー管理)] > [Users (ユーザー)]に移動して、エンタイトルメント設定を見つけます。API 呼び出しは、
grantUserEntitlement
およびrevokeUserEntitlements
です。不審なアクティビティがあった場合に、指定されたユーザーがメール告知を受け取るメカニズムはありますか?
現在、個々のユーザーに対して告知を設定することはできません。
テスト
プレイテスト用に複数のアプリ ID を持っている場合はどうすればよいですか?
この問題に対処する方法は 2 つあります。
このプレイテストに参加するユーザーに進行状況とエンタイトルメントを引き継いでもらいたい場合は、既に使用している名前空間でアプリ ID を交換するのが最善の方法です。
このプレイテストでだけユーザーの進行状況とエンタイトルメントを別にしたい場合は、新しい名前空間を作成し、すべての設定をインポートし、プレイテスト用の新しいアプリ ID を設定する必要があります。これにより、すべてのデータが他の名前空間から分離されます。
Nomad からログをプルするにはどうすればよいですか?
コマンド:alloc logs を参照してください。
Web開発におけるCORS(クロスオリジンリソースシェアリング)の処理
CORSは、異なるオリジン(ドメイン)からのWebリクエストをブロックまたは制限するセキュリティ機能です。セキュリティにとって重要ですが、ローカルでWebアプリを開発するときには、面倒に感じることもあります。ここでは、CORSを管理または回避するいくつかの方法を紹介します。
サーバーで許可リストを設定する
```info AGS Private Cloudの顧客の場合、Webドメインを許可リストに追加するようリクエストできます。注意: この機能はAGS Shared Cloudにはまだ利用できません。 ```
サーバーにアクセスできる場合、特定のオリジンからのリクエストを受け入れるようにサーバーを設定できます。たとえば、http://localhost:3030
やhttp://example.com
からのリクエストを許可することができます。
ブラウザ機能や拡張機能を使用する(非推奨)
ブラウザの設定や拡張機能を使用してCORSを回避することができますが、この方法はリスクがあります。以下はChromeの例です:
```powershell chrome.exe --disable-web-security --disable-gpu --user-data-dir="[directory]" ```
これにより、ChromeのWebセキュリティが無効になり、すべてのリクエストがCORSを回避でき、ドメイン間でクッキーを保持できるようになります。しかし、このアプローチはセキュリティと安定性を損なうため、推奨しません。
また、ブラウザ拡張機能をプロキシとして使用し、リクエストをターゲットサーバーに転送することもできますが、これも本番環境やユーザー向けシナリオでは安全ではありません。
ローカルプロキシを使用する(開発者に推奨)
ローカルプロキシを設定することは、JavaScript開発において安全で効果的な方法です。以下の方法でセットアップできます。
オプション1: Viteの組み込みプロキシを使用
Viteはプロキシを設定するための簡単な構成を提供しています:
```ts export default defineConfig({ server: { port: 3000, proxy: { '/api': { target: 'http://example.com', changeOrigin: true, cookieDomainRewrite: 'localhost', configure(proxy) { proxy.on('proxyReq', req => { req.setHeader('Referer', 'https://example.com') }) }, rewrite: path => { return path.replace(/^\/api/, '') } } }, }, }) ```
解説:
http://localhost:3000/api/test-route
へのリクエストはhttps://example.com/test-route
に転送されます。- プロキシはオリジンを変更し、Refererヘッダーを設定します。
- レスポンス内のクッキーは、元のドメインではなくlocalhostに書き換えられます。
オプション2: http-proxy-middleware
を使用したExpressのプロキシ
```ts const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware');
const apiProxy = createProxyMiddleware({ target: 'http://example.com', changeOrigin: true, cookieDomainRewrite: 'localhost', configure(proxy) { proxy.on('proxyReq', req => { req.setHeader('Referer', 'https://example.com') }) }, rewrite: path => { return path.replace(/^\/api/, '') } });
const app = express();
app.use('/api', apiProxy); app.listen(3000); ```
Viteプロキシと同様に、このセットアップではリクエストを転送し、クッキーを書き換えます。
推奨事項
- 本番環境の場合: ドメインの許可リストをサーバー側で設定します。
- ローカル開発の場合: ローカルプロキシ(例: Viteやhttp-proxy-middleware)を使用します。
- ブラウザ拡張機能の使用やセキュリティ設定の無効化は避けてください。これらはリスクを伴います。
これらの手順に従うことで、セキュリティを損なうことなくCORSを効果的に管理できます。