イベントが呼び出されない!!」2017.11.22皆様、こんにちは!4月に入社し、もう半年も経ちました!エンジニアの山口です。詰まったところとその解決策を紹介しようと思います。詰まったところと言うと、タイトルにもある通りUE4での通信を実装する際に、ホストにゲストが接続する処理がありますが、そこでホスト側でコールバックとして呼ばれるOnPostLoginというものが呼び出されない問題です。SubsystemのSessionについて調べたことを記載しています。Subsystemというものを使いました。SubsystemとはUE4が提供しているマルチプラットフォームに対応しているオンライン機能です。マルチプラットフォーム対応と書いてありますが、公式サイトには「全てのプラットフォームのインターフェースを実装しているとは限らない」と記載されていますので注意が必要です。以前UE4のネットワーク機能を少しだけ触ったことがあるのですが、ゲストはOpenLevelノードを使いホストに接続していた記憶があります。SubsystemのSession機能を初めて使いましたが、OpenLevelでホストに接続を自分で行わなくてもよくなっていて、簡単になったなと感じました。SubsystemのSession機能は何をしてくれるのかと言うとマッチメイキングをしてくれる機能です。Steamを使用している上記を前提のもと書きます。イベントが呼び出されないOnPostLoginというのはホストがゲストに接続した時にホスト側で、ゲストが正常に接続した時に呼ばれるものです。上記の順番に処理された場合に呼び出されるようになっています。Failedとなっていました。Failedとなっては、失敗しているわけですから、当然OnPostLogin(ログイン後の処理)は呼び出されるはずが無いですね......・そもそもOnPostLoginを呼び出すためには何をしているの?エンジンコードではPostLoginという関数でホスト側で処理されています。PostLoginはその名の通りログインの後という意味です。PostがあるということはPreLoginもあります。PreLoginではユーザの受け入れの可否を判定される処理となっています。LoginではPlayerControllerを生成し、UE4のGameSessionに登録し、ワールド内にあるPlayerStartオブジェクトを検索し、空いている場所から順にPlayerのポジションを決めることをしています。共有オブジェクトの初期化などが行われています。UE4内部ではOnPostLoginを呼び出すまでにこのような処理が行われており、めんどくさいところをやってもらえていますが、問題が起こってから原因を探すのに時間がかかってしまいました。SubsystemのSessionに関する公式サイトを貼っておきます。今回はCreate、Find、Joinの説明をします。サーバアクセス、ホストへのアクセスなどが大まかに分かるようにシーケンス図を作成したので、貼っておきます。(クリックして頂くとキレイに見れるかと思います)CreateSessionで(Sessionを作成します)1.NamedOnlineSessionにSessionの設定を行います。→接続できる人数、SessionのOwnerID・OwnerNameなどが設定2.マッチングサーバへリクエストを行います。3.ホスト側でOnCreateCompletedがコールバックで呼ばれSessionNameと成功失敗が返ってきます。4.成功の場合はStartSessionを呼びマッチングサーバへSessionのスタートリクエストを送っていました。FindSessionで(Sessionを検索します)1.Sessionを検索する情報を設定し、マッチングサーバにリクエストを送ります。→Sessionの検索件数、LANなのかInternet経由なのかも設定、その他いくつか設定2.マッチングサーバに検索リクエストを送ります。→自分のUserID(プラットフォームによって変わる)と検索するためのOnlineSessionSearchを使い設定3.コールバックでゲスト側でOnCompletedが呼ばれリクエストの成功失敗の判定をしています。4.その後JoinSessionへと続きます。JoinSessionは(Sessionに参加します)1.FindSessionで返されてきたSessions内の任意のSessionを選択します。2.選択したSession情報を使用し、JoinSessionリクエストをマッチングサーバへ送ります。3.コールバックとしてゲスト側でOnCompletedが呼ばれ、SessionNameとResultが返ってきます。4.ゲストのPlayerControllerのClientTravelが呼ばれホストのワールドへ接続します。→ClientTravel内ではPreClientTravelでクリーンアップやその他のタスクを実行できるようオーバーライドすることもできます。※この時ホストではログイン処理が行われ上記に書いているログイン処理がされるということです。SubsystemのSession......ネットワークマッチングがあっというまにできるのでありがたいです。多少自分で手を加えないと検索できないようなので注意です。・まとめUE4でネットワークを実装中にOnPostLoginのトリガーで何か処理を書いている際に、その処理が動いてないようでしたら、PlayerControllerが生成されているのか確認してみてください。SubsystemのSessionとLoginについて書きましたが、ここまで理解するのに意外と時間を費やしてしまいました。大半がインターネットで調べることはなくエンジンのコードを読んで勉強しつつでした。調査、エンジンコードを読むのにかなりの時間を費やしてしまいます。調べてそれらしきものを見つけるが、情報が古かったりなど使えないことも多々あります。記事を読むのにも苦労してしまいます。