📝
Unityのゲーム向けクライアント・サーバ・ネットワーク関連覚書
はじめに
脳内にある言語化されていない技術的なことを書き出したもの+ブックマークにためたリンクを整理したものになります。
情報ををすごく雑多にまとめたものになります。(あんまり綺麗に整理できていない)
自分の気になるキーワードは検索して資料を読んでみて、わからないところ深く掘り下げると良いかもしれません。
概要
クライアント
WebAPIやアセットダウンロードはUnityWebRequestやOS Native機能をPlugin化してで実装する。
リアルタイムの処理はライブラリを使用したりや独自実装を行う。
また、通信環境が携帯網(3.xG、4G、5G)、無線LAN(+光回線、ADSL、携帯?)など回線により影響を受けることを考慮する必要がある。
サーバ
クラウドサービス(まだオンプレもある?)にフルスクラッチや、マネージドサービス、mBaas、その他特化したサービスやライブラリを組み合わせて構築する。
各種サービスと併用して、WebAPI、リアルタイムサーバ、管理ツールなどを、スクリプト言語(PHP、Ruby、Python、Node.js)やコンパイラ言語(C++、Golang)でライブラリやフレームワークを使い実装を行う。
大雑把に、WebAPI、リアルタイムサーバ、管理ツールなどは下記のようなサーバを使用する。
- ロードバランサーからフロント(Apache、Nginxなど)でWebAPIを受る
- アプリケーションサーバで処理を行う
- データはmysqlなどから読み込みや保存をする
- キャッシュはRadiseなどで行う
- 想定同時接続から負荷をかけて、New Relicなどを使って負荷時のパフォーマンス計測を行う
- 監視用のシステムでCPU、メモリなどのリソース監視、サーバーの死活、ネットワークの死活などを管理する。
クライアントとサーバ間の処理
- WebAPIやリアルタイムの実装は、クライアントとサーバ間で共通インターフェイスになるため協議して実装する必要がある(もしくは同じ人が作る)
- ログインやアイテムを使うなどのコマンドタイプは、ステートレス設計なWebAPI(httpsアクセス、Restful風?)でやり取りする
- アセットダウンロードする場合は、クラウドストレージからユーザー認証(ない場合や、推測しにくいパスとか)を行いhttps経由でダウンロードする
- リアルタイム処理求められる場合は、WebScoket(TCP)や、RUDP(UDP)(の類型)を使い。
P2P接続をする。NAT越えができない場合はサーバを介してクライアント間の通信を行う。- P2Pを使わずに必ずサーバ経由する場合もある
Unity
マネージド
- Dedicated Game Server Hosting from Multiplay | Unity Multiplayer Services
- Amazon GameLift(最上級クラスの専用ゲームサーバーホスティング)| AWS
- Game Servers | Google Cloud
- Agones 超入門 - google-cloud-jp - Medium
- Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & A…
mBaas
- Amazon GameSparks
- PlayFab | Microsoft Azure
- Firebase
- mBaaSでサーバー開発不要! | ニフクラ mobile backend
- 個人からプロまで使えるゲームサーバー - Game Server Services(GS2)
-
Epic Online Services
- Epic(UnrealEngineの会社) だがUnityにも対応している
- NHNテコラス、ゲーム開発向けバックエンドサービス「Gamebase」をAWS Marketplaceで提供開始 | NHN テコラス
-
『地球防衛軍6』のオンラインプレイに採用された「Epic Online Services」。たった1か月で完了した内製エンジンへの導入について開発者が語る【EOS Deep Dive 2023】|ゲームメーカーズ
- Unity向けの話ではないが参考になる
ミドルウェア
- モノビットエンジン公式サイト - 通信ミドルウェア&総合サーバパッケージ『モノビットエンジン公式サイト』
- グローバル クロスプラットフォーム リアルタイムゲーム開発 | Photon Engine
- Vivox - ビデオゲーム向け無料のボイスチャットおよびテキストチャット
通信ライブラリ
- Unity のマルチプレイヤー Netcode の移行ガイド - Unity Technologies Blog
- unip2p/UniP2P
- Cysharp/MagicOnion: Unified Realtime/API Engine for .NET Core and Unity.
- vis2k/Mirror: A community replacement for Unity's abandoned UNET Networking System.
- pixiv/webrtc at branch-heads/pixiv-m77
- sta/websocket-sharp: A C# implementation of the WebSocket protocol client and server
- Ways to interact with the network in Unity with examples for organizing multiplayer games - DEV Community
実装
- 【Unity】UnityWebRequestのエラーハンドリングをちゃんとやる - LIGHT11
- [Unity/Golang] 環境間でデータを圧縮して解凍してみる – しゃまとんのたね
- Unityにおける通信APIを色々試して罠を踏んだ話 | CyberAgent Developers Blog
各種資料
総合
-
マルチプレイヤーゲームの Client-Server 勉強ノート | Alto-tascal
- この資料のリンク読めばいいんじゃないかと思う。(ピックアップしてこの資料内にもリンクを貼っています。)
- 「Client と Server があるスマフォゲームを 開発するときに人類が考えておくべき、ほとんど全てのこと」をまとめる構想 | Alto-tascal
- [CEDEC 2010]ネットゲームの裏で何が起こっているのか。ネットワークエンジニアから見た,ゲームデザインの大原則 - 4Gamer.net
- オンラインゲームの仕組みと工夫
- How netcode works, and what makes 'good' netcode | PC Gamer
- クラウド上のゲームインフラの概要 | ソリューション | Google Cloud
- P2PとC/Sネットワーキング | Nettention
- Cysharpの河合様をゲスト講師にお招きしてゲームサーバーに関する社内勉強会を開催しました! | Developers.IO
- 通信技術がゼロでもわかるオンラインマルチプレイゲーム制作講座
- 事実か、虚構か。ネットコードに関する 3 つの誤解を解く | Unity Blog
- 続・Unityでのネットワークマルチプレイの話 – soy-software(ひとつ前に書かれた記事)
- オンラインゲーム 10年の進化と同期方式の選び方 - きゅぶろぐ
- ゲームリアルタイム通信プロトコル 第一回会合
-
Unreal Engineでオンラインゲームを作るための技術について | ドクセル
- UE向けの資料だが、考え方、ミドルウェア、クロスプレイに関して参考になる
- サーバー開発で機能要件以外に考えること - honeplusのメモ帳
モノビット社
-
モノビット エンジン’s Presentations on SlideShare
- ↓に張ったリンク以外もたくさんあるので↑のリンク先で欲しい情報がないか確認しましょう。
- Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
- 年の瀬リアルタイム通信サーバ勉強会
中嶋氏関連
- ネットワーク ゲームにおけるTCPとUDPの使い分け
- MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
- ゲームの通信をつくる仕事はどうなるのだろう?
Unity
- 小規模な協力型マルチプレイヤーゲームの開発における 8 つの要素 | Unity Blog
- オンラインマルチプレイヤーゲームを支える様々な仕組み - Unityステーション - YouTube
- Unity Netcode for GameObjectsでオンラインマルチプレイゲームを作る - Qiita
- Multiplayer を詳しく見てみよう | Unity Blog
- 柔軟なサーバーホスティングで拓かれたマルチプレイヤーゲームのさらなる可能性。『スーパーボンバーマン R オンライン』チームに聞く、Multiplay&Matchmakerの活用 – Unity for Pro
構成
- ソーシャルゲームのバックエンドの構成例 - Qiita
- AWS×PHPでの 高信頼かつハイパフォーマンスなシステム | CyberAgent Developers Blog
- ソーシャルゲーム サーバーアーキテクチャ選定 | エンジニアブログ | GREE Engineering
リアルタイム
- リアルタイムゲームサーバー開発技術スタックまとめ - Speaker Deck
- ソーシャルゲームを支える「リアルタイムサーバー」の作り方 - ログミーTech
- モンスターストライクのリアルタイム通信を支える技術 - ログミーTech
- ガールアックス:リアルタイム通信処理の効率的な実装
- kanai6274's blog: スプラトゥーンのナワバリバトルの通信をパケットキャプチャによって解析してみた
- kanai6274's blog: スプラトゥーン2を快適に楽しむためのネットワーク環境づくり
- リアルタイム通信ゲームの実装例
- Amusement Creators | LiteNetLibとMessagePackで行うリアルタイム通信
- 僕の考えた最強のリアルタイム通信基盤(検討編)〜みんなでライブの場合〜 - Qiita
- ゲームサーバーの「割り当て」設計
- 「エーペックス」の仕組み:開発者によるサーバーとネットコードの解説
- [CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の…
- UnityのXRで使いたいリアルタイム技術・サービスの整理
- Unityによるマルチプレイヤーアクションのための別解C#統一理論 | DeNA TechCon2022
- 中小企業メーカーにも伝えたい、ネットワーク通信を要するゲーム開発時の注意点・失敗事例。
- Photon Fusionのシミュレーションを理解しよう
チューニング
- モバイル対戦アクションゲームの通信最適化テクニック
- 【Unity】Unite Tokyo 2019 「大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~」講演と壇上では語られなかった6つのこと。 - SEGA TECH Blog
- 【CEDEC2016】大ヒットゲーム『モンスターストライク』を支えた負荷分散の手法…モニタリングとDBスケールアウト、キャッシュをどう活用したか | Social Game Info
- 「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック – Unity Learning Materials
- 「モバイルゲームインフラあるある物語 ~システム障害と技術的対策の例~」
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization - Valve Developer Community
- マルチプレイヤーゲームにおけるレイテンシへの対応 | Unity Blog
格闘ゲーム
- Explaining how fighting games use delay-based and rollback netcode | Ars Technica
- 【CEDEC2014】遅延問題を錯覚利用で解決?! 「世界のみんなは4フレーム以内にいる」 - GAME Watch
- オンラインゲームでは、お互いの位置がだいぶ離れていても (日本とブラジルくらい) 何故素早く同期できるのですか?どのように通信しているのでしょうか?に対するNakamura Yutaさんの回答 - Quora
ロールバック
- 『GUILTY GEAR XX ΛCORE PLUS R』にてオンライン対戦の遅延を改善する“期待の技術”テスト開始。ほぼ遅延なしの対戦を実現する「ロールバックネットコード」とは何なのか? | AUTOMATON
- ロールバックネットコード「GGPO」で快適なオンライン対戦が実現。Steam版「GUILTY GEAR XX AC+R」のパブリックβテストレポート
- 「GUILTY GEAR -STRIVE-」では独自のネットワークコードにより高い競技性が担保される――開発Dの片野氏に採用の経緯やメリットを聞いた
- 【西川善司のグラフィックスMANIAC】格闘ゲームで話題になるロールバックの仕組みとは?攻撃が当たった次の瞬間、なかったことになる「あの現象」はなぜ起こるのか? - PC Watch
FPS
- オンラインで同期した100体の巨大生物から地球を衛る方法 【UNREAL FEST EXTREME 2021 SUMMER】 | ドクセル
-
スプラトゥーンの非同期処理の話 ~なにがラグのせいなのか~|まけトピア
- 公式の仕様ではないため参考情報
負荷テスト
- 負荷試験コトハジメ
- 【CEDEC 2019 フォローアップ】スマホゲームリリース時に絶対サーバを落とさないための負荷試験 | Cygames Engineers' Blog
- BPF Performance Toolsを読んだ感想 - go_vargoのブログ
- はじめてのAPIサーバー負荷試験で得た最低限の負荷試験知識 - Qiita
- スマートフォン向けゲームの負荷試験で必要なもの - Qiita
書籍
-
オンラインゲームのしくみ|SBクリエイティブ
- 出版から時間が経っているが、Unity2018プロジェクトが準備されている
- 書籍内容はネットワークを使ったゲームデザイン寄りの内容。ネットワーク関連は他の本を読む必要がある。
-
オンラインゲームを支える技術 ―壮大なプレイ空間の舞台裏 | Gihyo Digital Publishing
- PCオンラインゲームの企画から運営まで書かれている
- クラウドゲームをつくる技術 ―マルチプレイゲーム開発の新戦力:書籍案内|技術評論社
-
TCP技術入門 ――進化を続ける基本プロトコル:書籍案内|技術評論社
- TCP/IPの基礎からTCPの主要機能,歴史,プロトコル設計,最近のLinuxで主要な輻輳制御アルゴリズムCUBIC,新たに登場したBBR,そして各種応用技術の最新動向まで平易に解説。
- Linuxネットワーク プログラミングバイブル - 秀和システム あなたの学びをサポート
ネットワーク
総合
- ネトゲや配信で使い分けられてるTCPとUDP、RUDPの概念から勉強し直してみた - Qiita
- なぜインターネットの MTU は 1,500 バイトになったのか - らくがきちょう
- ネットワークの遅延について真面目に書く - たごもりすメモ
- ネットワークでなぜ遅延が生じるのか
- ネットワーク遅延対策技術 | Think IT(シンクイット)
- 127.0.0.1とlocalhostと0.0.0.0の違い - Qiita
- 【MTU値】1500,1492,1454?モバイル回線や固定回線ごとのパケットサイズと通信最適化方法 - 踊るびあほりっく
IPv6
WebAPI
解説
- WebAPI学習ソースまとめ - Qiita
- 0からREST APIについて調べてみた - Qiita
- RESTfulなWeb APIを設計するときに考えること - Qiita
- RESTful APIのURI設計(エンドポイント設計) - Qiita
- REST API設計者のための有名APIのURL例 - Qiita
- WebAPIでエラーをどう表現すべき?15のサービスを調査してみた - Qiita
ドキュメント
- APIドキュメントを支える技術 - Qiita
- Swaggerの概要をまとめてみた。 - Qiita
- DevelopersSummit2018_SwaggerでPHPエンジニアとUnityエンジニアがもっと仲良くなった話 - Speaker Deck
- Swaggerを使ってAPIの繋ぎ込みを楽にするための取り組み | GRIPHONE ENGINEER'S BLOG
- Swagger UI × Amazon EC2 × Dockerで開発初期からAPIの繋ぎ込みを意識できる環境を構築してみた | GRIPHONE ENGINEER'S BLOG
- SwaggerでRESTful APIの管理を楽にする - Qiita
- GitHub上でSwaggerをプレビューできるChrome拡張機能を作った - Qiita
- 本当に使ってよかったOpenAPI (Swagger) ツール | Future Tech Blog - フューチャーアーキテクト
- Wordな職場にSwaggerを定着させようとして失敗したけど結局定着した話 - Qiita
- まだAPI定義管理で消耗してるの?〜Swaggerを用いた大規模アプリ時代のAPI定義管理とコードジェネレート〜 - Speaker Deck
- Swaggerで始めるモデルファーストなAPI開発
TCP
解説
- TCP/IPをわかりやすく - 通信プロトコルの基礎知識を図解で学ぼう - エンジニアHub|若手Webエンジニアのキャリアを考える!
- TCPプロトコル
- TCP/IP とパフォーマンス
- TCPの状態遷移 - Qiita
- When TCP sockets refuse to die — Idea of the day
- TCP各バージョンの輻輳制御の観察
- pingでMTUサイズを調査する:Tech TIPS - @IT
- MTU / MSS を最適化する | yabe.jp
- tcp_tw_なんとかの違い - Qiita
- TIME_WAITに関する話
- c++ - Why would connect() give EADDRNOTAVAIL? - Stack Overflow
- TCP/IPの通信の切断検知 - 揮発性のメモ2
- ソケットプログラミングのTips
実装
- tcp > バッファリングしないように > Socket.NoDelay =true / Socket.SendBufferSize=0 - Qiita
- c++ - Why would connect() give EADDRNOTAVAIL? - Stack Overflow
UDP
実装
- Unity上でUDPを用いた通信機能(マルチプレイ・オンライン通信)を実装する方法 | 洋梨日記🍐
- Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~ – Unity Learning Materials
受信保証
NAT traversal
グローバルなIPアドレスを持たない、クライアント同士がP2Pで接続するための方法です。
この方法を使っても100%接続できるわけではないためリレーサーバを準備する必要があります。
技術解説
- NAT traversal - Wikipedia
- Microsoft PowerPoint - shudo-NAT-20080628.ppt [互換モード]
- WebRTCに使われるP2Pの技術 - tjun月1日記
- [24日目] NAT Traversalって知ってますか | Cerevo TechBlog
- ゲームでよくある「NATタイプ」はどう判定しているの?
- How NAT traversal works · Tailscale
- AtermがIPv6による新世代UPnPに対応! KONAMIとの共同検証で実現したピンホール制御で、ゲームもIoTもIPv6直接接続へ【イニシャルB】 - INTERNET Watch
対応方法
- P2P通信でNatを越える - Qiita
- NAT越えを雑に試す
- UPnPでNAT越え ~オンラインゲーム開発における課題~ - Qiita
- UDP Hole PunchingでNAT越えの実験をしてみた - 日曜エレクトロニクス(日エレ)
通信方法
総合
Mobile
- 携帯電話でIPv6使えてますか?
- IIJmio meeting 25 スマートフォンはなぜ「つながらない」のか
-
IIJmio meeting 24 MVNO素朴な疑問解決編
- MVNOとUQ mobile・Y!mobileは何か違うの?
- MVNOの通信速度が遅くなるのはなぜ?
- MVNOは電波が弱いんじゃ…繁華街は苦手? 地下鉄で通信が途切れるんだけど…
- 最近スマホ関係の法律が変わったみたいだけど?
Discussion