TL;DR
- 画面描画、マッチング、P2P 通信をすべて Go で実装した対戦ゲームの作り方の紹介。
- 描画は Ebitengine と WebAssembly、マッチングは WebSocket、プレイヤー同士の通信は WebRTC で行う。
内容
画面描画
Go と WebAssembly で描画するので、HTML や CSS を書く必要はない。描画には、Go 製の 2D ゲームライブラリである Ebitengine を使う。
マッチング
マッチングはシンプルなキューで管理する。クライアントとは WebSocket でつなぎ、ゴルーチンで並行に処理する。
P2P 通信
プレイヤー同士の通信には WebRTC を使う。Go のライブラリでは pion/webrtc が有名である。
WebRTC で通信を確立するには、接続用の情報を交換する必要がある。シグナリングサーバはこの情報交換を仲介し、双方のブラウザが互いを見つけて通信を始められるようにする。発表ではシグナリングサーバの OSS として、時雨堂の Go 製の Ayame が紹介された。Go のクライアントには go-ayame がある。
描画とゲームロジックの分離
Ebitengine とゲームロジックは チャネルでデータをやり取りする。描画処理と状態更新処理を分けられるので、並行処理を直感的に書ける。ほかに、レーティングサーバの構成も紹介された。
キーワード
- Go
- WebAssembly
- Ebitengine
- WebSocket
- ゴルーチン
- WebRTC
- チャネル