関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2015.08.20UE4UE/ Network
こんにちは。初投稿の ほげたつ(@HogeTatu) です。
コンシューマーやiOS/Android、LAMP系のバックエンドを経験してからヒストリアに入社しました。
UE4はHTTP通信周りに関しても既に揃っているようなので、まずはそこの紹介からやっていきたいと思います。
HTTPとはクライアントとサーバー間で行うための通信プロトコルの一種です。
以下に示すのが基本の流れとなります。
iOS/Androidのゲームでは、サーバーにハイスコア等のゲームデータを保存したり、サーバー側で集計されたランキングデータを受け取ってゲーム画面に反映したり、様々な用途で使用されています。
レスポンスとして返されるデータのフォーマットとしてはJSONが主流となっていました。
最近はパケットのサイズを考慮し、バイナリ形式のフォーマットであるMessagePackを使うところも増えている印象です。
もちろんチート対策として暗号化を実施したりもします。
UE4では各プラットフォーム間でのインターフェースの差異を無くすために、HTTPモジュールとしてラッピングされ、プラットフォームネイティブな部分の実装が隠蔽されています。
モジュールは Engine/Source/Runtime/Online/HTTP 以下に展開されています。
上記モジュールはBlueprintから呼び出しできるような仕組みになっていないため、HTTP通信を行いたい場合はC++コードを記述しなければなりません。
これから以下の仕様で簡単なHTTP通信を実装していきます。
今回は PHP で簡単な echo プログラムを作成しました。
echo.php
これをサーバー上に配置します。
テスト用のサーバーがあれば問題無いですが、もし無ければ Vagrant + VirtualBox でローカルサーバーを立てたり、Heroku でクラウド上に構築したりするのも良いと思います。
「C++」&「Basic Code」でプロジェクトを作成します。
ターゲットの指定等は任意で構いません。
プロジェクトを作成し、Visual Studioからビルドしたら、エディタを起動してください。
以下の様に HttpRequester.h と HttpRequester.cpp を編集してください。
HttpRequester.h
HttpRequester.cpp
処理の流れに関してはコメントを参照してください。
また、 Http モジュール、Json モジュールを使用するために、プロジェクトの共通ヘッダ( [プロジェクト名].h )を開き、以下の処理を追記してください。
1 2 |
#include "Http.h" #include "Json.h" |
更に、各モジュールをリンクするために、プロジェクトファイル( [プロジェクト名.uproject] )を開き、以下の処理を記述してください。
1 2 3 4 5 |
"AdditionalDependencies": [ "Engine", "HTTP", "Json" ] |
それぞれ保存して Visual Studio でビルド後、レベルのBlueprintに以下の処理を記述します。
これでエディタ上から実行すると、画面にレスポンスのログが表示されます。
正常にGET通信の内容が出力されていますね。
ちなみにリクエストタイプの設定をGETからPOSTに変更したらレスポンスが変化します。
通信レスポンスは非同期に処理されるという点に注意してください。
上記 Blueprint 内の「Start Request」を実行しても、すぐには結果が表示されません。
前述した通り、一度サーバーにリクエストを送り、レスポンスが返ってくるまではレスポンスの内容がわからないため、多少のタイムラグはあります。
サーバーが高負荷になったり、通信経路上で遅延が発生した場合は待ちが長くなったり、サーバーまで届かないケースすら発生する可能性があります。
通信上のエラー処理としては、少なくとも以下のケースは想定するようにしてください。
面倒なのが、これに対してどう処理するのかがケースによって変わるという点です。
例えば 2 のケースだとそもそもサーバーまでリクエストが届いていないので、同じ内容のリクエストを再送すれば問題ありません。
ただし 3 のケースだとサーバー側は正常に処理されているので、再送されてしまうと問題がありますね。
(例えばポイントを加算するというリクエストを送った場合、二重に処理されて二倍ポイントが加算されてしまいます)
ひとまず再送し、サーバー側で同じリクエストを処理しないようにするという選択肢が有力ですが、少なからずクライアント側の対応も発生します。
通信でサーバーにパラメータを保存するといった場合は上記に関してお気をつけ下さい。
今回はUE4でHTTP通信を使うにあたっての基礎を書きました。
次回はもうちょっと具体的に中身がどうなっているのか、HttpManagerは何をやっているのかを書いていこうと思います。