Unreal Editor でのシークレットの運用や自分用の生産性プラグインを適用する方法を知りたかった

シークレットに関する動機

Epic Online Service 等を使うと、必然的にプラットフォームに接続するためのシークレット情報が出てきます。

これらは、通常 SCM で管理すべきではありません。
イントラ内で SCM サーバーを持っている場合は考え方は変わるかもしれませんが、クラウドの SCM を使う場合は漏洩や事故(誤って公開状態でコミットしてしまうなど)はあるものとして運用した方が、もしもの時に慌てずに済みます。

DefaultEngine.ini に書き込まれる

Project Settings でこの手のシークレットを記載すると、DefaultEngine.ini に書き込まれます。

DefaultEngine.ini は多くのプロジェクトに関する設定項目があるため、SCM から除外することができません。

試行錯誤

ini には Paths= といういかにも他のファイルから読み込む用みたいな書き方があるため、さっそくそれを試してみました。(これができれば、シークレットだけファイルを分けて、それを管理外とすればいい)

が、どういうパス指定をしてもうまくいきませんでした。Engine のコードを読めば理解できたのだと思いますが、この問題にそこまで時間をかけたくなかったので断念。。

現在の運用方法

上記2つの記事から、Saved\ にある設定ファイルが優先されかつ、ソース管理からは通常外すということがわかりました。

よって現在は Config\WindowsEditor\Engine.ini (Windows の場合) にシークレット情報を書き込み、DefaultEngine.ini の方にはシークレットのキーは残し、値には「Saved に値を書き込め」のようなメッセージを配置するようにしています。

自分用の生産性プラグインの適用の動機

生産性に関してはそれぞれ考え方が違うと思いますが、スクリプト言語の現場だと、エディターすらもメンバーでバラバラです。(Vim だったり、IDE だったり。UE C++ の開発も、今だと Rider も選択肢に入ってくるのではないでしょうか。)
そして、キーバインドから文字のフォントや配色、利用するプラグインやアドオンも自由にしていると思います。

ただ、Blurprint の開発となると Unreal Editor 一択です。であれば、Unreal Editor をとにかく自分の使いやすいようにしたいところです。(と書きつつ、私は他の言語を書く時はデフォルト厨なのですが、、)

ただ、Plugin を指定すると .uproject に書き込まれてしまいます。当然 .uproject は SCM の管理下なのでチームにその影響が出てしまいます。AutoSizeComment のような無料の Plugin であったとしても、その辺は好みの問題なので迷惑な人もいると思いますし、DarkerNodes のような見た目を変えるだけでかつ有料 Plugin となると、それこそチームで同意を得るのは難しいと思います。

試行錯誤

限られた時間で調べてみたのですが、どうしても安くていい方法が調べられずでした。。

現在の運用方法

現在はプロジェクトの Plugins に、Engine にインストールした Plugin をシンボリックリンクするという方法を取っています。

mklink /D E:\UnrealProjects\MyProject\Plugins\DarkerNodes C:\UnrealEngine\UE_5.0\Engine\Plugins\Marketplace\DarkerNodes
E:\UnrealProjects\MyProject\Plugins\DarkerNodes <<===>> C:\UnrealEngine\UE_5.0\Engine\Plugins\Marketplace\DarkerNodes のシンボリック リンクが作成されました

mklink | Microsoft Learn

ただ、これだけだと Plugins\ 以下は SCM の管理下なので SCM の除外設定を追加します。Plastic SCM の場合は以下のような感じです。

/Plugins
!/Plugins/みんなで使うプラグイン1
!/Plugins/みんなで使うプラグイン2

Plugins フォルダ全体を除外してしまった後に、個別に必要なプラグインだけ有効にします。

これに関しては、Plugins フォルダに入れる共有のプラグインを頻繁に追加したりしないので運用できるというのはあると思います。

注意としては

当然、ランタイムに影響するプラグインはこういう使い方はしてはいけないので、その辺は注意が必要だと思います。

他の方法としては

.uprojectプラグインが追加されたとしても、Enabledtrue にならなければ他のメンバーに影響はでないので、.uproject を誤ってコミットしないことに注意しつつ、自分の環境でだけ true にするというのもありだと思います。(その方が、チームメンバーも「こういうの使ってる人がいるんだぁ」と知ってもらえていいかもしれません)

最後に

もっといい方法が知りたいですね 😅

UE の Seamless Travel を利用してみた

内容としてはすでに多くの方がまとめてくださっている内容なので個人のログの域を超えていません 😇

利用した状況

ぷちコンに出した対戦ゲームは大きく以下の流れになっています。

  1. ログイン画面 (Epic Account でのログインのみ)
  2. メインメニュー画面 (セッション作成・一覧からの参加、キャラクターの選択など)
  3. ロビー画面 (参加ユーザー一覧、対戦マップ選択、対戦開始)
  4. 対戦画面

Level としては、1, 2 は同じレベル (MainMenuLevel)、3 はロビーレベル (LobbyLevel)、4 は対戦レベル群 (Stage*) となっていました。

これを UE の Session や Level の移動にあてはめると

画面 Level 処理
ログイン画面 MainMenuLevel
メインメニュー画面 セッション作成 Create Session
セッション一覧 Find Sessions
セッション参加 Join Session
ロビー移動 (セッション作成後) open LobbyLevel?Listen
ロビー画面 LobbyLevel 対戦開始 servertravel Stage*
対戦画面 Stage*

のようになります。(ちょっとこの書き方だと分かりにくいですね 😅)

つまり、 UE5 と Epic Online Services を BP のみで利用してみた - まとめとコード置き場 - You are done! での内容に対して、さらに「ロビー画面(のようなもの)」が間に挟まっている形です。

ちなみに、EOS のロビー機能は使っておらず、ここでもその説明はしません。というか使ってないのでできません・・・

ロビー画面が挟まることで変わることは、

  • 最初のセッション参加先 (つまりロビー)から、さらに対戦用のレベルにもう一段遷移しなければいけない
  • ロビーと対戦画面はやることが大きく異るため、GameMode も切り替える必要がある

の 2 点です。(後者は 1 つの GameMode でも実現可能かと思いますが、ここでは切り替える前提で進めます)

また今回の記事に関する点として、servertravel Stage* の箇所、つまり、ロビーから対戦画面への遷移時に Seamless Travel を利用したということです。

サンプルコード

GitHub - dany1468/EOSTest at seamless_travel

コードは以前の記事で利用した EOSTestseamless_travel branch として上げてあります。(Win10 と macOS Monterey / Xcode 13.4.1 で動作確認しています)

実行すると以下のような画面遷移となります。

youtu.be

以降の内容は上記のサンプルコードがベースになっています。

Seamless Travel

Unreal Engine でのマルチプレイヤー ゲームでの移動 | Unreal Engine ドキュメント

Unreal Engine は、可能な限りマルチプレイヤー ゲームにシームレス移動の使用をお勧めします。通常、ゲーム体験が一層スムーズになり、再接続のプロセス中に発生しがちな問題を回避できます。

「お勧めします」と書かれていますが、私の実行環境ではシームレスを有効にしないとそもそも servertravel が機能しませんでした。これに関しては私の方法が悪いのか、他の問題なのかの切り分けはできていません 😥

使い方自体はとても簡単で以下を行うだけです。

  • TransitionMap を用意する
  • GameMode の Use Seamless Travel を有効にする

TransitionMap の用意

上記のように Project Settings に設定します。TransitionMap は Empty Level で作成したままで私は使っています。

GameMode の Use Seamless Travel を有効にする

今回の場合は Lobby の GameMode から ThirdPersomMap (対戦画面を想定) に servertravel する際に有効にすればいいです。

もちろん、GameMode の属性自体を有効にしてしまってもいいと思います。

Seamless Travel を利用する上での注意

シームレストラベルの使い方とか - ひさめのあんりある日記

上記の記事が詳しいですが、OnPostLogin が呼び出されません。Seamless Travel の場合には、上に貼った公式ドキュメントにもある通り、再接続が無いため OnPostLogin は呼び出されないようです。

私が試した環境では以下のような順で関連するイベントが呼び出されました。

サーバー クライアント
Handle Starting New Player (クライアントのコントローラ)
OnSwapPlayerControllers (クライアントのコントローラ)
BeginPlay
Handle Starting New Player (サーバーのコントローラ)
OnSwapPlayerControllers (サーバーのコントローラ)

上記のように、クライアント側は何も呼び出されません。

Handle Starting New Player については以下に詳細がありますが、これを呼び出すと、デフォルトで spwan される pawn の処理が呼び出されなくなるので、キャラクターの spwan 処理を自前で記述する必要がでてきます。(今回のぷちコンの場合は逆に自前で呼び出したかったのでこちらを利用しました)
Game Mode と Game State | Unreal Engine ドキュメント

よって、セッションに接続する場合には OnPostLogin で良かったのが以下のように OnSwapPlayerControllers を利用するように変更されます。

ちなみに上図の Old PC はロビー画面からの遷移になるため BP_LobbyPlayerController になります。

余談: Player Start の選択

Handle Starting New Player の箇所で、今回参加したぷちコンではこちらを使ったとありましたが、その理由の一つに Player Start 位置の指定がありました。 (初期 spwan 位置に関しては、単に GameMode の Default Pawn ClassNone にするだけでも自動での spawn を止められます。他にも方法はあるかと思いますが。)

ここに関しては私の知識不足で実装当時は以下のように空いている Player Start を探して自前で spawn して posses させるという方法を取っていました。

もちろんこでも上手くいくのですが、今回の記事を書くにあたり、GameModeBaseChoosePlayerStart という override できる関数があることを知りました。

Player Start の Array は都度取得してもいいですが、以下のように事前に収集しておくこともできます。

やっていることは変わらないといえば変わらないのですが、単に Default Pawn Class のものを spawn させるだけならこっちの方が簡単だなという気づきでした。

参考にさせていただいた記事

UE5 の BP Project を Plastic SCM で管理して開発してみた

本文の前に

ここで書く内容は、ほぼ GitHub - SRombauts/UEPlasticPlugin: Plastic SCM Plugin for Unreal Engine に書かれている内容です。なので、使い方を知りたい方は公式ドキュメントを一読される方が分かりやすいです。

PlasticSCM のリポジトリとして folk されたものがありますが、上記の元の作者のリポジトリと同一の内容のようです。
issue を立てられないので公式のミラーだと思いますが、いずれこちらに移すのかもしれません。GitHub - PlasticSCM/UEPlasticPlugin: Plastic SCM plugin for Unreal Engine

この記事は、あくまで私達のチームがどう使ったかぐらいの話と思ってください 😇

導入の経緯

今回参加した UE5 ぷちコンは 2 人で開発していました。大きく担当を分け (キャラクターやそれに付随するもの or UI・ネットワーク・Level やそれに付随するもの) ていましたが、それでも同じファイルを触る時もでてくるため、それを相手が触っているかという情報は重要でした。(もちろん2人なので、都度聞けばというのもありますが、さすがに面倒。。)

なので、まあ普通に SCM を導入しようかということになりました。

Github

日常的にはスクリプト言語C# で書くことが多いので Github (というか Git) が一番使い慣れたコードの管理先でした。

当初はそれでやってみたのですが、Git LFS を利用したとしても、バイナリをちょっとアップロードするだけで無料版の制限に引っかかってしまい、さすがにそのためにリポジトリを色々分けたりというのも運用が面倒になりそうだったのでやめました。(もちろんお金を払うべきというのもあるのですが、今回はぷちコンでしたので。。)

また、UE5 の Source Control 機能としても、ほとんどの機能が利用できずあまりメリットが享受できないなぁというのもありました。

Perforce

たぶんこれが一番いいんだろうなと思いつつ、無料で運用しようと思うと自分でサーバー立ててどうこうという感じになりそうだったので今回は断念。。

Plastic SCM

Unity が買収というニュースを見てから気になっていたので、以前からインストールはしていたのですがきちんと使うこともありませんでした。

ただ、とりあえず利用ストレージが 5G を超えるまでは無料で使えるようだったので今回はこれを利用することにしました。

Plastic SCM - Licensing and pricing options

また、UE5 の Source Control 機能も十分な機能が利用できることも決め手になりました。

以降は Plastic SCM (Cloud Edition) の利用について書いていきます。

UE5 でのプロジェクトの作成

まずは UE5 のプロジェクトを作成しておきます。先にローカルにリポジトリフォルダを作ってしまうと、UE5 が「すでにフォルダがあるから無理」と警告してくるためです。(おそらく大抵は多少コードを書いてから管理しようかなとなると思うので、この流れの方が自然かなと)

リポジトリの作成

ここは Plastic SCM の GUI ツールで行います。

上記のようにリポジトリを作成します。リポジトリ名はなんでもいいですが、先に作成した UE5 のプロジェクトフォルダを指定する必要があります。

こうすることで root に .plastic フォルダが作成されます。Git と同じですね。

ちなみに、この .plastic フォルダを削除するだけでさくっと管理を外すこともできます。(もちろん UI からもできます)

リポジトリのコードのローカルへの複製

自分でコミットしたコードが、クリーンな状態にチェックアウトした場合にちゃんと動くかというのは気になるケースがあると思います。その場合は、以下のように別のローカルフォルダにダウンロードすることで簡単に確認できます。

確認が終わればさくっと消してもいいですし(その場合はローカルフォルダも消しましょう)、継続的に動作確認のためのフォルダにしてもいいと思います。

余談ですが、動作確認をする必要があるのなら、main にコミットする前に別の branch に一度 push してからの方がチームメンバーに迷惑をかけなくていいですね。(と書きつつ、自分でお試しでいれたエンジンプラグインなんかが残っていると、同じマシンだと有効になってしまうので正確な確認にはならないですが 😅)

設定

差分検出設定

Plastic SCMではまったもの

上記記事の「ファイルの内容で差分検出」の部分を参照してください。

記事はレガシーUI ですが、現行の UI もほとんど変わりません。

UEPlasticPlugin の導入

デフォルトで UE5 には入っているのですがバージョンが古い上に、その状態だと Source Control の機能が全く利用できません。なので最新版を利用します。

Manual installation from the latest version here - SRombauts/UEPlasticPlugin: Plastic SCM Plugin for Unreal Engine

上記の公式の通りです。UE5 用の zip をダウンロードしてきたら、Engine のプラグインフォルダに入れます。

上記のようになっていれば大丈夫です。UE4PlasticPlugin となっていますが、そこも問題ありません。(今後変わるかもしれませんが)

Unreal Editor で初期設定

Source Control settings - SRombauts/UEPlasticPlugin: Plastic SCM Plugin for Unreal Engine

こちらも公式の通りです。今回はすでにリポジトリも作成済なのでもろもろ勝手に認識されると思います。

加えて Project Settings, Editor Preferences も済ませておきます。と書きつつですが、私はデフォルトから変えていません。

p4merge が未インストールであればインストール

Editor Preferences や、Plastic SCM の GUI ツールの差分ツール等を見てもらうと分かる通り、差分ツールは p4merge が指定されています。お好みがなければこれをインストールしておけば設定変更せず使えます。

私は scoop で管理しているのでそちらからインストール。

> scoop bucket add extras
> scoop install p4v

Plastic SCM の GUI ツールでの差分ツールの追加

Plastic SCM は UE に最適化されているという訳ではないので、 GUI ツールで .uasset の差分ツールが未設定です。なので、それを設定しておきます。

Configure Visual Diff of Blueprints from Plastic SCM GUI - SRombauts/UEPlasticPlugin: Plastic SCM Plugin for Unreal Engine

これもプラグイン側の公式に書かれています。

GUI ツールでの差分ツールの注意点

[SOLUTION] There aren't any diff tools defined in the client configuration file - Unreal Engine - Plastic SCM Community

せっかく設定した差分ツールですが、現行の UI では動作しません。レガシーUI に変更することで問題なく利用できるのでレガシーUI が利用できるうちはそちらを使った方がストレスが無いかもしれません。

ロックルールの設定

これはお好みになりますが、特定のファイル等で自動で checkout 時にロックをかけることができます。

Plastic SCMのリポジトリでファイルをロックさせる方法を知りたい – ユニティ・テクノロジーズ・ジャパン株式会社

例えば雑に .uasset 単位でロックをかけるなら以下のようになります。

これは、GUI ツールで初めてロックをかける時にルールを作るか質問されるので、そこで作ることもできます。もちろんファイル名を直接指定できるので、「PlayerController だけは競合しやすいのでロックして作業したい」等もありだと思います。

その他

ignore.conf がルートに配置されていると思いますが、これは Git の .gitignore です。Unreal Editor が作成するもので十分ではありますが、追加で除外するものがあれば登録しておくといいと思います。

設定完了

ここまでで初期設定が完了です。

以降はざっと開発時のポイントとなる操作を見ていきます。

いくつかの開発時の操作

ただ、これも公式ドキュメントに非常に詳細に載っていますのでそちらを見るほうが確実です。

Working in Editor - SRombauts/UEPlasticPlugin: Plastic SCM Plugin for Unreal Engine

submit する前に変更を確認する

割りとお試しで変更した部分が残ったりするので重要です。

GUI で何が変更されたか確認
Unreal Editor の View Changelist でも確認
Unreal Editor で Diff の確認
GUI でも Diff の確認は可能 (レガシーUI)
マテリアルの場合はテキストなので、、私ではまだわかりにくい

branch で開発する

checkout の状態は branch が異なっていても通知されるので、正直少人数だとそこまで branch を使った開発に恩恵は感じ無いのですが、Plastic SCM はレビュー機能もあるのでチームの運用次第では使うのではないかと思います。(今回は 2 人での開発だった上に担当分けを大きくしたのでレビューまでの運用は無し。。)

以下ではロックの運用も兼ねて書いていきます。

GUI で新規ブランチ作成 (現行UI でもできます)
GUI から lock と checkout をする (Unreal Editor からはロックはできない。ルールを設定すれば可能)
checkout したよアイコンがつく
異なるフォルダに clone する (自分以外の開発者想定)
main の branch
誰かが lock で checkout してるよアイコンがつく (色弱なので正直アイコンの色の表現分かりにくい。。)
色々警告でるが main ブランチと sample_branch の両方でコミットをそれぞれ作る (先に sample_brahch でコミットしてロックを外してから main でコミット作った)
sample_branchmain に merge する(スクショ取り忘れた。。)と conflict が出る
Resolve Conflict ボタンを押すと、Diff ツール (Unreal Editor) が立ち上がる。ただ、Diff だけなのでここでは解決はできない。
Unreal Editor 側の Source Control にも Merge が出現するので、そちらをクリック
Merge Tool がでる

スクショを撮り忘れたのですが、Git と同じく Resolve Conflict の後は再度コミットが必要なのでそちらもお忘れなくです。

Merge Tool

Merge conflicts on Blueprints - SRombauts/UEPlasticPlugin: Plastic SCM Plugin for Unreal Engine

上記公式の解説の方が詳細です。

Merging Uassets - Unreal Engine - Plastic SCM Community

また、上記で作者が回答しているように、この merge tool はあくまで差分を見るためだけのツールである点にも留意する必要があります。この辺は Plastic SCM というよりは Unreal Editor のこれからの進化に期待したいところです。

最後に

私もですが、日常的にチームで Git の運用を行っているともっと Plastic SCM の使いこなすべき機能は多くあります。私は現状ほとんどの機能を使いこなせていませんが、上述の内容でひとまず 2 人の運用を乗り切れました。

また、最新の Plugin を入れることで One Files Per Actor (OFPA) に対する差分の利用もできるようになるので、Perforce を利用できない少人数の開発チームは Plastic SCM を利用するメリットはいくつかありそうに思います。

参考にさせていただいた記事

UE5 と Epic Online Services を BP のみで利用してみた - まとめとコード置き場

ここまで雑に書いてきましたが、部分的にノードや Widget のスクショだけを貼ってきていたので、一旦コードとして置いておきます。

GitHub - dany1468/EOSTest

無料の addon 2 つに依存しています

AdvancedSessionPlugin に関しては submodule になっています。
Git - サブモジュール にあるような方法をつかってもらってもいいですし

git clone コマンドの --recursive オプションを使いましょう
git submodule update --init

面倒なら GitHub - mordentral/AdvancedSessionsPlugin: Advanced Sessions Plugin for UE4 からダウンロードしてもらってもいいです。

いずれにしろ、AdvancedSessionPlugin の「現在」の状態で確認しているので、将来的には動かなくなる可能性はあります。

実行に関して

Epic Online Service の設定に関して

上記の Github にあるコードは当然ながら Epic Online Service における開発者情報 (ProductId や ClientId など) は一切含まれていません。
実行する場合には、自身で Developer Portal で発行する必要があります。(最初の記事で書いた通りです)

UE Editor からのデバッグ実行に関して

これは記事内で言及していますが、Standalone で実行する必要があります。

また、これは必須ではありませんが、Run Under One Process が ON になっていると、異なるセッションであっても同じレベルに移動できてしまい「???」という状態になるので、一応気にしておくといいと思います。ただ、通常は ON になっている方が処理も早いので、あくまで気に留めておく程度で。

最後に

ブログ記事にするというこで、できるだけフリーで手に入るものでやってみましたが、ある程度のところで手詰まりにはなってしまいました。

一方で、 AdvancedSessionPlugin を入れるだけで、複数ユーザー(NAT を超えた状態で)とセッションを共有できるようになるのはとても素敵です。(EOS 以外でもできるのだと思いますが 😅)

適宜 C++ の実装も取り込んでいきつつ、使いこなせていけるようになりたいなと思います。

UE5 と Epic Online Services を BP のみで利用してみる (セッション検索・破棄)

UE5 と Epic Online Services を BP のみで利用してみる (セッション作成・一覧・参加) - You are done!

上記の続きです。

EOS でプレイヤー数が増えないのは

前の記事の最後で EOS の Developer Portal でセッションがどのようになっているかを確認しました。

その際に参加プレイヤーが 0 になっていました。これに関しては、(おそらくこの状態の) BP からは使えない API を利用する必要があります。

プレイヤーを登録する Sessions Interface | Epic Online Services ドキュメンテーション

ざっと引用します。

プレイヤーがセッションに参加すると、セッション所有者はプレイヤーをセッションに登録する必要があります。これにより、バックエンド サービスがプレイヤー数を継続的に認識できるため、セッションが満杯になるとセッションのアドバタイズを停止できます。EOS では、EOS_Sessions_RegisterPlayers 関数を使用して一度に複数のプレイヤーを登録できます。次のデータを含む EOS_Sessions_RegisterPlayersOptions 構造体を使用して、所有しているクライアントからこの関数を呼び出します。

プレイヤー数は UE 内で GameMode 等で管理することもできますが、そこで数を数えた上でセッションの Advertise を変更せずとも自動で EOS 側でやってくれるのは便利そうです。

また「プレイを開始および終了する」の項にもあるように、Join In Progress のオプションを有効にすることで、開始後のセッションへの「参加の試みを拒否」する機能にも使えます。
残念ながら Join In Progress を有効にしても、 Join Session 自体は拒否できないためあくまで「参加 (RegisterPlayers)」の API に対してのようです。

この辺りは、今回の「BPのみ」の主旨から外れるのでここまでにしておきます。

セッション検索

検索を構成する Sessions Interface | Epic Online Services ドキュメンテーション

今回はおそらく最も使うであろう属性の検索を行います。

セッション作成時に属性を付与

もちろん Update Session でも同様のことができます。この状態で作成されたセッションを確認すると以下の赤枠のように属性が追加されていることがわかります。

セッション一覧時にフィルタする

これに関しては2つのフィルタ方法があります。

Find Sessions のクエリにフィルタを付与 Find Sessions の結果に対してフィルタ

通常はクエリに対してフィルタを付与することになりますが、さらにローカルで絞り込みをしたいといった場合には結果に対してのフィルタもできます。

ドキュメントにもある通り、数値であれば検索条件も完全一致以外にもできるので何かと利用できそうです。

セッション破棄

セッションの破棄は簡単です。

上記で破棄が行われ、Developer Portal からもセッションは確認できない状態になります。

余談 セッションの開始と終了

Join In Progress で少し触れましたが、セッションは作成と破棄とは別に開始 (Start Session)と終了 (End Session) が存在します。

プレイを開始および終了する Sessions Interface | Epic Online Services ドキュメンテーション

以下にノードを紹介していますが、まず Create Advanced SessionStart After Create にチェックをすると、作成と同時に開始状態を経て進行中になるということです。今回の一連の記事ではこれを利用していました。

Get Session State から得られる Enum の値からも分かる通り、状態は細かく分かれているようです。

参考にさせていただいた記事

UE5 と Epic Online Services を BP のみで利用してみる (セッション作成・一覧・参加)

UE5 と Epic Online Services を BP のみで利用してみる (準備 - ログイン) - You are done!

上記の記事の続きです。

Epicアカウントでのログインまでできるようになったので、その状態で Epic Online Services のセッションを利用していきます。

セッションに関する UI を作る

ログイン後にユーザー名を表示していた View に Create SessionFind Sessions を追加しました。

以下は Find Sessions 後に一覧 View です。

Create Session 後はそのまま Third Person テンプレートの ThirdPersonMap に移動させます。

上記の View は MainMenuWidget の中で WidgetSwitcher で切り替えているだけです。

セッション一覧の個別の要素

セッションの一覧 View は検索されたセッションが全て表示されますが、それぞれに Join ボタンを用意するため個別に Widget を用意しています。

セッション作成

Create Session ボタンのクリックイベントで以下の処理を行います。

Clear UI は Widget の削除や入力モードの変更をしているだけです

Should Advertise にチェックをつけて Find にひっかかるようにしておきます。

セッション一覧

Find Sessions ボタンのクリックイベントで以下の処理を行います。

セッション一覧が Scroll box にしているため、そのクリアと子要素の追加がありますが、それ以外は Find の結果を表示しているだけです。ここでは Filter は一切表示せず、全てを一覧させているだけです。

セッション参加

Join ボタンのクリックイベントで以下の処理を行います。Join のイベントは上記の Find Sessions で子要素の Widget を作成している時に紐づけています。

上記の Join Button Clicked イベントは Widet の中で Event Dispatcher で呼び出されています。子要素の Widget 内では Join ボタンのイベントして以下を実装しています。

Find Sessions Advanced で取得した Blueprint Session Result 構造体をそのまま受け渡しているので、 Join Session にそのまま渡せています。

動作の様子

それぞれのログイン後
Player1 がセッション作成 -> ThirdPersonMap に移動
Player2 がセッション一覧
Player2 がセッション参加

上記では ThirdPersonMap で Session ID と Player Name を表示するようにしています。

Epic Online Services でのセッションの状態

Developer Portal のゲームサービス -> マッチメイキングで作成したセッションの確認ができます。

プレイヤー数が 0 になっているのですが、これはまた別記事とします。

UE5 と Epic Online Services を BP のみで利用してみる (準備 - ログイン)

UE5ぷちコン用にオンライン対戦ゲームを作るにあたり、これまでプラットフォームを使ってのオンライン対戦を作ったことがなかったので、UE で作っていることもあり Epic Online Services を利用することにしました。

環境

  • Windows 10
  • UE 5.0.3
    • 新規の Third Person プロジェクト
  • Advanced Sessions Plugin (382ed08)

Advanced Sessions Pluginを利用する

BP で作成するにあたり、AdvancedSessionPlugin を利用します。

> git submodule add https://github.com/mordentral/AdvancedSessionsPlugin Plugins/AdvancedSessionPlugin

今回は上記のように Plugins フォルダに submodule としてチェックアウトしました。

Epic Online Services の準備をする

Developer Portal にアクセスしテスト用の製品を作成します。

Epic アカウントサービスの設定

Epicアカウントサービス メニューがあるのでだいたい流れに沿っていけば作成できます。

新規クライアント
クライアントポリシーの詳細
作成したクライアントを指定
アクセス許可
設定後

アクセス許可で Online PresenceFriends を有効にしておきます。

SDK のダウンロードと Dev Auth Tool の用意をする

SDK は直接は必要無いのですが、そこに添付されている Dev Auth Tool を利用するのでダウンロードしておきます。SDK は前述の Developer Portal からダウンロードできます。

私がダウンロードしたバージョンを展開すると以下の場所にあります。

EOS-SDK-21689671-v1.15.2.1\SDK\Tools\EOS_DevAuthTool-win32-x64-1.1.0\EOS_DevAuthTool.exe

起動すると以下のようにたちあがってきます。

Epic アカウントでログインしておきます。今回は Creadential Name を Context_1, Context_2 としていきます。この名前は任意ですが、後述するログインフェーズで指定するのでそこと合わせてください。

Online Subsystem EOS の有効化

メニューの Edit -> Plugins から以下を有効にしておきます。

Plugins フォルダに直接入れた Advances Sessions Plugin は明示的に有効にする必要はありません。

Project Settings で Epic Online Services の設定を行う

前述の Plugin を有効にしたことで Project Settings に Plugins -> Online Subsystem EOS のメニューが出てきています。

Developer Portal の「製品設定」の箇所にある項目をそのままコピーできるようになっています。

Encryption Key はここでは対応する値がありませんが、空にするとうまくいかないので 0000000000000000000000000000000000000000000000000000000000000000 を入れておきます。(64桁であればなんでもいいです)

また Use Epic Account for EOS login (requires account linking) にもチェックを付けていることに注意してください。

DefaultEngine.ini の設定を行う

EOS Online Subsytem (OSS) プラグイン | Unreal Engine ドキュメント

+[OnlineSubsystem]
+DefaultPlatformService=EOS
+
+[/Script/Engine.GameEngine]
+!NetDriverDefinitions=ClearArray
++NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemEOS.NetDriverEOS",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
+
+[/Script/OnlineSubsystemEOS.NetDriverEOS]
+bIsUsingP2PSockets=true
+
 [URL]
 GameName=EOSTest

ドキュメント通りですが、上記のような差分になります。

メインメニュー画面を作る

ログイン、セッション作成、セッション検索などを行う画面を作成します。

まずは MainMenu で新規 Level を作成します。今回は Empty Level で作成しました。

UI を作成する

なんの工夫もなく、ただ、ログインボタンが置いてあるだけです。

ログイン処理

EOS Online Subsytem (OSS) プラグイン | Unreal Engine ドキュメント

上記ドキュメントを見るといくつかログイン方法がありますが、今回は Account PortalDeveloper を使ってみます。

Account Portal Developer

上記はそれぞれの実装ですが、基本的にはドキュメントの通りです。Dev Auth Tool で設定した Port 番号 (ここでは 6300) を指定します。

Developer の CredentialName は上述した通り、Dev Auth Tool で指定したものですが、複数アカウントでテストする場合にはハードコードするわけにもいかないので以下のような関数を用意して利用しています。

後述しますが、Standalone で起動する必要があるので Standalone の起動引数を利用しています。

以下は Standalone で Number of Players2 にした状態で起動したもの時にプロセスを引数ごと取得したものですが、GameUserSettingsINI に Window ごとに PIEGameUserSettings0, PIEGameUserSettings1 が入っていることが分かります。上記の関数ではこれを parse して利用しています。

Name             CommandLine
----             -----------
UnrealEditor.exe "C:\UnrealEngine\UE_5.0\Engine\Binaries\Win64\UnrealEditor.exe" "E:/UnrealProjects/EOSTest/EOSTest.uproject" /Game/ThirdPerson/Maps/MainMenu -game -PIEVIACONSOLE  -Multiprocess  GameUserSettingsINI="PIEGameUserSettings0" -MultiprocessSaveConfig -forcepassthrough -messaging -SessionName="Play in Standalone Game" -windowed -WinX=1280 -WinY=741 SAVEWINPOS=1 -ResX=1286 -ResY=760
UnrealEditor.exe "C:\UnrealEngine\UE_5.0\Engine\Binaries\Win64\UnrealEditor.exe" "E:/UnrealProjects/EOSTest/EOSTest.uproject" /Game/ThirdPerson/Maps/MainMenu -game -PIEVIACONSOLE  -Multiprocess  GameUserSettingsINI="PIEGameUserSettings1" -MultiprocessSaveConfig -forcepassthrough -messaging -SessionName="Play in Standalone Game" -windowed -WinX=1280 -WinY=741 SAVEWINPOS=1 -ResX=1286 -ResY=760

ログイン処理をボタンクリックで呼び出す

今回は試すだけなので、一つのログインボタンに対して以下のように両方をノードの付け替えで試す形にしています。(開発中は Dev Auth Tool を利用した方がいいので)

通常の Login を利用した場合には、ログインボタンを押すとブラウザに Epic アカウントのログインフォームが現れ、そこでのログインが成功すればゲーム内のログイン処理も終了します。
Login as Developer を利用した場合には、Dev Auth Tool が起動していればそこからアカウント情報を取得しログイン処理を完了します。

どちらも初回は、未確認のアプリに対する警告が出ますが、無視して OK です。

ログイン後にユーザー名を表示する

ログイン後にログインボタンを非表示にし、代わりに TextBlock を表示します。その TextBlock に上記の関数をバインドします。

実行する

少し触れましたが、PIE ではうまく動作しないため Standalone で起動します。

Login as Developer を利用しての画面遷移

ログイン前
ログイン後

単純なものですが、Epic アカウントのユーザー名が取得できています。

まとめ

さっと流しましたが以下のような注意点がありました。

  • Developer Portal で Epic アカウントサービスを設定する
  • Project Settings への設定時に Encryption Key をダミーで入れておく
  • Dev Auth Tool は SDK から取得する
  • Developer でログインする場合には Dev Auth Tool と設定をあわせる
  • Standalone で起動する

また、今回は AutoLogin に関しては触れませんでしたが、AutoLogin の場合は、プロジェクトの起動引数の AUTH_PASSWORD に CredentialName を指定する必要があり、それを簡易に複数ユーザーで Standalone 起動時に変更する方法がわからなかったのでスキップしました。

参考