C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて...
-
Upload
masahiko-nakamura -
Category
Engineering
-
view
44.824 -
download
4
Transcript of C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて...
C++ コードはいらない!UE4 で作るお手軽マルチプレイネットワークゲームについて
Unreal Fest 2015 Yokohama
フリーランスゲームクリエイターコミュニティサポーター
中村 匡彦
自己紹介
名前 : 中村 匡彦
Twitter では『 @aizen76 』でやっています。
8 年ほどゲーム会社でゲームプログラマーやってました。
3D アクションゲームや MMORPG など幅広く携わってきました。
アンリアルフェスでも毎回喋らせてもらっています。
趣味もゲームを遊び、ゲーム制作しつつイラストを描いたり。
今回のテーマは…
ネットワークとマルチプレイヤー!
UE4 のネットワークについて
Server
Client
Client
Client
クライアント・サーバーモデルを採用。
ただし UE4 はエンジンがクライアント、サーバー両方をこなせる仕組みを持つ。
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最も単純な変数のレプリケーション。
設定をすると、変数値の変更は
自動的にサーバーからクライアントへ
レプリケートされる。
クライアント上の変数値は一度
サーバーに送信してからレプリケートする。
RepNotifyReplicated と同様の設定方法で使用可能。
選択すると自動的に『 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++ を使えばもっと奥深い事も可能です。
その他ネットワークやオンライン周り
パッチや DLC4.8 からその機能自体は存在。
あまり情報はないですが、少しずつ資料が増量中。
DLC というよりも MOD や UGC として扱われているようです。
https://wiki.unrealengine.com/Modding:_Adding_mod-support_to_your_Unreal_Engine_4_projectサンプルプロジェクト
https://github.com/tomlooman/ModSampleGame
コミュニティでの実績
UE4 のフォーラムで MMO を作るためのキットも
実際に販売されています。
MMO Starter Kithttps://forums.unrealengine.com/showthread.php?53208-MMO-Starter-Kitバックエンドサーバーに PHP を使用し、 MySQL を DB に使用。
既にリリースされているタイトルもあり。
コミュニティでの実績
UE4 をマスターサーバー化するプラグイン。
Master Server with Unreal Engine 4 Pluginhttps://forums.unrealengine.com/showthread.php?73739-Master-Server-with-Unreal-Engine-4-Pluginシンプルにサーバーを登録し、オンラインサブシステムなしで
複数サーバーを管理する事が出来るように。
UE4 だけでサーバー管理が出来るようになるかも…?
コミュニティでの実績
HTTP 通信をブループリントで実現するプラグイン。
VaResthttps://forums.unrealengine.com/showthread.php?13509-Plugin-Http-s-REST-blueprintable-JSON-and-Parse-REST-API-manager-at-once-(VaRest)JSON Queryhttps://forums.unrealengine.com/showthread.php?7045-PLUGIN-JSON-Query
コミュニティでの実績
日本でもプラグインを作って公開している人も!!
UE4 で Blueprint 上から HTTP 通信を行う WebApi プラグインを公開しました
http://hogetatu.hatenablog.com/entry/2015/08/17/134731
コミュニティでの実績
日本では Twitter プラグインを作っている人もいます!
Twitter4UEhttp://blog.cnu.jp/2015/08/27/twitter-plugin-for-ue4/
Pull Request も歓迎らしいので、
気になる人は改良して送ってみよう!
まとめ
UE4 はネットワーク周りも相当充実しています。
面倒くさい RPC周りも設定をメニューからするだけ!
あまりにも簡単にネットワーク対応が出来るの驚き。
スマホであれば HTTP 通信さえ出来れば十分なゲームもあるはず。
さぁ UE4 使いの皆さん。マルチプレイゲーム作ってみませんか?