SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
PUBGライクなゲームを
Unityだけで早く確実に作る方法
〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
(株)モノビット
取締役CTO 中嶋謙互
2018年3月
ゲーム開発の大原則
いつでもプレイできる状態を保って
開発を続けるべし。
「プレイできる状態」とは?
• 100人用ゲームだけど、最初は1人用で作ります。
(だから、マルチプレイはできません)
• 最初からマルチプレイできる状態で作るけど、Unityを何個も立ち上げたり
するのがめんどくさいので、だいたい1人でプレイしてるだけ。
(気付いてない未実装部分がじわじわたまっていく)
• NPCを100体出して、1人プレイでも襲撃されるようにしました。
(でも、ネットワークは一切使ってない。。正直いって後がこわい)
「プレイできる状態」とは?
• 開発の最初から、ゲームサーバーに100クライアントが接続して、対戦し
ている状態を作って実装を続けれるのが理想
• 本番用コードと構造がまったく同じ状態
今日は、実際にこの手順で作る方法を解説し、
それがどれぐらいめんどくさ(くな)いのかを紹介します。
実際に作って説明します
「爆弾バトルロイヤルゲーム」
爆弾バトル サーバー接続前
この立派なカプセルがあなた自身なのです!
爆弾バトル サーバー接続後
爆弾バトル 俯瞰視点
爆弾バトル 複数起動PvP
ゲーム内容 : 爆弾をなげるだけ
クリックして爆弾を投げて、敵を吹き飛ばすだけ!
ダメージ判定はあるけど勝敗判定とかはありません
爆弾
爆風
ゲーム内容 : 自分以外はすべて敵
自分の爆風:オレンジで表示
自分以外の爆風:青で表示
自分は白カプセル
自分以外は赤カプセル
1 動作確認手順
1.ゲームサーバー(mrs_room)を起動する
2.Unityを起動する
3. 1人目はStart Room Client Ownerボタンを押す
(2人目以降は Join a Room ボタンを押す)
4.Add 1 Dummy Playerボタンを押す
(Add 100 Dummy Playerボタンで100人を一気に追加する)
デモ
• 出力した実行形式を使用
ネットワーク構成
LocalPlayer
mrs_room
サーバー
Unity (ダミークライアントあり)
RemotePlayer
RemotePlayer
DummyPlayer
・・・
SampleBattleClient
MrsConnection
DummyPlayer
MrsConnection
MrsConnection
・・・
更新
TCP
LocalPlayer
Unity (ダミークライアントなし)
SampleBattleClient
MrsConnection
更新
更新
RemotePlayer
RemotePlayer
・・・
更新
Input
Input
これが
ダミープレイヤー
本番用のコード構成とまったく同じ
LocalPlayer
mrs_room
サーバー
Unity (ダミークライアントあり)
RemotePlayer
RemotePlayer
DummyPlayer
・・・
SampleBattleClient
MrsConnection
DummyPlayer
MrsConnection
MrsConnection
・・・
更新
TCP
LocalPlayer
Unity (ダミークライアントなし)
SampleBattleClient
MrsConnection
更新
更新
RemotePlayer
RemotePlayer
・・・
更新
Input
Input
これが
ダミープレイヤー
mrs_roomサーバーの基本コマンド
• CREATE : データリレーの単位となる「部屋」を新規作成
• JOIN : 部屋に参加する
• LEAVE : 部屋から離脱する(ゲーム終了)
• SET_OWNER : 部屋の所有者であることを宣言
• BROADCAST : 部屋にいる全員に送信
• OWNERCAST : 部屋の所有者のみに送信
• MULTICAST : 部屋にいる複数人に送信
• NEARCAST : 部屋にいる「近い人」だけに送信
• UNICAST : 部屋にいる一人のみに送信
UNICASTが重要なのであとでくわしく解説
爆弾バトルゲームの独自コマンド
• PING : 通信の遅延時間を測定
• PING(UInt32 t) tは、Time.timeを1000倍した値
• SYNC_POS : キャラクターの位置を同期する
• SYNC_POS(Int32 x, Int32 z) x,zは位置の座標を1000倍した値
• SHOOT : 爆弾を投げる
• SHOOT(Int32 vx, Int32 vy, Int32 vz ) vx,vy,vzは爆弾の速度を1000倍した値
ダミープレイヤーなしの時の動作
• mrs_roomにTCP接続
• CREATE(player_id), SET_OWNER(player_id)を発行
• 1秒に5回、SYNC_POSをNEARCAST
• 爆弾を投げるときは SHOOTをNEARCAST
TCP サーバアドレス サーバポート プレイヤーID
CREATE
JOIN
NEARCASTの範囲
範囲外に出たら同期しなくなり、
10秒間同期しなかったら消える
DummyPlayerの動作
1.Start()で mrs_roomサーバーにTCP接続
2.座標を-300~300でランダムに初期化
3.プレイヤーID17番のキャラを特別扱いし、17番からのSYNC_POSが来たらそ
の位置を記憶する。
4.17番キャラを追いかけるものと、ランダムにうろうろするものが半数づつ
5.数秒に1回爆弾を投げる
6.NEARCAST(SYNC_POS), NEARCAST(SHOOT)は通常プレイヤーと同じように送る
同期用座標の反映方法
• 移動目標地点を更新するだけ。
• ただし20より離れてたらワープする
100プレイヤー状態で、通信量と遅延を常時測定
バイト数/秒受信レコード数/秒 PING値
NEARCASTを使う場合、
毎秒143レコードで
4214バイト=33Kbps
BROADCASTを使う場合、
毎秒504レコードで
15048バイト=120Kbps
送信モード切り替え
良好
採算性がかなり悪い
ゲームサーバーの採算性
• AWSなどでは、CPUは安く、通信費用は高い。
• 1プレイヤー(CCU)あたり、だいたい100Kbpsを越えないよ
うにできると採算性の問題が起きにくい。
• ダミークライアントを使えば、常に100人が接続している
状態で通信量と遅延の程度を見ながら、画面の動きを同
時に確認できる。
BROADCASTとNEARCASTの使い分け
• mrs_roomが自動的にBROADCASTするもの
• 部屋の状態変化(退出や途中参加)
• BROADCAST送信が向いているもの
• 高速移動するキャラや、乗り物に乗っているキャラの同期
• 射程が長い武器の動き
• 地形や建造物の破壊や変更、天候変化など
• フィールドに落ちているアイテムの状態変化
• モブの発生や削除
• 時刻の同期
• NEARCAST が向いているもの
• キャラクターやモブの位置変化
• キャラクターやモブの頻繁に発生するタイプのアクション(ジャンプとか)
• エフェクトやサウンド通知
CCU=100でのMRSサーバー負荷
• CCU=100 時点でのサーバCPU消費量は計測できない範囲におさまる
。(0.5~1%)
• NEARCASTでもBROADCASTでもCPU負荷に大きな違いはない
• MRSサーバーの性能は マシンあたり2〜3GBps以上、50万パケット以
上 (ネットワークスイッチがまずボトルネックになる)
ゲーム内容の作り込み
• たとえば、爆弾バトルに「伏せる」という動きを追加したい場合
• まずLocalPlayerに動きを追加して、操作ができるようにする
• LIE_DOWNというコマンドを追加、動作時にNEARCASTする
• DummyPlayerが数秒に1回LIE_DOWNを送信するようにする
• LIE_DOWNを受信したらRemotePlayerが伏せる反応を追加する
サーバーコードをいじる必要はない。
Unityのみで作業は完結。
ダミークライアントの作り込み
• もっと賢くすることはできる
• 影に隠れたり
• ダミクラ同士で襲撃したり
• 経路探索を行う
• etc..
• ただしCPU負荷は増えていく
100人以上について
• モノビットエンジンの性能上は200〜300人でも問題はな
かった。
• Unityの描画・ダミークライアントのロジック負荷がだん
だん上がっていくので、限界はある
結論
• MRSを用いれば、
• PUBGライクな100人バトルロイヤルゲームにおいて
• Unity内部に100個の実際に通信するダミークライアントを
追加して実際に活動させることで
• 本番コードと完全に同じ構成における通信負荷と遅延を
常時監視しながら、開発作業を進行できる。
モノビットのミドルウェア製品
• MRS “Monobit Revolution Server”
• UDP/RUDP/TCP/WebSocketに対応した全プラットフォーム向け通信ミドルウェア
• http://www.monobitengine.com/mrs/
• MUN “Monobit Unity Network”
• Unity向けの導入が非常に簡単なMRSベースのミドルウェア
• http://www.monobitengine.com/mun/
• MRSクラスタ
• MRSサーバー群のクラウド・オンプレにおける運用を支援する製品
爆弾バトルはこれを使っています
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜

Más contenido relacionado

La actualidad más candente

マインクラフトPEのマルチプレイサーバー立ててみた
マインクラフトPEのマルチプレイサーバー立ててみたマインクラフトPEのマルチプレイサーバー立ててみた
マインクラフトPEのマルチプレイサーバー立ててみたMasaya Hayashi
 
UnityとnodeとMMDと
UnityとnodeとMMDとUnityとnodeとMMDと
UnityとnodeとMMDとsters
 
ユニティちゃんだけじゃない! オープンソースとUnityの未来
ユニティちゃんだけじゃない! オープンソースとUnityの未来ユニティちゃんだけじゃない! オープンソースとUnityの未来
ユニティちゃんだけじゃない! オープンソースとUnityの未来NAKAOKU Takahiro
 
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】GMO GlobalSign Holdings K.K.
 
はじめてのUnity教室 講義用ppt
はじめてのUnity教室 講義用pptはじめてのUnity教室 講義用ppt
はじめてのUnity教室 講義用pptTaro Takano
 
Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lttorisoup
 
メガドラ実機で自作のROMファイルを動かしてみた話
メガドラ実機で自作のROMファイルを動かしてみた話メガドラ実機で自作のROMファイルを動かしてみた話
メガドラ実機で自作のROMファイルを動かしてみた話Yuma Ohgami
 
Cocoa勉強会20140621 macとiosで共通のコード
Cocoa勉強会20140621 macとiosで共通のコードCocoa勉強会20140621 macとiosで共通のコード
Cocoa勉強会20140621 macとiosで共通のコードSatoshi Oomori
 
Unityを触ってみた話
Unityを触ってみた話Unityを触ってみた話
Unityを触ってみた話tomomihirano1
 
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそうビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそうUnity Technologies Japan K.K.
 
セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介Yuma Ohgami
 
学園追放 最終発表資料
学園追放 最終発表資料学園追放 最終発表資料
学園追放 最終発表資料hima_zinn
 
講義用Ppt windows女子部
講義用Ppt windows女子部 講義用Ppt windows女子部
講義用Ppt windows女子部 Rikako Takahashi
 
大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?Yusuke Shirakawa
 
ゲームデータDLとの戦い ~幻塔戦記グリフォン~
ゲームデータDLとの戦い ~幻塔戦記グリフォン~ゲームデータDLとの戦い ~幻塔戦記グリフォン~
ゲームデータDLとの戦い ~幻塔戦記グリフォン~Syougo Yoshino
 
Arxan導入前後で変わったこと
Arxan導入前後で変わったことArxan導入前後で変わったこと
Arxan導入前後で変わったことYusuke Shirakawa
 

La actualidad más candente (20)

マインクラフトPEのマルチプレイサーバー立ててみた
マインクラフトPEのマルチプレイサーバー立ててみたマインクラフトPEのマルチプレイサーバー立ててみた
マインクラフトPEのマルチプレイサーバー立ててみた
 
UnityとnodeとMMDと
UnityとnodeとMMDとUnityとnodeとMMDと
UnityとnodeとMMDと
 
関西Unity勉強会
関西Unity勉強会関西Unity勉強会
関西Unity勉強会
 
Doozy ui 導入Tips
Doozy ui 導入TipsDoozy ui 導入Tips
Doozy ui 導入Tips
 
ユニティちゃんだけじゃない! オープンソースとUnityの未来
ユニティちゃんだけじゃない! オープンソースとUnityの未来ユニティちゃんだけじゃない! オープンソースとUnityの未来
ユニティちゃんだけじゃない! オープンソースとUnityの未来
 
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編・前編】
 
はじめてのUnity教室 講義用ppt
はじめてのUnity教室 講義用pptはじめてのUnity教室 講義用ppt
はじめてのUnity教室 講義用ppt
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
 
Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lt
 
メガドラ実機で自作のROMファイルを動かしてみた話
メガドラ実機で自作のROMファイルを動かしてみた話メガドラ実機で自作のROMファイルを動かしてみた話
メガドラ実機で自作のROMファイルを動かしてみた話
 
Cocoa勉強会20140621 macとiosで共通のコード
Cocoa勉強会20140621 macとiosで共通のコードCocoa勉強会20140621 macとiosで共通のコード
Cocoa勉強会20140621 macとiosで共通のコード
 
Unityを触ってみた話
Unityを触ってみた話Unityを触ってみた話
Unityを触ってみた話
 
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそうビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
 
セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介
 
学園追放 最終発表資料
学園追放 最終発表資料学園追放 最終発表資料
学園追放 最終発表資料
 
講義用Ppt windows女子部
講義用Ppt windows女子部 講義用Ppt windows女子部
講義用Ppt windows女子部
 
Unreal Engine 4 Powering Independent Game Developers
Unreal Engine 4 Powering Independent Game DevelopersUnreal Engine 4 Powering Independent Game Developers
Unreal Engine 4 Powering Independent Game Developers
 
大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?
 
ゲームデータDLとの戦い ~幻塔戦記グリフォン~
ゲームデータDLとの戦い ~幻塔戦記グリフォン~ゲームデータDLとの戦い ~幻塔戦記グリフォン~
ゲームデータDLとの戦い ~幻塔戦記グリフォン~
 
Arxan導入前後で変わったこと
Arxan導入前後で変わったことArxan導入前後で変わったこと
Arxan導入前後で変わったこと
 

Similar a 【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜

ゲムつくプログラミング講座
ゲムつくプログラミング講座ゲムつくプログラミング講座
ゲムつくプログラミング講座purinxxx
 
Unity入門ハンズオン
Unity入門ハンズオンUnity入門ハンズオン
Unity入門ハンズオンKazuya Hiruma
 
Unityの開発環境が生み出す可能性
Unityの開発環境が生み出す可能性Unityの開発環境が生み出す可能性
Unityの開発環境が生み出す可能性MakotoItoh
 
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)maginemu Mishimagi
 
オンラインゲームのチートとセキュリティ
オンラインゲームのチートとセキュリティオンラインゲームのチートとセキュリティ
オンラインゲームのチートとセキュリティHayato Doi
 

Similar a 【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜 (6)

ゲムつくプログラミング講座
ゲムつくプログラミング講座ゲムつくプログラミング講座
ゲムつくプログラミング講座
 
Unity入門ハンズオン
Unity入門ハンズオンUnity入門ハンズオン
Unity入門ハンズオン
 
Unityの開発環境が生み出す可能性
Unityの開発環境が生み出す可能性Unityの開発環境が生み出す可能性
Unityの開発環境が生み出す可能性
 
Sig App4
Sig App4Sig App4
Sig App4
 
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
波に乗ってUnity3Dを使ってみているんだが (Ameba x Pixiv 合同勉強会LT)
 
オンラインゲームのチートとセキュリティ
オンラインゲームのチートとセキュリティオンラインゲームのチートとセキュリティ
オンラインゲームのチートとセキュリティ
 

【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜