最終確認日
GodotでNakamaを使ったオンラインゲームを公開してみる
概要
Udemyの講座「Godot 4 Multiplayer: Make Your Own Online Game 」で作ったゲームをWeb上に公開してみたい。
講座ではW4Gamesを利用していたが、現在(2025-05-20)は個人では利用できないため、代わりにNakamaを使って実装してある。
環境
- Godot 4.4 stable
- Nakama
やりたいこと
Docker ComposeをサポートしているPaaSにDocker コンテナごとのせてみたい。
構成
バックエンド(Nakama)
- Renderでホスト。Docker Composeでセットアップ。PostgreSQL含む。
クライアント(Godotゲーム)
- ブラウザ版GodotゲームをDeno Freshでホスティング。
Render を使ってみる
- GitHubリポジトリを紐づけてWebServiceとしてデプロイしてみる
docker-compose.yml
しか配置していないのでDockerfile
がないよと言われてしまう- リポジトリ内に
render.yaml
をつくる Dockerfile
もつくる
- Blueprintsでデプロイしてみる。
- https://nakama-server-w47i.onrender.com/ ここに配置されたっぽい
- 苦戦したけど次のファイルでできた
render.yaml
Dockerfile
start.sh
render.yaml
render.yaml
databases:
- name: nakama-postgres
plan: free
databaseName: nakama
services:
- type: web
name: nakama
env: docker
plan: free
dockerfilePath: ./Dockerfile
envVars:
- key: DATABASE_URL
value: postgresql://nakama_snei_user:3Fc...
- key: socket.server_key
value: defaultkey
1回実行するとおそらく nakama-postres
プロジェクトが作られるので、
ダッシュボードから Connect
より Database のURLをコピーして、DATABASE_URLのvalueに貼り付ける。
Dockerfile
FROM registry.heroiclabs.com/heroiclabs/nakama:3.26.0
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]
start.sh
#!/bin/sh
set -e
echo "Waiting 10 seconds for database to be ready..."
sleep 10
/nakama/nakama migrate up \
--database.address "$DATABASE_URL"
exec /nakama/nakama \
--name nakama1 \
--database.address "$DATABASE_URL" \
--logger.level DEBUG \
--session.token_expiry_sec 7200
これで両方立ち上がっていればおk
Deno Freshでゲームをデプロイしてみる
ここにおいた。 https://uruly-godot-practice.deno.dev/online-game
- そもそもNakamaの方のデプロイが失敗しているかも?
- なおした
- そもそもクライアントの設定すらしてなかった。
- 日本語が文字化けしている。
プロジェクト側のclientを更新する必要がある。
先ほどのデプロイした nakama
サーバのURLをコピーする
var client := NakamaClient.new(
"defaultkey", # server key (client には通常関係ない)
"your-nakama-server.onrender.com", # ホスト名(ドメイン)
7350, # ポート
"https", # プロトコル
true # SSL有効 (通常 true)
)
var client: NakamaClient
func _ready():
if DisplayServer.get_name() == "web":
# ブラウザ上で実行されている場合
client = Nakama.create_client(
"defaultkey",
"nakama-hogehoge.onrender.com", # ← 本番ドメイン
443, # 7350はRender側で解放されていない
"https",
true
)
else:
# デスクトップエディタやローカル実行の場合
client = Nakama.create_client(
"defaultkey",
"localhost",
7350,
"",
false
)
# ログインやマッチ処理など続き...
よし。
https://uruly-godot-practice.deno.dev/online-game
カクカクだけどできてはいそう...!
できたが...
友達にコードを渡して一緒に遊ぶということはできた。しかしとてもじゃないがオンラインゲームとして成り立っているとは言えない。
コリジョンをすり抜ける。
ホスト役すらもすり抜ける。
面白かったけど笑えねぇぜ。
一応ノートだけは作成しておく。 Godotで作ったオンラインゲームの同期がうまくいかない原因を探る

公開日
更新日