トーク

全てGoで作るP2P対戦ゲーム入門
Room 1 17:00 - 17:20
WebAssembly と WebRTC を駆使し、フロントエンドから通信・レーティングまで “まるごと Go” で実装した 1 対 1 対戦ゲームがあります。
一般にゲーム開発では複数言語が混在しがちですが、今回は Ebitengine x Pion/WebRTC を核に Go だけで完結させました。
しかし「全部 Go」で作る手順や設計上の勘所は、まだ体系的に共有されていません。
サーバ負荷ゼロの完全 P2P 構成を実現するまでの道のりを 20分で解説します。
まず、ゲームを支える 5 つの要素解説し、役割と接続フローの全体像を提示します。
- Ebitengine: wasm ビルドでブラウザゲームを実現
- WebSocket サーバ: 軽量マッチングとシグナリング入口
- Ayame (go-ayame): シグナリング・プロトコルを簡潔に実装
- Pion/WebRTC: DataChannelによるゲーム操作データのP2P通信を実現
- レーティングサーバ: httpサーバでスコア管理を自動化
続いて、Go の哲学 「共有メモリによる通信ではなく、通信による共有を」 を体現する実装パターンについて
goroutine と channel で描画ロジックと通信ロジックを分離し、保守性と並行性能を両立させたコード片を具体例とともに解説します。
最後に、ライブデモでブラウザを 2 枚立ち上げ、サーバレスで動く対戦をその場で確認していただきます。
「WebRTC や WASM は初めて」という方でも、セッション終了時には “Go だけでリアルタイムゲームを作れる” イメージを鮮明に持ち帰れるはずです。
活用しているOSS
- Ebitengine: https://github.com/hajimehoshi/ebiten
- Pion WebRTC: https://github.com/pion/webrtc
- WebRTC Signaling Server Ayame: https://github.com/OpenAyame/ayame
自作ゲーム関連:
- ブラウザゲーム: https://github.com/ponyo877/ebiten-hit-and-blow
- マッチングサーバ: https://github.com/ponyo877/easy-matchmaking
- レーティングサーバ: https://github.com/ponyo877/easy-rating