Unreal Engine 4 Advanced Steam Sessionsを利用した通信方法

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
        Steamを利用した通信の為、Steamアカウントとログインが必須になります。
        ログアウトした状態では、ホストで作成したとしても、クライアント側では、
        サーバー情報が表示されません。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
        C++を使用する為、Visual Studioが必要になります。
        事前にVisual Studio 2019もしくは、Visual Studio 2022のインストールを済ませてください。
        C++によるデスクトップ開発の項目にチェックを入れる必要があります。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

---------------------------------------------------------------------------------------------
1.UnrealEngine4でC++プロジェクトを作成します
(もし、既存のプロジェクトに実装したい場合、
または、BluePrintプロジェクトで作成している場合は以下の手順で準備をします。
![Source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/66fb74d3-4a6a-d6b7-1e45-6861651c7116.png)
エクスプローラーでSourceフォルダを追加します。
![UE4_C++.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/6573080d-82bf-f097-611d-98ca8a527b96.png)
そして、プロジェクト(.uproject)で右クリックをしたら赤波線の
Generate Visual Studio project filesを左クリックします。

![GenerateProjectFile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/b12ff318-f8b7-d626-d861-159a19b556b7.png)
画像のようなウィンドウが表示されたら
![SlnFile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/e9a6a2af-987f-05b5-6b8d-607ad805ce04.png)
.slnファイルが追加されます。)

2.下記URLを左クリックして飛ぶか、「Advanced sessions binaries」を検索して、
下記画像のサイトにアクセスします。

https://vreue4.com/advanced-sessions-binaries
![Advanced sessions binaries.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/4f12a22c-1c65-c270-d61e-33b134627ef5.png)

サイトにアクセスしたら、下記画像のように、各バージョンのプラグインがあるので、
自分のバージョンのPluginをダウンロードして解凍します。
![Advanced sessions binaries Page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/b098fe0c-f7b4-9d4a-3b17-12cced8d3749.png)

解凍したファイルの中身は下記画像のようになっています。
仕様するファイルは「AdvancedSessions」「AdvancedSteamSessions」の2種類のみです。
![Advanced sessions binaries 4_27File.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/61209dab-ff8c-e0ff-9162-a9bbe47e0c01.png)

次に下記のサイトにアクセスして
https://docs.unrealengine.com/5.1/ja/online-subsystem-steam-interface-in-unreal-engine/
下記画像の部分のコードをコピーします。
![saite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/e2874e68-e027-1f24-f125-41f0a53af9ec.png)
コピーしたらConfig/DefaultEngine.iniのファイルの一番下にペーストし保存します。

3.Pluginsファイルを作成し、先ほどダウンロードした２つのファイルをコピーして貼り付けます。
![Plugins.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/f0be16a9-ae5b-eb60-d953-8ffd0a0c1c3e.png)

ファイルの中身はこんな感じになります。
![Plugins_File.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/18fc0013-b2b0-0833-c6cb-2155fc50165c.png)

4.先ほど作成した.slnファイルをVisualStudioで開きます。
下記画像の感じになっていると思うので、そのまま、ローカルWindowsデバッガーを左クリックします。
![Visual Studio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/ec29613a-b869-5f76-683e-6fb64b82cb02.png)
自分はプロジェクトを新規作成してビルド等をしていなかった為、.exeが見つからない等の
エラーが出ましたが、気にしなくて大丈夫です。

5.〇〇.uprojectを開きます。プラグインのウィンドウを開いて、インストール済みの中にある
「Advanced Sessions Plugin」の中身を見ます。
下記画像の状態であればOKです。
![UnrealProjectPlugin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/0cceed7d-d042-c6a9-d1fc-164cbbe5fc69.png)

6.マップを作成します(必要ないと感じた時には飛ばしてもらって大丈夫です)。
7.ウィジェットを２つ作成します。
中身は簡単に下記画像2つのようにしました。自由に変更してもらって大丈夫です。
下記画像の緑の枠は「verticalbox」です。もう一つのウィジェットを表示する為に使用します。
![W_Login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/240f1ba5-76a3-c957-4116-608a0d709705.png)
今回はサーバー名さえあればあとは改変が効くので下記画像のように簡単にしました。
「サーバー名：」と「サーバー」はそれぞれ別のテキストで「サーバー」だけは「Is variable」に
チェックを入れておきます。サーバー名を表示するのに、固定ではなく、可変にする為です。
![W_LoginInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/a90d33c0-b660-0ada-48d2-387b05b5e630.png)

8.ログイン画面にログインウィジェットを表示できるようにする。
ログイン画面の為のマップのレベルブループリントに下記画像のように設定します。
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/6dd12676-23f4-9592-cdd2-4cf28d095631.png)


9.ボタンの処理を追加する
まずは「ホストで参加」するボタンの処理を書いていきます。

下記画像のようにしてください。
「Open Level(by Object Reference)」のところのレベルは、
ゲームがプレイできるマップ等を設定してください。
そして下の△を押して開いた後、「Options」に「listen」と書き込んでください。
![host.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/72150433-294c-e3f8-a3de-9f710b8731ce.png)
次にclient側(サーバー一覧を更新して参加する側)の処理を書いていきます。
「Update Server」イベントを作成して、「Construct」とクリックされた時のイベントに繋げ、
「vertical Box」に「Is variable」を押して変数を用意し、「Clear Children」を表示し、
「Find Sessions Advanced」に繋げることで、サーバーを探す処理は完成します。
失敗した時、成功した時に更新しているのか、更新し終えたのかを表示する為に
「Print String」で画面に表示しています。
![client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/1e0bb65b-02d1-8adf-393c-ca4c05077591.png)

が、これでは、画面に表示されないので、ここでもう一つのウィジェットのグラフを作成します。
「Update」の中の「Result」と「Set」の「BPResult」は「BluePrint Session Result」型で作成します。
これでサーバーの名前を取得し、「サーバー」と書かれていたテキストが変更できるようになりました。
![join.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/59c16398-2cea-09a3-cb03-139c9eaaaa21.png)
これで参加ができるようになったので、もう一度client側のウィジェットに戻ります。
先程のブループリントに追加でこんな感じに繋ぎます。
これで、サーバーを更新した時に、表示されるようになりました。
![client_compleate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/8b19eba8-eca6-5f25-f564-17582579ad89.png)

10.実践
ここまで完成したら実際に動かしてみます。
プレイの横の下△を押して、プレイヤー数とネットモードを下記画像のように設定してください。
![play.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/772d33fc-e7bb-f8bd-1606-0fa5e6be7123.png)

では、プレイしてみます。
最初は誰もホストを作っていないのでどちらか片方が「ホストで参加」をクリックします。
![start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/bedec0f9-f986-3a19-363d-c856a517090b.png)

左側のウィンドウで入っているので、右側のウィンドウでサーバー名と参加のボタンが表示されました。
この状態でログイン画面のウィンドウで、参加をクリックします。
![play_Scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/6f9b126b-b5eb-3519-dec7-9c0247671b4a.png)
そうすると、互いの画面でプレイヤーが表示されます。
![play_sessions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/8ef5be36-aabe-f57a-273f-b73bd765a9b2.png)

11.パッケージ化する
ビルドコンフィギュレーションを開発になっているか確認してからパッケージ化してください。
![pakage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344915/b622ac88-934b-40d0-bb08-4999aead0776.png)

パッケージ化したファイルを別PCに送り、別々のsteamアカウントでログインしてから、起動し、
10で行った操作をすることで、PC間での通信ができるようになりました。

----------------------------------------------------------------------------------------------
# まとめ

steamを利用した通信方法はかなり便利な方法だが、steamのアカウントが２つ以上ないと、
検証ができないのがかなり厳しい通信方法だと感じた。
あと、プロジェクトの設定に時間が必要なこと、通信が重いと感じることがあること等、
気軽に通信を実装するのには便利だが、この通信方法を使ってオンラインゲームを作るにはやや
厳しいのかもと感じた。
ただ、もっと深く知っていけば、プラグイン側じゃなく、
Unreal Engine側で解決できる問題かもしれないから、
もっと研究していこうと思った。

----------------------------------------------------------------------------------------------