C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて...

45
C++ ココココココココ UE4 ココココココココココココ コココココココココココココ Unreal Fest 2015 Yokohama コココココココココココココココ コココココココココココ ココ ココ

Transcript of C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて...

Page 1: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

C++ コードはいらない!UE4 で作るお手軽マルチプレイネットワークゲームについて

Unreal Fest 2015 Yokohama

フリーランスゲームクリエイターコミュニティサポーター

 中村 匡彦

Page 2: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

自己紹介

名前 : 中村 匡彦

Twitter では『 @aizen76 』でやっています。

8 年ほどゲーム会社でゲームプログラマーやってました。

3D アクションゲームや MMORPG など幅広く携わってきました。

アンリアルフェスでも毎回喋らせてもらっています。

趣味もゲームを遊び、ゲーム制作しつつイラストを描いたり。

Page 3: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

今回のテーマは…

ネットワークとマルチプレイヤー!

Page 4: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

UE4 のネットワークについて

Server

Client

Client

Client

クライアント・サーバーモデルを採用。

ただし UE4 はエンジンがクライアント、サーバー両方をこなせる仕組みを持つ。

Page 5: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

UE4 のネットワークについて

最初からエンジンコアの部分でネットワークに

対応する設計になっているので、シングルプレイヤーから

マルチプレイヤーにするのも比較的簡単。

更に C++ コードを書かなくてもブループリントのみで、

マルチプレイヤーゲームが作れるように配慮されています。

Page 6: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

サーバーについて

ネットワークにおける最高権限を持ち、

ゲームプレイフローを管理します。

クライアントはサーバーにログインしてから、

あらゆる情報に従う必要があります。

Listen サーバーモードと Dedicated サーバーモードがあり。

どちらの手段であっても役割自体は同じ。

Page 7: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Listen サーバーモード

クライアントと同じようにゲームプレイを行なう事が可能。

サーバー機能を有しつつもクライアントのように動作する。

見た目にも動作がわかりやすく、テストプレイもしやすい。

特に問題がなければ Listen サーバーモードで。

Page 8: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Dedicated サーバーモード

いわゆる完全なサーバー専用モード。

クライアントのような画面はなく、コマンドプロンプトの

ような真っ黒い画面上でも動作する。

最低限のリソースで動作し、クライアントを処理するのに

フルスペックで動作するので比較的大規模なネットワークの

マルチプレイヤー向けのモード。

Page 9: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

クライアントについて

サーバーにログインして、各々の見た目の部分を担当する。

ゲームロジックの処理はサーバー側にお任せ。

ただし、自分がコントロールする PlayerController の情報を

逐次サーバー側へと送信してあげる必要あり。

これをしないとサーバーとそれぞれのクライアント上で

自分の情報が反映されなくなってしまう。

Page 10: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

サーバーへのログイン(その 1 )

サーバー側でレベルを起動する際にオプションを渡すと、

Listen モードで起動するので、そこにクライアントは

IP アドレスを指定してログインする。

LAN を使っての場合は、 LAN オプションを指定。

WAN の場合はオプションはいらないが、繋ぎにいく側の

UDP ポート(デフォルトでは 7777 )を開放する必要あり。

Page 11: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

サーバーへのログイン(その 1 )

クライアントのログインListen サーバーを実行

Page 12: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

サーバーへのログイン(その 2 )

UE4 に用意されている『オンラインサブシステム』を使う。

これはプラットフォーム( Steam 等)毎に用意されている、

オンライン機能を UE4 用にラッピングして使えるようなっている。

セッション(ルームとも言う)作成、検索、参加、破棄を

簡単に行なう事ができ、マッチングシステムを提供。

エラーハンドリングまで簡単にできます。

Page 13: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

サーバーへのログイン(その 2 )

Page 14: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Play In Editor の場合

レベルを実行した時点で複数プレイヤーを

ログインさせた状態でいきなり実行可能!

実行時にサーバーとクライアントを

それぞれ自動に振り分け。

Play ボタン横から選択可能なメニューで

プレイヤー数を設定しておきます。

Page 15: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

1 つの PC 上で即マルチプレイ!

Page 16: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

レプリケーションについて

Page 17: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

レプリケーションとは?

サーバーがクライアントに対してネットワークを通じて、

情報をレプリケート(複製)する事によって、

クライアント間で差異が生じないように同期する。

これをネットワークレプリケーションと呼び、

UE4 では何をレプリケートするかを選択する事が可能。

Page 18: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

アクターのレプリケーション

基本はアクターに対してレプリケートを行ない、

多くのアクターではデフォルトでレプリケート設定になっている。

レプリケートがオンになっていると

自動的にアクターの動き等が

同期されるようになっている。

Page 19: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

レプリケート権限

レプリケーションはサーバーのみが行なう事ができます。

クライアントはサーバーに対してレプリケーションして

欲しい情報を送信する必要あり。

つまりサーバーとクライアントか判断してロジックを

変更して動かしてあげる必要がある。

Page 20: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Switch Has Authority マクロ

サーバーと

クライアントを

判断するマクロ。

ロジック分岐の際に

多用します。

Page 21: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

アクター所有権限

基本的にアクターはサーバーでスポーンしますが、

例外的にクライアント上でアクターをスポーンした場合、

クライアントがアクターの所有権を持つ。

クライアント上のアクターはレプリケートされないので、

ロジックやダイナミクスを含むアクターは基本的にサーバー上で

スポーンしておく事をオススメします。

Page 22: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

変数のレプリケーション

ブループリント上で変数を作った場合には、

プロパティの設定ひとつでレプリケーション可能。

単純なレプリケーションの他に、

変数値が変更された場合のイベント通知も可能。

この場合にはサーバーとクライアント双方に送信される。

Page 23: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Replicated最も単純な変数のレプリケーション。

設定をすると、変数値の変更は

自動的にサーバーからクライアントへ

レプリケートされる。

クライアント上の変数値は一度

サーバーに送信してからレプリケートする。

Page 24: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

RepNotifyReplicated と同様の設定方法で使用可能。

選択すると自動的に『 OnRep_<変数名 > 』

という関数が自動的に追加。

中身は自由に実装が可能で、該当名の変数値が変更される度に

この関数がイベントのように呼び出されるようになる。

Page 25: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

RPC( リモートプロシージャコール )

Page 26: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

RPC とは?

ネットワークの先にある環境で関数やイベントを実行する事。

UE4 では標準で 3 つの呼び出し方法が存在。

ブループリントではカスタムイベントを作成して使用する。

デフォルトでは『 Not Replicated( 複製なし ) 』

になっているので、必要に応じて設定する。

Page 27: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Multicast呼び出しをサーバーで行なうと

全てのクライアントで処理が実行。

最も一般的な RPC イベント。

(Server to Client)

クライアントで呼び出しても、

クライアント内でしか処理されない。

Page 28: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Run on Server呼び出しをクライアントで行なうと

サーバー上で実行される。

ただしアクターの所有権が必要。

(Client to Server)

サーバー上で呼び出しても、

クライアント上へレプリケートしない。

Page 29: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Run on Owning Clientサーバーから呼び出した場合に、

アクター所有権のあるクライアント上

でのみ実行される特殊な RPC イベント。

(Server to Client)

クライアントで呼び出しても、

クライアント内でしか処理されない。

Page 30: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

RPC 使い分け

『 Multicast 』はサーバーから全てのクライアントで

同期する際に一番最も頻繁に使用する。

『 Run on Server 』はクライアントからサーバー上へ何かしら

情報を通知したい場合に使用し、変数値を同期させる

場合にも使用するので非常に重要。

サーバー上で変数値を反映させれば自動的にレプリケートされる。

Page 31: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

RPC 使い分け

『 Run on owning Client 』は最も特殊で、

アクター所有権を自分で管理しておく必要あり。

つまり、サーバーはそのアクターを誰が所有しているのかを

理解しておく必要があり、特定クライアントに対してのみの

RPC イベントを行なう際にはこの仕組みを使用します。

またサーバーがアクター所有権を持っている場合もあり、

その場合には名前に反してサーバー上で実行されます。

Page 32: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

アクター所有権の確認

自分がそのアクターを所有しているのか確認する際には、

Pawn の場合には『 Is Locally Controlled 』を、

PlayerController は『 Is Local Player Controller 』を使用します。

Page 33: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

Reliability ( 信頼性 )RPC には『 Reliable 』というプロパティがあり、

通信の信頼性を向上させる事が出来ます。

ただし、 Reliable を設定すると通信帯域幅をより多く消耗し、

レイテンシーが大きくなる可能性があり、

リアルタイムマルチプレイゲームには向きません。

逆にパケットロスの可能性は大きくなります。

Page 34: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

通信パフォーマンス最適化

『 Net Cull Distance Squared 』は、

アクターのレプリケーションが届く範囲を

設定し遠距離の不要な通信しなくなる。

『 Net Update Frequency 』は通信の更新頻度

を設定する事が可能で少ないと通信も

より少ない通信量で行なう事が出来るように。

『 Net Priority 』は通信混雑時の優先度。

Page 35: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

マルチプレイヤー化 実演

Page 36: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

マルチプレイヤー化

元々シングルプレイヤーなゲームを

マルチプレイヤーへとライブノーディングしていきます!

今回使用するのは FP テンプレートを少し改造したもの。

デフォルトではシングルプレイヤーですが、

簡単にマルチプレイヤーへと変化します!

Page 37: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

マルチプレイヤー化

ゲームジャンルによっては、すぐにシングルプレイヤーを

マルチプレイヤーに出来る事がわかったと思います。

UE4 はこれだけの事がブループリントのみでもいけます!

もちろん C++ を使えばもっと奥深い事も可能です。

Page 38: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

その他ネットワークやオンライン周り

Page 39: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

パッチや DLC4.8 からその機能自体は存在。

あまり情報はないですが、少しずつ資料が増量中。

DLC というよりも MOD や UGC として扱われているようです。

https://wiki.unrealengine.com/Modding:_Adding_mod-support_to_your_Unreal_Engine_4_projectサンプルプロジェクト

https://github.com/tomlooman/ModSampleGame

Page 40: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

コミュニティでの実績

UE4 のフォーラムで MMO を作るためのキットも

実際に販売されています。

MMO Starter Kithttps://forums.unrealengine.com/showthread.php?53208-MMO-Starter-Kitバックエンドサーバーに PHP を使用し、 MySQL を DB に使用。

既にリリースされているタイトルもあり。

Page 41: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

コミュニティでの実績

UE4 をマスターサーバー化するプラグイン。

Master Server with Unreal Engine 4 Pluginhttps://forums.unrealengine.com/showthread.php?73739-Master-Server-with-Unreal-Engine-4-Pluginシンプルにサーバーを登録し、オンラインサブシステムなしで

複数サーバーを管理する事が出来るように。

UE4 だけでサーバー管理が出来るようになるかも…?

Page 43: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

コミュニティでの実績

日本でもプラグインを作って公開している人も!!

UE4 で Blueprint 上から HTTP 通信を行う WebApi プラグインを公開しました

http://hogetatu.hatenablog.com/entry/2015/08/17/134731

Page 44: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

コミュニティでの実績

日本では Twitter プラグインを作っている人もいます!

Twitter4UEhttp://blog.cnu.jp/2015/08/27/twitter-plugin-for-ue4/

Pull Request も歓迎らしいので、

気になる人は改良して送ってみよう!

Page 45: C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて

まとめ

UE4 はネットワーク周りも相当充実しています。

面倒くさい RPC周りも設定をメニューからするだけ!

あまりにも簡単にネットワーク対応が出来るの驚き。

スマホであれば HTTP 通信さえ出来れば十分なゲームもあるはず。

さぁ UE4 使いの皆さん。マルチプレイゲーム作ってみませんか?