Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Unityでオンラインゲーム作った話
Report
torisoup
Follow
May. 29, 2019
•
0 likes
2 likes
×
Be the first to like this
Show More
•
9,751 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Check these out next
UE4でマルチプレイヤーゲームを作ろう
エピック・ゲームズ・ジャパン Epic Games Japan
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
DeNA
MagicOnion入門
torisoup
ゲーム開発とデザインパターン
Takashi Komada
インタフェース完全に理解した
torisoup
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
自宅で出来る!ゲームサーバの作り方
光晶 上原
1
of
47
Top clipped slide
Unityでオンラインゲーム作った話
May. 29, 2019
•
0 likes
2 likes
×
Be the first to like this
Show More
•
9,751 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Technology
UnityとPhoton Cloudを組み合わせてゲームを作った話 https://peatix.com/event/323261
torisoup
Follow
Advertisement
Advertisement
Advertisement
Recommended
【Unity】 Behavior TreeでAIを作る
torisoup
18.3K views
•
49 slides
オンラインゲームの仕組みと工夫
Yuta Imai
863.3K views
•
56 slides
コールバックと戦う話
torisoup
2.9K views
•
59 slides
未来のプログラミング技術をUnityで -UniRx-
torisoup
152.3K views
•
145 slides
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
58.5K views
•
82 slides
UniTask入門
torisoup
13.7K views
•
95 slides
More Related Content
Slideshows for you
(20)
UE4でマルチプレイヤーゲームを作ろう
エピック・ゲームズ・ジャパン Epic Games Japan
•
28K views
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
DeNA
•
22.8K views
MagicOnion入門
torisoup
•
9.9K views
ゲーム開発とデザインパターン
Takashi Komada
•
24.6K views
インタフェース完全に理解した
torisoup
•
5.7K views
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
•
79.2K views
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
•
12.8K views
自宅で出来る!ゲームサーバの作り方
光晶 上原
•
27.3K views
ゲームの仕様書を書こうまとめ
Sugimoto Chizuru
•
61.4K views
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
Unity Technologies Japan K.K.
•
43.7K views
UE4 MultiPlayer Online Deep Dive: 実践編1 (Byking様ご講演) #UE4DD
エピック・ゲームズ・ジャパン Epic Games Japan
•
22.8K views
Unityでオニオンアーキテクチャ
torisoup
•
9.2K views
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
•
5.7K views
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
エピック・ゲームズ・ジャパン Epic Games Japan
•
9.7K views
Doozy UI 使おうぜ! #unity_lt
torisoup
•
24.5K views
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
•
23.3K views
大規模ゲーム開発における build 高速化と安定化
DeNA
•
44.7K views
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
エピック・ゲームズ・ジャパン Epic Games Japan
•
9.6K views
【Unite Tokyo 2019】HDRPコワクナイ! HDRPで目指す小規模で高品質な映像制作
UnityTechnologiesJapan002
•
7.6K views
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
Unity Technologies Japan K.K.
•
42.4K views
Similar to Unityでオンラインゲーム作った話
(20)
UnrealEngine の VR 事情
Masaaki Suga
•
1K views
ソーシャルゲームにレコメンドエンジンを導入した話
Tokoroten Nakayama
•
9.4K views
Railsによるワイルドなソフトウェア開発
Drecom Co., Ltd.
•
3.7K views
Shiva 〜Nextremerをscale upする機械学習環境〜
Kazuki Morozumi
•
1.9K views
Unreal engine4を使ったVRコンテンツ製作で 120%役に立つtips集+GDC情報をご紹介
エピック・ゲームズ・ジャパン Epic Games Japan
•
14.8K views
財布にやさしいRを使ったデータマイニング
Ryoji Yanashima
•
2.7K views
ROS User Group Meeting #28 マルチ深層学習とROS
Hiroki Nakahara
•
2.2K views
opensource and accessibility (Dec2000) Part 2
Takuya Nishimoto
•
566 views
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 TOKYO
Game Tools & Middleware Forum
•
1.9K views
PlayCanvas:2D機能とライブラリ組み込みのいろは - PlayCanvas運営事務局 - GTMF 2018 OSAKA
Game Tools & Middleware Forum
•
1.4K views
Nishimoto 170603-mruby
Takuya Nishimoto
•
335 views
rogyゼミ第2回 ニックさん
rogy01
•
2.1K views
PyCharm入門
Yuki Nagai
•
12.1K views
XNAとはなにか?XNAうれしいところ、うれしくないところ
IGDA Japan
•
2.4K views
Io t,ai時代のソフトウェア
Toshiaki Kurokawa
•
213 views
私とOSSの25年
MITSUNARI Shigeo
•
11.8K views
くみこみからひとこと
kishima7
•
447 views
DSPGraphを試してみた話
Toru Nayuki
•
1.8K views
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
•
6.4K views
2017冬の開発合宿vrオンラインゲーム
Syo Igarashi
•
621 views
Advertisement
More from torisoup
(13)
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
torisoup
•
3.7K views
ARでVRアバターを表示するシステムを構築しよう
torisoup
•
3.2K views
Observableで非同期処理
torisoup
•
10.2K views
ObserverパターンからはじめるUniRx
torisoup
•
7.8K views
Photon Cloud ことはじめ
torisoup
•
1.8K views
アバター生放送支援アプリ「アバれぽ」
torisoup
•
779 views
UnityとNCMBでユーザ管理を実装してみた話
torisoup
•
2.4K views
Task vs Observable
torisoup
•
487 views
UniRxでPUNを使いやすくする
torisoup
•
4.4K views
はじめてのUniRx
torisoup
•
90.2K views
UniRxでMV(R)Pパターンをやってみた
torisoup
•
27.1K views
みくみくまうすについて&Unity で使えるコーディングノウハウ
torisoup
•
9K views
Unity講習会(初級)
torisoup
•
22.2K views
Recently uploaded
(20)
Omnis
DaisukeFujita10
•
10 views
Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
オラクルエンジニア通信
•
25 views
Apache EventMesh を使ってみた
Yoshiyasu SAEKI
•
39 views
ネットワークパケットブローカー市場.pdf
HinaMiyazu
•
3 views
【DL輪読会】Flow Matching for Generative Modeling
Deep Learning JP
•
643 views
TestSIP (1).pdf
DeependraSingh712859
•
0 views
SoftwareControl.pdf
ssusercd9928
•
6 views
①【戴尔豪斯大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
☀️【麦吉尔大学毕业证成绩单留学生首选】
15sad
•
3 views
点群SegmentationのためのTransformerサーベイ
Takuya Minagawa
•
10 views
MT,STautomation
ssuserf8ea02
•
105 views
モバイル・クラウド・コンピューティング-データを如何に格納し、組み合わせ、情報として引き出すか
Masahiko Funaki
•
2 views
①【麦吉尔大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
突如登場したAzure Developer CLIでなにができるのか?検証してみる
Kazumi IWANAGA
•
27 views
本科/硕士《加拿大温莎大学毕业证成绩单》
1523dsa
•
2 views
☀️【杜兰大学毕业证成绩单留学生首选】
2125nuh
•
2 views
SpringBootにおけるテンプレートエンジンの活用
iPride Co., Ltd.
•
29 views
①【汤普森河大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
第2回Matlantis User Conference_20230421_畠山歓先生
Matlantis
•
356 views
20230523_IoTLT_vol99_kitazaki_v1.pdf
Ayachika Kitazaki
•
95 views
Advertisement
Unityでオンラインゲーム作った話
オンラインゲームつくった話 @toRisouP
誰? • とりすーぷ (
@toRisouP ) – Webエンジニア(プログラマ) – Unity、C#、Scala、Ruby、Python、PHPとかその辺触ってる • 最近はScalaが一番お気に入り • いろいろやってる – 同人ゲーム制作 – VR開発 – Qiita書く – 技術書執筆
この秋、 ゲームをリリースしました
ハクレイフリーマーケット • Windows向けの東方2次創作ゲーム • 最大6人までネットワーク対戦可能なパーティアクションゲーム •
ロビー機能あり、CPUあり
ウリ • 物理演算をメインに使ったパーティゲーム – とりあえず物理演算をガバらせておけば面白くなるという発想 •
ガバガバ物理演算は偉大 – 大量の物理演算オブジェクトを同期しながら通信対戦できる • 今思うと狂気の沙汰
使ってるもの • 使っているフレームワークとか – Unity
2017.2 – Photon Cloud – NCMB – ADX2 LE – Effekseer • 使ってるライブラリ – UniRx – Zenject – PhotonRx
本題
オンラインゲームつくるの すごくツライ
PhotonCloudの仕様 • クライアントで状態を管理する – サーバサイドに状態はもたせられない –
サーバサイドにロジックはおけない – 誰か1人がマスタークライアントになる – クライアントサイドで全ての問題を解決しないといけない!
発生した問題 • 動きがカクカクする • 通信の待ち時間でテンポが悪くなる •
帯域、メッセージ数がオーバーする
発生した問題 • 動きがカクカクする • 通信の待ち時間でテンポが悪くなる •
帯域、メッセージ数がオーバーする
オブジェクトの管理ルール • オブジェクトには親の概念がある – 同期オブジェクトにはPhotonViewコンポーネントがついている –
PhotonView.IsMine = true だと自分が管理(送信モード) – PhotonView. IsMine = false だと通信相手が管理(受信モード) 親 (IsMine=true) 子 (IsMine=false) 子 (IsMine=false) 子 (IsMine=false)
図解 • 自分の世界 – IsMine
= true • 相手の世界 – IsMine = false 同期されている2つのオブジェクトがある
図解 • 自分の世界 •
相手の世界 自分のオブジェクトが移動すると… アニメーション
図解 • 自分の世界 •
相手の世界 移動後の座標を送信して 相手側の座標を書き換える
図解 • 自分の世界 •
相手の世界 相手の世界の座標を上書きして同期
図解 • 自分の世界 •
相手の世界 自分の世界ではキレイにアニメーションして移動したが、 相手の世界には結果しか送ってないので突然ワープしたように見える → 動きがカクカクする
カクカクする問題 • 同期メッセージの送信頻度が低いのが原因 – 根本対策は同期頻度を上げるしかないが、 帯域やメッセージ数の制限で上げるにも限界がある →別アプローチで解決する必要がある
解決策いろいろ • 同期頻度を単純に増やす方法 – これができたら苦労しない •
キー入力を送ってしまう方法 – 入力から一意に結果が決まるゲームシステムならかなり有効 • がんばってごまかす方法 – 補間・補外・エフェクト・アニメーションでごまかす • そもそも同期しない方法 – ローカルで演算可能ならそっちを優先して使う
解決策いろいろ • 同期頻度を単純に増やす方法 – これができたら苦労しない •
キー入力を送ってしまう方法 – 入力から一意に結果が決まるゲームシステムならかなり有効 • がんばってごまかす方法 – 補間・補外・エフェクト・アニメーションでごまかす • そもそも同期しない方法 – ローカルで演算可能ならそっちを優先して使う 採用した方法 (というかこれしかできない)
がんばってごまかす • 補間処理でなんとかんする – Vector3.Lerp
と Quaternion.Lerp を使う • 補間の割合を調整して違和感が少ないパラメータを見つける – 補間を強くする → 滑らかだが動きが鈍くなる – 補間を弱くする → 機敏だがカクカクが目立つ
そもそも同期しない 相手の演算結果を待っているからラグが生じる ↓ 自分が演算して結果を送る側になれば ラグは起きない
プレイヤの動向を観察してわかったこと • 「プレイヤは自キャラの周辺しかみてない」 – 正確には「自分の行動に対する周辺のリアクション」しか見てない •
自分が触ったオブジェクト • 自分が持ち上げたオブジェクト • 自分が投げたオブジェクトの挙動 – 少なくともここさえ滑らかに動いていれば、 他がカクカクしててもあまり気にならない
やったこと • 自キャラが触れたオブジェクトの親権を奪う – 座標を受け取る側から送る側にしてしまう –
自キャラが触れた瞬間にIsMineをtrueに書き換えてしまう • (実際はIsMineに似た別のフラグ用意してそっちを書き換えているけどね)
効果 • かなり効いた – 少なくとも自分の周辺だけはラグがなく動いてくれる •
実装は複雑化してしまった – メンテナンス困難な実装になっている – 親権のスイッチングコストも結構かかる
発生した問題 • 動きがカクカクする • 通信の待ち時間でテンポが悪くなる •
帯域、メッセージ数がオーバーする
テンポが悪くなる • 入力に対してプレイヤが機敏に反応してくれない – 原因は行動時に「通信」が発生するから •
特にこのゲームだと「アイテムを拾う」時に発生する – アイテムを拾えるかどうか?の判定に通信が発生するため
解決策 • 通信時間をアニメーションでごまかす – アイテムを拾う時に、 「構える」→「持ち上げる」の2段階のアニメーションを再生する –
構えモーションの間に通信を終わらせてしまう
アニメーション 構えモーション 構え→持ち上げ 構え→持ち上げ (構えが長めのキャラ) 構えモーション再生中に裏で通信しちゃうことで、 通信によるテンポの悪化をごまかす
発生した問題 • 動きがカクカクする • 通信の待ち時間でテンポが悪くなる •
帯域、メッセージ数がオーバーする
帯域とメッセージ数 • 帯域 – 秒間に通信するデータ量 –
小さければ小さいほうが当然良い – PhotonCloud的には通信したデータの総量の方が大事 • メッセージ数 – 座標等の同期、RPCの実行命令などの送受信回数
制約 • 通信量 – 1ユーザあたり3GB/月まで –
オーバーすると追加料金 • メッセージ数 – 1部屋につき500メッセージ/秒 – オーバーしても今のところはペナルティなし
メッセージ数の制約がヤバイ • 部屋に参加している人数倍して計算される – 6人部屋で1メッセージ送信すると、 送信1+受信5=6メッセージ消費してしまう –
6人部屋だと約83メッセージ/秒しか送れない • 60FPSだと1フレームあたり1~2メッセージしか送れない
このゲーム同期対象が多すぎる • フィールド上のアイテムを同期すると一瞬で上限超える – こんな仕様のゲームでネットワーク対戦とかバカじゃないの…
対策をうつ必要がある
対策前の状態 • データ通信量 – 1試合あたりの総量6MB/人 •
メッセージ数 – 2000メッセージ/s/room – 規定値の4倍もいってた
取った対策一覧 • 次の位置が確実に予測可能なものは同期しない • 動いていないオブジェクトは同期しない •
オンライン対戦時にはゲームのフレームレートを30に落とす • オブジェクトをシャーディングしてグループ単位でまとめて同期する
取った対策一覧 • 次の位置が確実に予測可能なものは同期しない • 動いていないオブジェクトは同期しない •
オンライン対戦時にはゲームのフレームレートを30に落とす • オブジェクトをシャーディングしてグループ単位でまとめて同期する
フレームレートを落とす • オンライン時のみ30FPSに落とす – メッセージ送信回数を60FPS時の半分以下にできる –
補間処理でごまかしやすくなる – 低スペックPCと挙動を揃えることが出来る – 割とメリットが大きかったので採用
オブジェクトのグループ化 • オブジェクトの座標同期をグループ単位で行う – ようするにシャーディングして管理する
グループ単位で分割するメリット • バラバラに送るよりメッセージ数を削減できる – 1メッセージ内に複数の座標データをまとめて送信できる •
挙動のチューニングができる – 「グループにわける数」 と 「何フレームごとに送信するか」の 組み合わせでカクカク度合いとメッセージ数のバランスを調整できる • 一斉に同期する時の違和感が消せる – 全オブジェクトが同じタイミングで動くと違和感が出る – バラバラに動いている感を出してごまかせる
後はログを見ながら調整 • 違和感と帯域・メッセージ数のバランスを見て模索
チューニング結果 • 帯域 – 対策前
1試合あたり6MB → 1試合あたり2MB 60FPS,グループ化なし,毎フレーム送信 30FPS,3グループ分割,2フレームごとに送信
チューニング結果 • メッセージ数 – 1000~1900/s
→ 450~600/s
なんとか規定値には収まった • まだところどころオーバーするけど… – 怒られたら直す 500メッセージ
まとめ
まとめ • オンラインゲーム制作はとにかく手間がかかる – 工数がオフラインゲーム開発の5~10倍になる(体感) –
技術的に実装困難なため諦めた仕様もいくつかある – 不具合発生時の原因調査にエスパー能力が必要 • まじめに作るとつらいところはできるだけ誤魔化す – プレイヤが不快に感じさえしなければよい – ガバ物理はむしろラグった方が面白いから助かった
Advertisement