35K Views
December 15, 23
スライド概要
EOS Deep Diveに登壇した際に使用したスライドです。
https://egj-official-study.connpass.com/event/303791/
オンラインマルチプレイゲーム『TrinityS』 リリース後のEOS対応事例 Indie-us Games 中村 匡彦
自己紹介 名前 : 中村 匡彦 X : @aizen76 Indie-us Games 代表&クリエイター Unreal Engine何でも屋 最近中村 悠一さんと共演しました https://www.youtube.com/watch?v=hFHzWyihnYI
アジェンダ • TrinitySとUEについて • SteamCoreからOnlineSubsystemEOSへ • EOSとOnlineSubsystemEOS • EOSPlusとクロスプレイ • プラットフォーム固有の問題 • EOSを使ってみた感想
TrinitySとUEについて
TrinitySとは • オンラインマルチ協力プレイゲーム • ボス戦だけ集中して楽しめるボスラッシュゲーム • 現在、Steam/PS4/PS5でプレイ可能 • クロスプレイ版を現在開発中 • 最大3人でマルチプレイ • COM(AI)とのプレイも可能
Unreal EngineとEOS SDK UE4.27 Plusを利用 ※ランチャー版ではない EOS SDKは最新の1.16を利用
UE4.27 Plusについて GitHubで公開されている、現在も更新中のUE4最終バージョン。 最新のコンソールSDK対応やEOS SDKにも対応。 致命的なエラーは修正されるが、基本的には最新のSDK対応や 更新対応が必須となる部分のみが修正される。
Steam版について TrinitySのSteam版ではEOSは未使用。 この時点でオンライン周りの機能はほぼ完成済み。 そもそもPlayStation版のリリース予定は当初なかった。 それではなぜ出すことになったのか?
Σ Σ Σ(゚Д゚;)
まさかのSIEさんからの賞受賞 BitSummitでSIEさんがTrinitySをとても気にいってくださり、 開発についても色々とサポートしていただけるとのことで PlayStation版の開発を行うことを決定。 SIEさん、その節は本当にありがとうございました。
そして開発へ…
まずはSteam版をPS5へ TrinitySはC++を全く使っておらず、エンジン改造もなし。 バニラのUE4.26を使っていたが、コンソール版のために4.27へ。 PS5 SDKとUE4.27 Plusを導入し、 不要なものを削除していくだけで比較的問題なく、 PS5上での動作確認は完了。 PS4についても後日動作を確認。
SteamCoreから OnlineSubsystemEOSへ
SteamCoreとは Unreal EngineのOnlineSubsystemSteamをラップし、 BPだけでSteamworksの機能にアクセスする高機能プラグイン。 https://www.unrealengine.com/marketplace/ja/product/steamcore
SteamCoreとは Steam版をリリースするならこれだけで十分! 非常に使いやすく、Steamworksの機能をほぼ使用可能。 Steam版の開発はこれだけで大きなトラブルもなかった。 プラグイン開発者のサポートも手厚い。 現在上位版となるSteamCorePROというプラグインも存在する。 https://www.unrealengine.com/marketplace/ja/product/steamcore-pro
クロスプレイが前提 TrinitySでは最終的にSteam、PS4、PS5間の クロスプレイを目指すことが前提だったため、 EOSを使うのなら今しかない!ということで検証開始。
EOSCoreの検討 SteamCoreと同じ作者が開発している、 EOSCoreというプラグインが存在している。 使い勝手も似ており、非常に良い選択肢だが コンソール向けのサポートがなくて使用は断念。 自力で拡張して使用する選択肢もあったが、 検証コストが高くなりそうだったため、やはり断念。 https://www.unrealengine.com/marketplace/ja/product/eoscore
OnlineSubsystemEOSを拡張 結局UE4.27に搭載されているOnlineSubsystemEOSを そのまま利用し、SteamCore相当機能を作るのが無難。 ただし必要な機能以外は作らないことにする。 https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/Online/EOS/
必要な機能一覧 TrinitySでどのような機能が必要かを洗い出す。 • プラットフォームへのログイン • ロビー作成、検索、入室、破棄の機能 • 作成後ロビー情報の更新、取得 • フレンド機能
ロビー機能 開発が必要となる部分がほとんどロビー周り。 ログインやフレンド機能に ついてはプラットフォーム側に 備わっている機能が ほぼそのまま使えるので、 コストは低い。
Listen Server そもそもTrinitySはListen Serverで動作するため、 ロビー入室後はエンジン基本機能だけで全て成立する。 運営コストも低い。 セッションとして成立後 ゲーム中は各クライアントが P2Pのように通信する。
そんなこんなで 移植完了…
EOSでSteamにログインするまで EGJの寺内さんがSteamにログインするまでの手順の サンプルコード付き神記事をQiitaへ投稿されておりますので、 Epic Developer Portal とSteamの設定を参考にしましょう! https://qiita.com/EGJ-Daiki_Terauchi/items/5e6254f2f9e3e0f5fdc9
EOSと OnlineSubsystemEOS
EOSとOnlineSubsystemEOS EOSとOnlineSubsystemEOSはそもそも別物。 それぞれの関係性を理解しておく必要がある。 UEではEOS SDKを直で使う方法、OnlineSubsystem経由で 使う2種類の方法を選択することが可能。
EOSとOnlineSubsystemの構造 Game Application(BP or UE C++) OnlineSubsystem Interface(UE C++) OnlineSubsystemEOS(UE C++) EOS SDK(C Library) 上から順にコードが 呼び出されている
EOS SDKを直接呼ぶ Game Application(BP or UE C++) EOS SDK(C Library) 当然この呼び出しも可能 UEを使用しないゲーム であればこの方法を利用
OnlineSubsystemを使うメリット OnlineSubsystemのインターフェースを利用することが 出来るのでプラットフォーム対応が楽。 IOnlineSubsystemクラスで用意されている機能を プラットフォームごとに意識することなく呼び出しが可能。 何より公式でサポートされている安心感がある。 TrinitySではOnlineSubsystemをそのまま使っている。
OnlineSubsystemを使うデメリット インターフェースがあっても実装されていない機能がある。 インターフェース以上の使い方が出来ない。 もし独自機能を盛り込みたい場合、新規実装が必要。 EOS SDKの機能をフルに使うことが出来ない。
TrinitySでの学び 使い慣れているOnlineSubsystemを利用出来たので EOSを使っていても比較的習熟コストが低かった。 ただしC++でのBPラッパーを新規実装する必要があったので、 SteamCoreオンリーの時よりも機能が複雑なものとなった。 独自実装ゆえのバグもかなり発生してしまった。 ただSDKを直接扱うよりは断然楽なのは間違いナシ。
EOSPlusとクロスプレイ
EOSPlusとクロスプレイ OnlineSubsystemEOSの他にOnlineSubsystemEOSPlus というものが存在する。 EOSPlusは主にクロスプレイを実現するために利用。 プラットフォーム側の機能を呼び出すBaseOnlineSubsystemと 汎用的な機能を呼び出すOnlineSubsystemEOSの2つを同時に 管理する仕組み。
EOSPlusとOnlineSubsystemの構造 Game Application(BP or UE C++) OnlineSubsystem Interface(UE C++) OnlineSubsystemEOSPlus(UE C++) 上から順にコードが 呼び出されている EOSPlusが機能に応 じて自動で振り分け OnlineSubsystemEOS(UE C++) BaseOnlineSubsystem(UE C++) EOS SDK(C Library) Platform SDK(C Library)
EOSPlusのインターフェース対応 基本的にクロスプレイを行うためには EOSPlusを通して行うので EOSPlusが対応していない インターフェースは動作しない。 4.27 Plusでは実装が存在しない インターフェースが数多く存在する ※UE5では対応済みのものも多々
EOSPlusとUnique Net ID EOSPlusはクロスプレイを実現するために、 プラットフォーム側のBase Net IDと EOS側のEOS Net IDの2つユニークIDを同時に管理している。 EOSが自動的にID紐づけを行いますが、 個別にIDを取得することも可能なため、 プラットフォーム間のユーザー同士を 紐付けることも可能となる。
Unique Net IDとOnline User Interface Unique Net IDはセッションが作成される前のオフラインの ユーザーも見つけることが可能なため非常に有用! Online User Interfaceを使うことで特定のユーザー情報を いつでも取得することが可能。 https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/Online/OnlineUserInterface/
EOSPlusへの理解 クロスプレイを実現するためには、EOSPlusの理解が必須。 なぜか特定プラットフォームでのみEOSが動作しない場合、 EOSPlusの実装に問題があることを疑うべし。 EOSPlusで問題がない場合、プラットフォーム側の機能で 問題が発生していることを疑う必要がある。 BaseOnlineSubsystemの実装にバグがあることもある。
プラットフォーム固有の問題
プラットフォーム固有の問題 EOSPlusが対応していても、プラットフォーム側で EOSの実装が存在しないことがある。 これはどうしようもないので、独自実装するしかない。 EOS SDKを直叩きすることになるので、コストが高く、 バグが生まれやすいということに注意が必要。 ただUEのバージョンが上がる毎に解消している印象。
PS4とPS5のクロスジェネレーション 現在PS4とPS5の同ゲーム同士がマルチプレイ可能な クロスジェネレーションと呼ばれる仕組みがある。 比較的新しい仕組みのため、UE側の対応が甘く、 エンジンのバグを何度も踏んでしまい、UE5でも健在の模様。 もし開発に関わる方がおられたら積極的なバグ報告を!
クロスプレイ以外について クロスセーブ 異なるプラットフォームでセーブデータを共有 クロスアイテム 異なるプラットフォームでストア購入したアイテムを共有 クロス通貨 異なるプラットフォームでゲーム内通貨を共有 ※名称は全て仮称であり正式なものではありません
クロスプレイ以外について これらはプラットフォームによって、制約が厳しく EOSを使ったとしても実現難易度が非常に高いと感じた。 また一部ソーシャル機能についてはEOS単体で実現できない ケースも存在しており、ゲームの仕様をよく考える必要がある。 特にインディー規模のゲームの場合、注意が必要。 コア機能が実現できないと商品価値が落ちてしまう。
EOSを使ってみた感想
EOSを実際に使ってみた感想 非常に高機能! マルチプレイ以外の機能も充実! ゲーム運営機能もあるので、 Epic Account Services(EAS)と一緒に 使うことで大規模なゲームでも十分実用! OnlineSubsystemとの連携で UEだと低いコストで利用可能!
EOSのここがちょっと… とにかくサンプルとチュートリアルが少ない! 特になぜかUEユーザー向けのものがほとんどない。 ネットの記事はUnity向けやEOS SDK直叩きのものが多い。 OnlineSubsystemが対応しないと 独自実装するしかなくて大変だった… Epic Gamesさんどうかよろしくお願いいたします!
追加情報
Online Subsystem 2.0 現在Online Subsystemの次期バージョン OSS 2.0が開発中。 Online Services PluginがUE5.1から利用可能。 • より合理的なAPI設計 • ブループリント対応 • OSS 1.0との併用も可能
Online Subsystem 2.0 • OSS 1.0では対応していなかったインターフェースも追加 • ただしEOS SDKの全てをカバーしているわけではない Common User Pluginを使うと、BPからOSSの機能へ ある程度アクセスできるようになった! ただし唯一のサンプルがLyraのみ。 OSS 1.0以上に情報が少ないのが難点。
詳細はこちら https://www.docswell.com/s/EpicGamesJapan/5294MZ-UE5_1_GameFramework_Network#p36