[UE5] Lyra のバックエンドにEOS を使ってみる + OnlineServices (Experimental) を使ってみる

# 記事概要
UE5 では、ゲームのサンプルとして Lyra という TPS ゲームが提供されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/bd3beda6-9157-fef1-79d7-676f8ed80f98.png)

このゲームでは、UnrealEngine の様々な機能を使って実装されていますが、もちろんネットワーク対戦機能も含まれています。

デフォルトでは LAN 対戦のみですが、Epic Games が提供しているオンラインプラットフォーム [Epic Online Services](https://dev.epicgames.com/ja/services) にバックエンドを載せ替えることで、簡単にインターネット経由での対戦が可能となります。

Lyra ではOnline 機能を CommonUser というプラグインの形で実装しています。
CommonUser プラグインでは、設定により内部で利用する [Online Subsystem](https://docs.unrealengine.com/5.0/ja/online-subsystem-in-unreal-engine/) を切り替えることが可能です。

CommonUser プラグインはプリミティブなオンライン機能を提供することが目的のOSS ではカバーしきれなかった高レベルなゲームプレイセッションのフローをサポートしています。
詳細は、下記をご確認ください。
https://docs.unrealengine.com/5.0/ja/common-user-plugin-in-unreal-engine-for-lyra-sample-game/

Lyra ではEOS 用の設定が用意されており、こちらを有効化することで簡単に EOS へ載せ替えることが可能です。
本記事では、下記ブログで解説されている内容を日本語化して、EOS をバックエンドとして Lyra を動作させる手順を解説します。
https://dev.epicgames.com/community/learning/tutorials/375e/using-epic-online-services-with-lyra-starter-game

また、UE5 では OnlineSubsystem の改善が予定されており、現在 Experimental ですが OnlineServices Plugin として実装されています。
こちらに載せ替える手順についても合わせてご紹介します。

# EOS Developer Portal の設定
EOS を利用するためには、Developer PortalというEpic Games が提供する開発者用 Web サイト(Developer Portal)で必要なリソースを作成/設定する必要があります。

1. [Developer Portal](https://dev.epicgames.com/portal/) にアクセスして、自分の組織を作成します．
1.1 各組織内では、ゲームに対応した「製品」を作成することで、各ゲームからEOS サービスにアクセスすることができるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/04d2724f-3b8a-4909-2b26-fcd964eb077f.png)

1. DevPortal上で製品を新規作成
 2.1 今回は "LyraTestProduct" という名前で製品を作成
1. 作成した製品の詳細ページを開き、"製品の設定" から各種リソースを作成する
 3.1 クライアントタブから "新たなクライアントポリシーを追加" をクリック
 3.2 ポリシーのタイプは "Peer2Peer" を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/59bd23ff-d8d1-c102-b250-1aca58648139.png)
 3.3 "新たなクライアントを追加" をクリック
 3.4 3.2 で作成したクライアントポリシーを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/e1684d5d-fee3-f08a-1449-2a183d401704.png)

1. Epic アカウントサービスを設定する
 4.1 Epic アカウントサービス詳細ページから、"アプリケーションを作成" をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/39189499-a07b-b404-f3b0-ed1961298c0e.png)
 4.2 "パーミッション"で、 "Online Presence", "Friends" を有効化
 4.3 "リンクされているクライアント"で、3 で作成したクライアントをリンク

ここまでで、EOS 側で必要な設定は完了です。
"製品の設定" ページから、OSS の設定に必要な各パラメータを一覧することが可能となっています。

実際にマーケットにリリースするゲームの場合は、Epic アカウントサービスでの "ブランドの設定" を完了する必要がありますが、今回のようなテスト利用であれば不要です。

# UE5 のソースを取得する
Lyra をパッケージ化する際にビルドプロセスに手を加えるため、Unreal Engine をソースコードからビルドする必要があります。
Perforce へのアクセス権を持っている方はそちらから、持っていない場合は GitHub からソースコードを入手可能です。

詳細な手順については、下記を参照してください。
https://docs.unrealengine.com/5.0/ja/downloading-unreal-engine-source-code/

#### ※GitHub からソースをダウンロードする場合の注意点
"ue5-main" ブランチの最新のソースコードを使うと、現時点でダウンロード可能なLyra (Apr 5, 2022) ではコンパイルエラーが発生します。
ブランチからではなく、tag "5.0.3-release" から zip もしくは tar.gz の形でダウンロードしてください。
https://github.com/EpicGames/UnrealEngine/releases/tag/5.0.3-release

# Visual Studio をインストール
ソースをビルドするために、Visual Studio の 2019 または 2022 をインストールしてください。
インストールする際に下記コンポーネントを含めるようにしてください。
- C++ profiling tools
- C++ AddressSanitizer (optional)
- Windows 10 SDK (10.0.18362 or newer)
- Unreal Engine Installer

なお、UnrealVS extension をインストールしておくと開発に便利です。
前項でダウンロードしたUE のソースフォルダ以下の、Engine\Extras\UnrealVS\ にインストーラがおいてあります。
詳細手順は下記を参照してください。
https://docs.unrealengine.com/5.0/ja/using-the-unrealvs-extension-for-unreal-engine-cplusplus-projects/

# Lyra をインストールする
#### Perforce からUE5 のソースをダウンロードした場合
Samples 以下に Lyra プロジェクトが存在しているので、こちらをビルドしてください。

#### GitHub からUE5 のソースをダウンロードした場合
別途Epic Games Launcher からLyra Starter Game をダウンロードする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/b10ead4e-2533-0471-3adb-4be7aa8385a2.png)


1. "Unreal Engine" => "Samples" から、Lyra Starter Game を選択
1. "Create Project" をクリック
1. インストールフォルダを、前項でダウンロードした UE のソースのルートフォルダにする
1. UE のルートフォルダで setup.bat を実行
1. UE のルートフォルダで GenerateProjectFiles.bat を実行
1. UE5.sln を Visual Studio で開く

ここまでの手順を完了するとVisual Studio のSolution Explore 上で、"Games" 以下に LyraStarterGame というプロジェクトが見えるようになっているはずですので、こちらをビルドしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/f3ad784a-d569-d967-89d4-59841b9d1ba0.png)


# EOS のパラメータを設定をする
Lyra には、EOS を利用するための設定がされている、専用のカスタムコンフィグがあります。
Config/Custom/EOS フォルダ以下に入っており、OnlineSubsystemEOS の有効化や、NetDriver の置き換えなどの設定が含まれています。

起動時の引数に "-customconfig=EOS" を指定することでこちらのコンフィグファイルから設定を読み込むようになります。

デフォルトではEOS のアーティファクト設定を書く行がコメントアウトされているため、下記行の先頭のコロン(;) を削除して、設定を有効にします。
 ***";+Artifacts=(ArtifactName=...”*** 

設定を有効化したあと、各種ID/Secret の値を EOS Developer Portal で作成したリソースの値に置き換えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/6aa3eb07-0d9b-f2c1-52ac-44715cc5f131.png)

# EOS Developer Authentication Toolの設定
ゲーム起動後に EOS へログインする方法は複数ありますが、今回は Developer Authentication Tool を利用します。
これは、ローカルで動作する Webサーバであり、本ツール上でEpic アカウントにログインすることで、ログインに必要な認証情報を HTTP を使って取得可能とするものです。

1. Developer Portal のSDK ページから、最新のEOS SDK をダウンロード
1. zip を展開
1. SDK\Tools\EOS_DevAuthTool-win32-x64-1.1.0.zip を更に展開
1. EOS_DevAuthTool.exe を起動

こちらのツールを起動すると、ローカルで動作するポートを指定するよう要求されるので、今回は 8080 としておきます。
その後、任意のEpic アカウントに対してログインし、認証情報を取得するための名前を指定してください。 (例では "Player1")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/c313ed36-25c4-ab45-8353-7294bd10e7dd.png)

# Lyra with EOS で起動する
Visual Studio 上で、コマンドラインに以下の引数を追加して、デバッグ実行してください。
(-AUTH_LOGIN のポート番号、-AUTH_PASSWORD のユーザ名は適宜前項で指定した値に書き換えてください)

***-game -customconfig=EOS   -AUTH_LOGIN=localhost:8080 -AUTH_PASSWORD=Player1 -AUTH_TYPE=developer***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/657732ed-94da-b974-5db6-7cc0b12574b8.png)

正しく設定されていれば、Lyra が無事に起動し、自動的にEOS へのログインが実行されます。
ログイン完了のポップアップが右上に表示されたあとは、"Shift + F3" で下記のようにソーシャルオーバレイを表示することができるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/ea5832f0-4c62-00bf-e5c2-d51f2dd9185c.png)

# LyraGameEOS のパッケージ化
デバッグ実行で問題なくEOS へのログインができるようになったら、LyraGameEOS をパッケージ化してみましょう。

1. Visual Studio の Command-line から、プロジェクト名以降の引数をすべて削除してからデバッグ実行して、Lyra プロジェクトをエディタで起動
1. "プラットフォーム" => "Windows" => から、ビルドターゲットに "LyraGameEOS" を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/b01dc6aa-359e-5913-9ef3-f4c693fdc0db.png)
1. "プラットフォーム" => "Windows" => "プロジェクトをパッケージ化" を選択し、適切な出力フォルダを指定

ビルドターゲットに "LyraGameEOS" を選択することで、引数として ***-CustomConfig=EOS*** が実行ファイルに埋め込まれた形でパッケージ化されます。

なお、パッケージ化したゲームは、認証情報を取得するために Developer Authentication Tool を動作させた上で起動する必要があります。
デバッグ実行と同様に、ゲームを起動時に適切な引数を渡すことで認証が可能となっています。
***-AUTH_LOGIN=localhost:8080 -AUTH_PASSWORD=Player1 -AUTH_TYPE=developer***


以上の手順で、Lyra のバックエンドとして EOS を利用することが可能となります。
指定する EOS リソース (ID/Secret)を揃えれば、インターネットを通じての対戦も出来ますので、是非試してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/535dd426-394c-5758-55f6-2f5243e7e459.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/f36c7b72-6d7c-f2a1-6dc1-1159cd6592cf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/6d6965c6-a878-149b-1c89-8f95dbc9c44c.png)



# Appendix: OnlineServices への置き換え
現在、UE5 ではOnlineSubsystem を改善した (BP対応、記述方法の簡易化、etc) OnlineServices プラグインが開発されています。
まだExperimental ではありますが、設定を変更することで CommonUser プラグインの中で、OnlineSubsystem の代わりに利用可能となっています。

Lyra で Online Services interface を利用する手順は以下になります。

1. LyraStarterGame\Plugins\CommonUser\Source\CommonUser\CommonUser.Build.cs で、 ***bUseOnlineSubsystemV1*** を false に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571320/0115f4f3-2dec-97e3-e754-b53e13cc6dbd.png)
1. Config/Custom/EOS 以下の DefaultEngine.ini で、OnlineSubsystemEOS を Disable する
 ```
 [OnlineSubsystemEOS]
 bEnabled=false

 [OnlineSubsystemEOSPlus]
 bEnabled=false
 ```
3. OSSv1 の設定をコメントアウトする
```
;For OSSv1, fill in the following line ...
;+Artifacts=...
```

4. [OnlineServices.EOS] の設定を有効化し、適切なEOS リソースを指定する。
(※ 5.0.3 のソースをダウンロードしている場合、"+" が[OnlineServices.EOS] の前にも入ってしまっているので削除してください)
```
;For OSSv2, fill in the following lines with actual details and then uncomment
[OnlineServices.EOS]
+ProductId=PRODUCTID
+SandboxId=SANDBOXID
+DeploymentId=DEPLOYTMENTID
+ClientId=CLIENTID
+ClientSecret=CLIENTSECRET
```

以上の設定変更で CommonUserSubsystem 内で OnlineSubsystemEOS ではなく OnlineServicesEOS プラグインが利用されるようになります。
ゲーム画面上は特に変わらないのですが、CommonUserSubsystem/CommonSessionSubsystem 等を見ると、実装の違いなどを確認できるかと思います。