16.9K Views
December 21, 23
スライド概要
Epic Games Store は、誰でも自由にゲームを販売することが可能ですが、その際にいくつか満たすべき要件があります。
本スライドでは、それら要件の説明と、 Epic Online Services を使って実際にその要件を満たす方法について説明しています。
※本ドキュメントは EOS Deep Dive 2023にて講演した資料を配布用に編集したものです
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
EOS SDK の Epic Games Store との インテグレーション方法 2023 Private & Confidential
はじめに 本講演では Epic Games Store でゲームをリリースする際の要件と、それをEOS SDK 等を用いて実装する際の流れについて説明します。
Publishing EGSリリースに必要な要素 Game Experience Entitlement Management
Publishing ストア設定 ゲーム本体やそのエディション、 DLC等 ストアページの構成 価格、リリース日付、ローカライズ、 etc Game Experience Entitlement Management
Publishing 所有権管理 ゲームやDLC の所有権管理の実装 Game Experience Entitlement Management
Publishing EGS の実装要件 EGS 特有の実装要件 基本は全ての PC ストアフロントで 同じゲーム体験を提供する事 Game Experience Entitlement Management
Publishing ストア設定 Game Experience Entitlement Management
ストアセットアップ DevPortal 上のパブリッシングツール - 自プロダクトのストアページを自由に設定可能なツール - ページの文言、画像、動画等 - ベースゲーム、DLC、エディション、etc - 価格設定、リリース日、etc - セールの実施等
詳細な使い方は Web ドキュメントを参照 https://dev.epicgames.com/docs/ja/epic-games-store/publishing-tools
ストアセットアップ EOS SDK に関連するリソースとしては以下 - Offer : ストアでの販売単位 - Catalog Item(Audience) : アクセス可能なアイテムを管理する単位 - Binary : 所有権を持つユーザがダウンロード可能なバイナリ - 利用資格 (Entitlement) : ユーザに付与された利用資格情報
ストアセットアップ ストアフロント (ユーザに見せる単位 ) Offer Offer Offer (Base Game) (Deluxe Pack) (DLC) Offer (OST/Artbook)… Audience Catalog Item (アクセス権を 割り当てる単位) ユーザのPC内データ (Deluxe Pack) Audience Audience … Audience (Base Game) (DLC) (OST/Artbook) Binary Binary (Base Game) (OST/Artbook)
ストアセットアップ 利用資格 Entitlement Audience (Deluxe Pack) (Deluxe Pack) … Entitlement (Other Game) ︙ Audience (Base Game) Audience (DLC) Audience (OST/Artbook)
ストア構成を考える際の注意点 事前にどのようなデータ構成になるかをよく検討しておくこと - 所有権の階層構造は? - どのOffer がバイナリアップロードが必要か? - DLC の形態は? DLC のデータはBase Game に含まれ、権限確認でアンロック or DLC のバイナリを別途ダウンロードする必要有り
Publishing 所有権管理 Game Experience Entitlement Management
所有権検証 EGS で販売するタイトルは所有権検証を実施することを推奨 - ゲームをDL すると、実行可能バイナリがそのままインストールディレクトリに配置 される - ランチャーから起動する場合は、ランチャー側で所有権の検証が実行されるが、 直接バイナリを起動した場合は回避されてしまう
所有権検証 推奨する手順としては以下 1. 2. ランチャーからゲームが起動されていることを確認 ベースゲームやDLC の所有権を確認 その他に Ownership トークンや Web API を利用して、Dedicated Server 上でユー ザの所有権を確認することも可能
ランチャーからゲームが起動されていることを確認 EOS_Platform_CheckForLauncherAndRestart - ランチャー以外から起動されていた場合に強制的に、ランチャーを通して再起動 が実行される - EOS_PLATFORM_CHECKFORLAUNCHERANDRESTART_ENV_VAR で指定さ れる環境変数を明示的に上書きすることで、ランチャーから起動されていた場合 でも強制的に再起動が可能
ベースゲームや DLC の所有権を確認 EOS_Ecom_QueryOwnership を利用して所有権を確認する - 検証したい Catalog Item ID のリストをパラメータとして渡す Callback 関数に EOS_EOwnershipStatus型のリストを含むデータが渡されるの で、どの Catalog Item に対して所有権があるか確認する - Audience の階層構造を意識した結果を返すため、検証対象の ID のみ指定すれば OK Audience (Deluxe Pack) Audience Audience (Base Game) (DLC) 検証対象
補足: OnlineSubsystemEOS を利用する場合の注意 UE のプラグインである OnlineSubsystemEOS では QueryReceipts 処理の内部で EOS_Ecom_QueryEntitlements を利用しているため Catalog Item の階層構造を意 識しない - 所有権検証をする場合は、上位のアイテム全ての ID を確認する必要あり Audience (Deluxe Pack) Audience Audience (Base Game) (DLC) 検証対象
補足: OnlineSubsystemEOS を利用する場合の注意 UE のプラグインである OnlineSubsystemEOS では QueryReceipts 処理の内部で EOS_Ecom_QueryEntitlements を利用しているため Catalog Item の階層構造を意 識しない - 所有権検証をする場合は、上位のアイテム全ての ID を確認する必要あり 上位のCatalog ID との照合も必要 Audience (Deluxe Pack) Audience Audience (Base Game) (DLC)
補足: OnlineSubsystemEOS を利用する場合の注意 対処法としては以下のいずれか 1. 2. 3. EOS SDK を直接呼び出す Web API を利用する OSS EOS を EOS_Ecom_QueryOwnership による検証処理を追加する
補足: OSS EOS とEOS SDK の直接呼び出しの併用 IOnlineSubsystem* を IOnlineSubsystemEOS* へ Cast して、 IOnlineSubsystemEOS::GetEOSPlatformHandle() を呼び出すことで EOS SDK の Platform Handle を取得可能 IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld()); IEOSPlatformHandlePtr PlatformHandle; if (typeid(OnlineSub) == typeid(IOnlineSubsystemEOS)) { IOnlineSubsystemEOS* EosOnlineSub = static_cast<IOnlineSubsystemEOS*>(OnlineSub); PlatformHandle = EosOnlineSub→GetEOSPlatformHandle(); } EOS_HEcom EcomPtr = EOS_Platform_GetEcomInterface(*PlatformHandle);
サーバ上で所有権を確認する Dedicated Server など、ユーザに紐づかない環境で各ユーザの所有権を確認したい 場合 - 所有権検証用のトークン or Web API を利用
トークンによる所有権検証 クライアント上で EOS_Ecom_QueryOwnershipToken を呼び出すことで、所有権 情報が含まれたJWT (有効期限5分) を生成 - JWT をDedicated サーバに提供することで所有権を検証する
トークンによる所有権検証 Dedicated Server ゲーム Epic EOS_Ecom_QueryOwnershipToken JWT (Ownership Info) JWT (Ownership Info) JWT ヘッダから公開鍵のID (kid) を取得 公開鍵を要求(kid) 公開鍵 JWT の検証 + 所有権の検証 所有権検証の結果に応じたレスポンス
Web API による所有権検証 Dedicated Server 上で直接 Ecom Web API を呼び出して所有権を検証 - Dedicated Server が利用する Client の Role は User Required にチェックが 入っていない (= サーバ用の Role) 必要がある - トークンによる検証では悪意のあるユーザによる改ざんの可能性を0にできない ため、できる限りWeb API を利用した検証を推奨
Web API による所有権検証
-
所有権検証 Web API のエンドポイント
https://api.epicgames.dev/epic/ecom/v1/platforms/EPIC/identities/{{AccountId}}/ownership?nsCatalogItemId=
{{sandboxId:catalogItemId}}
[
{
"namespace": "fn",
"itemId": "94egdb6df476d45199f6be940aa1337c0",
"owned": false
},
{
"namespace": "fn",
"itemId": "ff150af93c9a4fb99fee12f5db49fa5b",
"owned": true
}
]
Web API による所有権検証 Dedicated Server ゲーム Epic 所有権が必要なアクション要求 アクセストークンの要求 アクセストークン 所有権検証 Web API (Account ID/Sandbox ID/Catalog Item ID) 所有権情報 所有権に応じた処理 所有権検証の結果に応じたレスポンス
消費アイテム等の管理 消費アイテム(ゲーム内通貨や)の権利については、引き換え処理を実施してゲーム内 でアイテムを追加する必要がある 基本手順: 1. 2. 3. 4. EOS_Ecom_QueryEntitlements でのリストを取得 EOS_Ecom_GetEntitlementsCount, EOS_Ecom_CopyEntitlementByIndex を使って各Entitlement の個数をチェックする 引き換え可能なアイテムがあれば、EOS_Ecom_RedeemEntitlements を使って 引き換え 引き換え成功であれば、ゲーム内で処理を実行
消費アイテム等の管理
クライアント上での引き換え処理の実行はセキュリティ的に懸念有り
可能であれば信頼できるサーバ上で Web API を用いて実行すること推奨
1.
利用資格の列挙
GET https://api.epicgames.dev/epic/ecom/v1/identities/{AccountId}/entitlements
[{ "id": "189ff69f112de32095eff043a4529432",
"entitlementName": "742e8a7c33494f0ea83159030536p05e",
"namespace": "DeepDive",
"catalogItemId": "f42e8a7133464f0ea831790305d6505e",
"entitlementType": "AUDIENCE",
"grantDate": "2023-12-14T21:34:24.826Z",
"consumable": true,
"status": "ACTIVE",
"useCount": 0,
"entitlementSource": "AppEpicgamesCom"
}]
消費アイテム等の管理 クライアント上での引き換え処理の実行はセキュリティ的に懸念有り 可能であれば信頼できるサーバ上で Web API を用いて実行すること推奨 1. 引き換え処理 POST https://api.epicgames.dev/epic/ecom/v1/identities/{AccountId}/entitlements/redeem { "entitlementIds": [ "189ff69f112de32095eff043a4529432" ], "sandboxId": "ed94459f11204328f5eff043a4a29433" }
Publishing EGS の実装要件 Game Experience Entitlement Management
EGS での実装要件 全PCプラットフォームで同一のユーザ体験を提供することが前提 https://dev.epicgames.com/docs/ja/epic-games-store/requirements-guidelines/distribution-requirements/requirem ents-overview - クロスプラットフォームマルチプレイ (PC間のみ) - - マッチメイキング フレンドリスト 招待 実績機能 (他PC プラットフォームで実績が実装されている場合のみ)
クロスプレイの実装方法 実装方法について制限は無い - クロスプレイが実現可能であれば EOS は利用しなくても良い 例えば、フレンドリストを実装する場合以下のどれを利用しても問題ない 1. 2. 3. Epic のソーシャルグラフ 独自ソーシャルグラフ 1 と 2 の組み合わせ
EOS を使ったクロスプレイ体験 - ソーシャルオーバーレイを利用 - EOS SDK 1.15 以降 - 各ゲームコンソールは EOS SDK 1.16 以降でサポート - Epic アカウントでのログインが必須 - 面倒な入力は不要で簡単にEpic アカウントを作成可能 - 既存のEpic アカウントへのリンクも可能 - 各プラットフォーム上の機能とインテグレーションが可能 - フレンドリスト、招待など
フレンドリスト IntegratedPlatform インタフェースを利用して、 EOS のオーバーレイ上に プラットフォーム上のフレンドリスト と Epic アカウントのフレンドリスト をまとめて表示可能 dterauchi dterauchi
EOS_EResult Result = EOS_IntegratedPlatform_CreateIntegratedPlatformOptionsContainer(
&CreateIntegratedPlatformOptionsContainerOptions, &PlatformOptions.IntegratedPlatformOptionsContainerHandle);
// Configure platform-specific options.
const EOS_IntegratedPlatform_Steam_Options PlatformSpecificOptions =
{
…
};
// Add the configuration to the SDK initialization options.
const EOS_IntegratedPlatform_Options Options = {
EOS_INTEGRATEDPLATFORM_OPTIONS_API_LATEST,
EOS_IPT_Steam,
EOS_EIntegratedPlatformManagementFlags::EOS_IPMF_LibraryManagedByApplication |
EOS_EIntegratedPlatformManagementFlags::EOS_IPMF_DisableSDKManagedSessions |
EOS_EIntegratedPlatformManagementFlags::EOS_IPMF_PreferIntegratedIdentity,
&PlatformSpecificOptions
};
const EOS_IntegratedPlatformOptionsContainer_AddOptions AddOptions = {
EOS_INTEGRATEDPLATFORMOPTIONSCONTAINER_ADD_API_LATEST,
&Options
};
EOS_IntegratedPlatformOptionsContainer_Add(PlatformOptions.IntegratedPlatformOptionsContainerHandle, &AddOptions);
補足: UE で EOS を使う場合の注意点 OSS EOS は IntegratedPlatform インタフェースに未対応 - UE 5.4 で対応予定 現時点でPlatform との連携を利用したい場合、コード変更が必要になる - FEOSSDKManager::CreatePlatform 内で適切に EOS_HIntegratedPlatformOptionsContainer を設定して EOS_Platform_Create を呼び出す必要あり
マッチメイキング/招待 参加するゲームセッションの検索及び招待機能を提供 - Session - - データの管理主体はゲーム側 - EOS 上のデータはあくまでゲーム情報のコピー、情報変更の通知などは無し Dedicated サーバ上でセッションを管理することを前提 Lobby - データの管理主体は EOS サーバ - ロビーのメンバ /属性値/所有者の変更などは全て通知される P2P接続ではこちらを使う方が安全
P2P connection P2P インタフェースを用いてクロスプラットフォームでの接続が可能 - 前述のマッチメイキング機能を使って接続先の情報を取得 - 接続したい相手の Product User ID を指定すれば、どのプラットフォームとも接続可能 EOS_P2P_SendPacket - 接続のリクエスト or パケットの送信 EOS_P2P_AddNotifyPeerConnectionRequest - 接続リクエストをハンドルするコールバック関数の登録
招待機能 Lobby や Session は招待を送信可能 - SDK または Overlay から送信可能 Overlay を有効化している場合は Overlay 上にも表示される Overlay 上での各招待への応答/拒否, セッションへの参加といったゲーム外で発生す るイベントに対しては、対応するCallback 関数を登録して処理する EOS_Lobby_AddNotifyLobbyInviteAccepted EOS_Lobby_AddNotifyLobbyInviteRejected EOS_Lobby_AddNotifyJoinLobbyAccepted EOS_Sessions_AddNotifySessionInviteAccepted EOS_Sessions_AddNotifySessionInviteRejected EOS_Sessions_AddNotifyJoinSessionAccepted
招待機能 (応用) Lobby や Session に対する招待を Epic Games ランチャー 上に表示可能 - DevPortal 上で Deployment と Artifact をリンクさせるだけ
招待機能
招待機能 (応用) 各プラットフォーム上の招待との連携 - Overlay から招待が送信された場合にトリガーされる、コールバック関数を登録可能 - 招待に際してプラットフォーム機能での招待送信が必須な場合等に利用 EOS_Lobby_AddNotifySendLobbyNativeInviteRequested EOS_Sessions_AddNotifySendSessionNativeInviteRequested EOS_CustomInvites_AddNotifySendCustomNativeInviteRequested 設定したコールバック関数の中で各プラットフォームの招待を送信する
実績機能 他の PC プラットフォーム上で実績機能が実装されている場合、EGS でも実績を必ず 実装しなくてはならない EOS の実績機能 1. ゲーム内からのみアクセス可能 2. ゲームの責任で変更可能 3. EGS の実績機能 1. EGS ランチャーやユーザプロファイ ルからアクセス可能 2. 本番リリース後の変更は基本的に 不可能 3. 実績を解除すると対応した XPがア カウントに付与される 4. EOS 実績機能をベースに作成 実績ごとの重み付けなどは無し
実績機能 他の PC プラットフォーム上で実績機能が実装されている場合、EGS でも実績を必ず 実装しなくてはならない EOS の実績機能 1. ゲーム内からのみアクセス可能 2. ゲームの責任で変更可能 3. EGS の実績機能 1. EGS ランチャーやユーザプロファイ ルからアクセス可能 2. 本番リリース後の変更は基本的に 不可能 3. 実績を解除すると対応した XPがア カウントに付与される 4. EOS 実績機能をベースに作成 実績ごとの重み付けなどは無し
実績の設定について DevPortal から設定可能 最低 5 XP から 100 XP まで 5 刻みで設定可能 合計1000 XP まで ※設定方法の詳細はドキュメントを参照 https://dev.epicgames.com/docs/ja/epic-games-store/services/epic-achievements/achievements-setup 一旦本番環境にPush してしまうと変更出来ないので、アーリーアクセスとしてリリース する場合はEGS の実績は未実装のままにしておくことを推奨 (事前に相談の上でリリース条件から例外として除外可能です)
補足: Steam からインポート Steam の実績のマスタデータをEGS に流し込むためのツールが提供中
実績の追加 (DLC など) EOS コミュニティサイトからプライベートディスカッションを作成して、XP を追加したい旨 をリクエスト - 追加可能な XP の量は要相談
実績の解除 実績解除方法としては2つ 1. Stats サービスを利用して、ある閾値を超えた場合に解除 a. b. 2. 進捗状況が表示できる 複数の Stats を指定することも可能 Achievement インタフェースの API で直接実績を解除 a. b. EOS_Achievements_UnlockAchievements Client の Role に解除権限を忘れずに付与すること
実績の解除 解除に Stats を用いるときの注意点 - Stats はすべてサーバ上で集計されるため、オフライン時にはStats の更新が出 来ない - 正確な集計をするためにはオフライン時はローカルに集計しておき、オンラインに なったときにデータを投入するなどの対応が必要になる
まとめ Epic Games Store でゲームをリリースする際のポイントについて紹介しました - ストア構成 所有権管理 EGS の実装要件 Epic Games Store でのリリースをお待ちしています!
Thank you! — Daiki Terauchi 2023 Private & Confidential