最終確認日

GodotでNakamaを使ったオンラインゲームを公開してみる

概要

Udemyの講座「Godot 4 Multiplayer: Make Your Own Online Game 」で作ったゲームをWeb上に公開してみたい。

講座ではW4Gamesを利用していたが、現在(2025-05-20)は個人では利用できないため、代わりにNakamaを使って実装してある。

環境

やりたいこと

Docker ComposeをサポートしているPaaSDocker コンテナごとのせてみたい。

構成

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に貼り付ける。

GodotでNakamaを使ったオンラインゲームを公開してみる-1747692848238

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

GodotでNakamaを使ったオンラインゲームを公開してみる-1747693025156

Deno Freshでゲームをデプロイしてみる

ここにおいた。 https://uruly-godot-practice.deno.dev/online-game

プロジェクト側の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でNakamaを使ったオンラインゲームを公開してみる-1747819376716

ホスト役すらもすり抜ける。

GodotでNakamaを使ったオンラインゲームを公開してみる-1747819415894

面白かったけど笑えねぇぜ。

一応ノートだけは作成しておく。 Godotで作ったオンラインゲームの同期がうまくいかない原因を探る

サイトアイコン
公開日
更新日