Unity オンライン接続調査
調査1
- Unity 標準のネットワークライブラリ開発を待つべき?いつ開発が終わるかわからないが
- MagicOnion
- .NET 5.0+ / .NET Core 3.1
- 入門 https://www.slideshare.net/torisoup/magiconion-174973732
- https://qiita.com/mitchydeath/items/cecf01493d1efeb4ae55
- OpenAyame https://github.com/OpenAyame/ayame/blob/develop/docs/USE.md
- Unity公式でWebRTCのパッケージがある
- goなのでサーバー選定に制約
- 1ルーム2名とあるが、用途として十分
- SkyWay https://webrtc.ecl.ntt.com/
- URLにある通り、NTTのサービス
- 無料サーバー
- 接続回数 50万回/月まで
- 1対戦毎に切断するならこっちがネックになりそう
- 10分に1回×8時間×土日×4週=384なので、月1300人ぐらい
- シグナリングサーバーとの接続回数の可能性
- 接続を維持する実装が必要
- ロビーからのデュエルは報酬画面後にロビーに戻る
- 1時間連続して遊ぶ×8回×土日×4週=64なので、月7800人ぐらい
- サーバ通信量(※) 500GB/月まで
- TURN がある
- Android/iOS/JavaScriptはSDKがある
- Unityについては明言はあるものの実装が分からない
- ダウンロードにwindows用バイナリがある。
- 実行後待機状態になる。port 8000 とあるので、これが WebRTC Gateway らしい
- ということは、Unity とは別に起動しておくプログラムのようだ。よってAndroidはAndroidでSDKを使うし、Windows向けは別途配布が必要
- 実行ファイルに引数はなく、実行ファイルと同じ並びに設定ファイルを置くことで変更
- https://github.com/skyway/skyway-webrtc-gateway/blob/master/docs/config.md
- https://github.com/skyway/skyway-webrtc-gateway/blob/master/samples/util.rb にあるように、/peers にJSONでAPIキー等を渡すと開始
- 出来そうだが、いずれにしても保留
- 結果的にAndroid/iOS/Web の相互接続のみ対応するならこれでもいい
- Azure
- 料金 https://azure.microsoft.com/ja-jp/free/
- App Service
- 他と違って VM は無さそう
- 上記 MagicOnion を使うなら
- Unity+MagicOnionのサンプルプログラムをコンテナ化してAzureContainerInstancesで簡単に動かす方法 https://qiita.com/_y_minami/items/aa57873bbb9ea0b36dd2
- Dockerを含むので冗長
- 上記 OpenAyame を使うなら
- VM がないので無料は不可
- Azure SDK for Go https://docs.microsoft.com/ja-jp/azure/developer/go/
- 1.8 以上と互換性、とある
- バージョン指定はコードの修正が必要かも https://github.com/Azure/azure-sdk-for-go/#versioning
- AWS
- 料金 https://aws.amazon.com/jp/free/free-tier/
- 常に無料、にチェック
- Amazon EC2 は候補に出てこない
- 12か月間無料(手続き必要)
- Amazon EC2 は月ごとに750時間稼働が無料
- 上記 MagicOnion を使うなら
- Amazon Linux 2 上に .NET 5 と MagicOnion を使ったゲームサーバー開発環境作ってみた https://dev.classmethod.jp/articles/create-dev-env-for-dotnet-5-and-magiconion-on-amazon-linux-2-ec2/
- Amazon EC2 を使う
- 上記 OpenAyame を使うなら
- AWS SDK for Go https://aws.amazon.com/jp/sdk-for-go/
- Amazon Elastic Compute Cloud(Amazon EC2) を使うらしい
- go は 1.15なので要件を満たす
- → 結果、無料で続ける事は出来なそう
- GCP
https://open-match.dev/site/docs/overview/
Unityが協力しているので親和性はありそう
Openとあるように、他のクラウドでも動かせる可能性
k8s上にセットアップ
https://cloud.google.com/kubernetes-engine/pricing
無料枠は $74 。最初のうちは使い切る事は無さそう
PlayFabと比較すると、Unityプラグインがないようだ https://github.com/googleforgames/open-match/issues/1221
自力実装の部分が多いのはつらい
- 料金 https://cloud.google.com/free/docs/gcp-free-tier?hl=ja
- 上記 MagicOnion を使うなら
- App Engine https://cloud.google.com/appengine/docs/flexible/dotnet?hl=ja
- .Net Core 3.1で作る
- Visual Studio の拡張がある。2019も対応
- Compute Engine https://cloud.google.com/compute/docs?hl=ja
- チュートリアルだと .Net Framework を選ぶ、とある点が気になる。
- 上記 OpenAyame を使うなら
- App Engine
- go の推奨バージョンは1.15となっているが、App Engineは1.12なので見送り
- Compute Engine
- PlayFab https://playfab.com/
- Azure上のサービス
- 料金 https://playfab.com/pricing/
- 開発モードである間は無料。デフォルト
- 10万ユーザーまで
- パーティ https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/networking/
- チャットとデータ通信とある
- Free だと「PlayFab Party Connectivity andVoiceの合計最大10,000分が含まれます。」とある
- Unityプラグイン https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/networking/party-unity-plugin-quickstart
- Win10およびXBoxのみ
- 直接接続をしたらカウントされない
- 接続できなかったら自動的にサーバー経由になる
- これそのまま使えそう
- Androidだとマイク許可が必要とある。
- コード修正で無効化できる
- マッチメイキング https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/matchmaking/
- プレビュー
- マルチプレイヤーサーバー
- サーバーサイドの処理が必要な時
- 最大750時間の無料コンピューティング時間でのホスティング
- 地域が 米国東部、北ヨーロッパ しかない。
- 無料の場合の可能性
- クイックスタート: Unity の PlayFab クライアントライブラリ (C#) https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart
- →ユーザーデータ管理だけ使うのもアリでは
- gamelift https://aws.amazon.com/jp/gamelift/
- AWS上のサービス
- 料金 https://aws.amazon.com/jp/gamelift/pricing/
- AWS と同じく12か月制限
- agones https://agones.dev/site/docs/getting-started/
- GCP上のサービス
- Kubernetes を使う
- 料金は Kubernetes も含め無料範囲内
- Dockerを使うなら、GCPの単独で十分
- Unity SDK https://agones.dev/site/docs/guides/client-sdks/unity/
- →サーバー側を自分で書く場合なら使ってもよさそう
- Unity プロジェクトに Firebase を追加する https://firebase.google.com/docs/unity/setup?hl=ja
- データ永続化だけ任せるなら
調査2
最低要件
- Android ⇔ Android
- IPv6
- 相手アドレスを知る方法
- ロビーサーバー
- アドレスのQRコードをツイッターで流してマッチング
- P2Pで接続
知識
基礎 https://medium.com/@shivamrawat_756/guide-to-p2p-over-internet-9f7cf41470bd
- STUNサーバーとTURNサーバーが必要とある。
- STUN:接続の障害を検出
- TURN:接続できないクライアントにIPを貸し出す
libp2p https://libp2p.io/
- javascriptおよびnodejsサポートが多い
- WindowsアプリはElectronで行くのも選択肢
WebRTC https://webrtc.org/
- WebRTCとは https://qiita.com/mush/items/121e45fefed009b6ad5e
- リアルタイム優先。
- 一旦見送り
peerjs https://github.com/peers/peerjs
- WebRTCのラッパー
- しばらく開発停止していたが復活した
- サーバーはリレーするだけならライブラリそのままでできそう
localturnnel https://github.com/localtunnel/localtunnel
- ローカルサーバーを https: //hungry-pug-96.localtunnel.me みたいなアドレスで参照できるようになる
- hungry-pug-96 の部分は指定できるので、キーワードを共有するだけで接続できるかもしれない
- 自分でサーバーを立てられるがサブドメインが必要。
調査
- スマフォがIPv6アドレスを持っていなかった。
- APNの設定を変えたがアドレスなしだった。test-ipv6サイトを見た場合もダメ
修正
2026/02/22 更新しました。主な内容は変わっていません。