132.4K Views
May 12, 22
スライド概要
UNREAL FEST 2015 YOKOHAMAで登壇した際に発表した内容のスライドです。
UE4上でマルチプレイネットワークゲームを作るための入門的な内容となっております。
Unreal Fest 2015 Yokohama C++コードはいらない! UE4で作るお手軽マルチプレイ ネットワークゲームについて フリーランスゲームクリエイター コミュニティサポーター 中村 匡彦
自己紹介 名前 : 中村 匡彦 Twitterでは『@aizen76』でやっています。 8年ほどゲーム会社でゲームプログラマーやってました。 3DアクションゲームやMMORPGなど幅広く携わってきました。 アンリアルフェスでも毎回喋らせてもらっています。 趣味もゲームを遊び、ゲーム制作しつつイラストを描いたり。
今回のテーマは… ネットワークとマルチプレイヤー!
UE4のネットワークについて クライアント・サーバーモデルを採用。 Client ただしUE4はエンジンがクライアント、 サーバー両方をこなせる仕組みを持つ。 Server Client Client
UE4のネットワークについて 最初からエンジンコアの部分でネットワークに 対応する設計になっているので、シングルプレイヤーから マルチプレイヤーにするのも比較的簡単。 更にC++コードを書かなくてもブループリントのみで、 マルチプレイヤーゲームが作れるように配慮されています。
サーバーについて ネットワークにおける最高権限を持ち、 ゲームプレイフローを管理します。 クライアントはサーバーにログインしてから、 あらゆる情報に従う必要があります。 ListenサーバーモードとDedicatedサーバーモードがあり。 どちらの手段であっても役割自体は同じ。
Listenサーバーモード クライアントと同じようにゲームプレイを行なう事が可能。 サーバー機能を有しつつもクライアントのように動作する。 見た目にも動作がわかりやすく、テストプレイもしやすい。 特に問題がなければListenサーバーモードで。
Dedicatedサーバーモード いわゆる完全なサーバー専用モード。 クライアントのような画面はなく、コマンドプロンプトの ような真っ黒い画面上でも動作する。 最低限のリソースで動作し、クライアントを処理するのに フルスペックで動作するので比較的大規模なネットワークの マルチプレイヤー向けのモード。
クライアントについて サーバーにログインして、各々の見た目の部分を担当する。 ゲームロジックの処理はサーバー側にお任せ。 ただし、自分がコントロールするPlayerControllerの情報を 逐次サーバー側へと送信してあげる必要あり。 これをしないとサーバーとそれぞれのクライアント上で 自分の情報が反映されなくなってしまう。
サーバーへのログイン(その1) サーバー側でレベルを起動する際にオプションを渡すと、 Listenモードで起動するので、そこにクライアントは IPアドレスを指定してログインする。 LANを使っての場合は、LANオプションを指定。 WANの場合はオプションはいらないが、繋ぎにいく側の UDPポート(デフォルトでは7777)を開放する必要あり。
サーバーへのログイン(その1) Listenサーバーを実行 クライアントのログイン
サーバーへのログイン(その2) UE4に用意されている『オンラインサブシステム』を使う。 これはプラットフォーム(Steam等)毎に用意されている、 オンライン機能をUE4用にラッピングして使えるようなっている。 セッション(ルームとも言う)作成、検索、参加、破棄を 簡単に行なう事ができ、マッチングシステムを提供。 エラーハンドリングまで簡単にできます。
サーバーへのログイン(その2)
Play In Editorの場合 レベルを実行した時点で複数プレイヤーを ログインさせた状態でいきなり実行可能! 実行時にサーバーとクライアントを それぞれ自動に振り分け。 Playボタン横から選択可能なメニューで プレイヤー数を設定しておきます。
1つのPC上で即マルチプレイ!
レプリケーションについて
レプリケーションとは? サーバーがクライアントに対してネットワークを通じて、 情報をレプリケート(複製)する事によって、 クライアント間で差異が生じないように同期する。 これをネットワークレプリケーションと呼び、 UE4では何をレプリケートするかを選択する事が可能。
アクターのレプリケーション 基本はアクターに対してレプリケートを行ない、 多くのアクターではデフォルトでレプリケート設定になっている。 レプリケートがオンになっていると 自動的にアクターの動き等が 同期されるようになっている。
レプリケート権限 レプリケーションはサーバーのみが行なう事ができます。 クライアントはサーバーに対してレプリケーションして 欲しい情報を送信する必要あり。 つまりサーバーとクライアントか判断してロジックを 変更して動かしてあげる必要がある。
Switch Has Authorityマクロ サーバーと クライアントを 判断するマクロ。 ロジック分岐の際に 多用します。
アクター所有権限 基本的にアクターはサーバーでスポーンしますが、 例外的にクライアント上でアクターをスポーンした場合、 クライアントがアクターの所有権を持つ。 クライアント上のアクターはレプリケートされないので、 ロジックやダイナミクスを含むアクターは基本的にサーバー上で スポーンしておく事をオススメします。
変数のレプリケーション ブループリント上で変数を作った場合には、 プロパティの設定ひとつでレプリケーション可能。 単純なレプリケーションの他に、 変数値が変更された場合のイベント通知も可能。 この場合にはサーバーとクライアント双方に送信される。
Replicated 最も単純な変数のレプリケーション。 設定をすると、変数値の変更は 自動的にサーバーからクライアントへ レプリケートされる。 クライアント上の変数値は一度 サーバーに送信してからレプリケートする。
RepNotify Replicatedと同様の設定方法で使用可能。 選択すると自動的に『OnRep_<変数名>』 という関数が自動的に追加。 中身は自由に実装が可能で、該当名の変数値が変更される度に この関数がイベントのように呼び出されるようになる。
RPC(リモートプロシージャコール)
RPCとは? ネットワークの先にある環境で関数やイベントを実行する事。 UE4では標準で3つの呼び出し方法が存在。 ブループリントではカスタムイベントを作成して使用する。 デフォルトでは『Not Replicated(複製なし)』 になっているので、必要に応じて設定する。
Multicast 呼び出しをサーバーで行なうと 全てのクライアントで処理が実行。 最も一般的なRPCイベント。 (Server to Client) クライアントで呼び出しても、 クライアント内でしか処理されない。
Run on Server 呼び出しをクライアントで行なうと サーバー上で実行される。 ただしアクターの所有権が必要。 (Client to Server) サーバー上で呼び出しても、 クライアント上へレプリケートしない。
Run on Owning Client サーバーから呼び出した場合に、 アクター所有権のあるクライアント上 でのみ実行される特殊なRPCイベント。 (Server to Client) クライアントで呼び出しても、 クライアント内でしか処理されない。
RPC使い分け 『Multicast』はサーバーから全てのクライアントで 同期する際に一番最も頻繁に使用する。 『Run on Server』はクライアントからサーバー上へ何かしら 情報を通知したい場合に使用し、変数値を同期させる 場合にも使用するので非常に重要。 サーバー上で変数値を反映させれば自動的にレプリケートされる。
RPC使い分け 『Run on owning Client』は最も特殊で、 アクター所有権を自分で管理しておく必要あり。 つまり、サーバーはそのアクターを誰が所有しているのかを 理解しておく必要があり、特定クライアントに対してのみの RPCイベントを行なう際にはこの仕組みを使用します。 またサーバーがアクター所有権を持っている場合もあり、 その場合には名前に反してサーバー上で実行されます。
アクター所有権の確認 自分がそのアクターを所有しているのか確認する際には、 Pawnの場合には『Is Locally Controlled』を、 PlayerControllerは『Is Local Player Controller』を使用します。
Reliability (信頼性) RPCには『Reliable』というプロパティがあり、 通信の信頼性を向上させる事が出来ます。 ただし、Reliableを設定すると通信帯域幅をより多く消耗し、 レイテンシーが大きくなる可能性があり、 リアルタイムマルチプレイゲームには向きません。 逆にパケットロスの可能性は大きくなります。
通信パフォーマンス最適化 『Net Cull Distance Squared』は、 アクターのレプリケーションが届く範囲を 設定し遠距離の不要な通信しなくなる。 『Net Update Frequency』は通信の更新頻度 を設定する事が可能で少ないと通信も より少ない通信量で行なう事が出来るように。 『Net Priority』は通信混雑時の優先度。
マルチプレイヤー化 実演
マルチプレイヤー化 元々シングルプレイヤーなゲームを マルチプレイヤーへとライブノーディングしていきます! 今回使用するのはFPテンプレートを少し改造したもの。 デフォルトではシングルプレイヤーですが、 簡単にマルチプレイヤーへと変化します!
マルチプレイヤー化 ゲームジャンルによっては、すぐにシングルプレイヤーを マルチプレイヤーに出来る事がわかったと思います。 UE4はこれだけの事がブループリントのみでもいけます! もちろんC++を使えばもっと奥深い事も可能です。
その他 ネットワークやオンライン周り
パッチやDLC 4.8からその機能自体は存在。 あまり情報はないですが、少しずつ資料が増量中。 DLCというよりもMODやUGCとして扱われているようです。 https://wiki.unrealengine.com/Modding:_Adding_modsupport_to_your_Unreal_Engine_4_project サンプルプロジェクト https://github.com/tomlooman/ModSampleGame
コミュニティでの実績 UE4のフォーラムでMMOを作るためのキットも 実際に販売されています。 MMO Starter Kit https://forums.unrealengine.com/showthread.php?53208MMO-Starter-Kit バックエンドサーバーにPHPを使用し、MySQLをDBに使用。 既にリリースされているタイトルもあり。
コミュニティでの実績 UE4をマスターサーバー化するプラグイン。 Master Server with Unreal Engine 4 Plugin https://forums.unrealengine.com/showthread.php?73739Master-Server-with-Unreal-Engine-4-Plugin シンプルにサーバーを登録し、オンラインサブシステムなしで 複数サーバーを管理する事が出来るように。 UE4だけでサーバー管理が出来るようになるかも…?
コミュニティでの実績 HTTP通信をブループリントで実現するプラグイン。 VaRest https://forums.unrealengine.com/showthread.php?13509Plugin-Http-s-REST-blueprintable-JSON-and-Parse-REST-APImanager-at-once-(VaRest) JSON Query https://forums.unrealengine.com/showthread.php?7045PLUGIN-JSON-Query
コミュニティでの実績 日本でもプラグインを作って公開している人も!! UE4でBlueprint上からHTTP通信を行うWebApiプラグインを公開しました http://hogetatu.hatenablog.com/entry/2015/08/17/134731
コミュニティでの実績 日本ではTwitterプラグインを作っている人もいます! Twitter4UE http://blog.cnu.jp/2015/08/27/twitter-plugin-for-ue4/ Pull Requestも歓迎らしいので、 気になる人は改良して送ってみよう!
まとめ UE4はネットワーク周りも相当充実しています。 面倒くさいRPC周りも設定をメニューからするだけ! あまりにも簡単にネットワーク対応が出来るの驚き。 スマホであればHTTP通信さえ出来れば十分なゲームもあるはず。 さぁUE4使いの皆さん。マルチプレイゲーム作ってみませんか?