Directorで作ったミニゲームをGodotで再構築する(その1-3)
力尽きたところからの続き。最後の動作確認後にHTML5書き出ししてitch.ioにアップしてTaloのスコアランキング部分も本番用にして完了かな。
まずは最後の動作確認
最後に遊びまくってバグがないか確認する。1人プロジェクトの辛いところで、全然遊んでても楽しくないのにプレイしなくてはいけない。AIも
流石に実際にゲームを遊んでくれたりはしない。いや、遊んでくれるAIもあるのか?
で、スコアの表示も単純に「X個」だったので、1箱以上作ってたら「X箱とX個」になるようにphpを修正した。

動作確認するのがかったるくなったので割と早めにやめた。どうせ仕事じゃないし有料ゲームでもないし、多少バグがあっても怒り狂う人はいないだろう。というか誰か遊んでくれますか?
コードを修正してitch.ioにアップ
最後にClaudeに全コードを見てもらったが特にヤバそうなところはなかったようだ。信じるぞ!
今までは開発用のスコアを送っていたのでphpも修正していよいよたこ焼き名人_改をHTML5書き出してitch.ioにアップする。

アップしてテストして思ったんだけど、オンラインオフラインバッジ要らんわ。ここで上手く機能しないし、そもそもitch.ioで遊べるってことはネットに繋がってるんだし神経質になる必要ない。削除!
itch.ioにちゃんとアップできた!
いろいろ直しまくってようやく最終版?と思われるたこ焼き名人_改をitch.ioにアップする段取り。
いろいろやることあるんだけど、ゲームを登録する際にこんなオプションがある。

翻訳するとこう。

上から2つ目の項目にチェックを入れておくと自動的にゲームが始まるかなと思ってチェックしてみたんだけど、どうやらGodotのゲームには対応していないらしい。
ページを表示するとこうなる。ゲームを遊ぶために「Run game」をクリックしなきゃダメなことと、スコアランキングを見るためには「Click to activate embed」をクリックしなきゃならん。ダサい……。

両方クリックしてようやくこうなる。
Webブラウザ内のゲームなので最初から音が鳴るとたぶんGoogleに怒られるので消音状態でスタート。でもなんとか形になってきた。

テストプレイしてみる
しょっぱなでいきなりバグ発見。Web版は起動時は消音状態なんだけど、そのまま遊んでもBGM以外のほとんどのSEが鳴ってしまう。
・「遊び方」ボタンのクリック音
・「遊び方」画面のクリック音(↑上と同じ音)
・「はじめる」ボタンのクリック音
・ゲームスタート時のSE
・ポットを持って空の穴をクリックしたときのSE
・タネの入った穴をクリックして具が入る時のSE
・具の入ったタネが少し膨らんだ状態でピックを持ってクリックしたときに半焼けのタネがひっくり返る時のSE
・完璧に焼けたたこ焼きをピックでクリックして持つときのSE
・たこ焼きが箱に入る時のSE
・たこ焼きが8個箱に入って刷毛でソースを塗る時のSE
・箱のふたが閉じるときのSE
・箱がスライドするときのSE
・箱が右まで行ってカウントされるときのSE
・ゲームオーバー時のSE
このままでは格好悪いのでClaudeに全部直させる。というやり取りをその後も何度か繰り返すことになる。バグがなかなか消えない……。
そして、最後までハマったのが音問題。最終的に2つの問題が残った。
その1
ChromeのAutoplay Policyで「ユーザーの操作なしに音を鳴らしてはいけない」というルールがある。しかし現状のWeb版は消音状態でロードされるにもかかわらず、我が家のBluetoothスピーカーが「プツッ」と鳴る。これはなんかルール違反ではないかと思いClaudeに確認したら、それを解決する方法があると言う。
その2
最新のコードではSEやBGM1つ1つに「音を鳴らしていい状態だったらならせ」というif文が書かれている。Claudeの言いなりで修正してきたが、こうじゃなくてゲーム内全体のボリュームをコントロールしたらif文全部不要じゃね?って思って訊いてみたらそうだと言われた……。
Director初心者だったころに自分も良くやってしまったと思うけど、全体を見ないでとりあえず気になった部分部分を修正してコードが無駄に増える典型的なパターンをAIもやるんだ、と思った。ミニゲームだがコードの行数は結構な量になってきているし、そもそも無駄は出来るだけ省きたい。
これは絶対に指示を出している自分が悪いんだけど、プログラムをまったく知らない人が指示だけで何かを作ったら、恐らくぐっちゃぐちゃなコードになるんだろうなと予想できる。いや、プログラムを知らない人でも指示の出し方が上手い人だって絶対にいるので、必ずしもそうとは限らないとも思うんだけど……。
問題解決と思いきや……
Web版でさらに問題が発覚した。ゲーム中のBGMのテンポを残り時間で段階的に早くしてるんだけど、それがリセットされちゃう。Godotエディターで再生して確認すると問題ない。
Claudeに訊いたら
GodotのWeb版ではWAVのループが効かないケースがあります。対策としてOGG形式に変換するのが一番確実です。
だって。OGG形式って初めて聞いた。有名なの?
Audacityで変換できるようなので、変換したけど直らない!
最終的に常に残り時間を見つつテンポを調整することで解決した。
Taloの本番にスコアがエントリーできない!
良い感じにバグも取れて、そろそろWeb版を公開しても良いかなと思いながらテストをしていたら問題が発生。Taloのスコアランキングの本番にスコアがエントリーされない!
TaloにはDevelopment buildとLive buildという2種類の登録場所があって、GodotエディターでテストしているときはDevelopment buildにエントリーしていた。でも、Web版はLive buildにエントリーさせないとダメなのだ。
ここかなりハマった。デバッグ用に画面にいろんな変数の値を表示させたりしながらテストを何度も繰り返し、Claudeに質問しまくり、TaloのLeaderboardsを間違って消してしまったり……。
そしてClaudeと何度もやり取りして分かった。原因はビルド時のチェック1つだった。プロジェクトのエクスポートで最後に保存する際の「デバッグ付きエクスポート」のチェックを外したら問題解決!

GodotとTalo組み合わせて使ってる人には「それ基本だよ」って言われそうだけど、初心者には分からんて。
そして、一度同じニックネームでDevelopment buildにエントリーしてしまったら、上のチェックを外したビルドで遊んでもDevelopment buildにエントリーしてしまう……。
Taloの仕様をまだちゃんと把握していないが、これ正しいのかね?
ニックネーム問題で悩む
現在のゲームのニックネームの仕様は「自由に決められて何度でも変更できる」なんだけど、Taloの仕様だと同じニックネームを使っている人が複数人いる場合、一番上手い人しかエントリーされない。Hachitarouが世界中に30人いたとして、一番上手いHachitarouのスコアしかスコアランキングに載らないのよ。
こんなどうでもいいカジュアルゲームでそこまで悩むか?って言われそうだけど悩む。Directorでゲームを作ってた時はそこまで悩んでなかった。同じ名前の人がたくさんいてたくさんランクインしてても気にしなかった。何なら同じ名前の人が複数行に渡ってランクインしてるのも気にしなかった。ゲームによってはランキング全部Hachitarouでも気にしなかった。でも今は気になる。
ClaudeからDiscordみたいにニックネームの後ろに4桁の数字を付与して一度決めたニックネームは変更できないようにすれば、ほぼニックネーム被り問題は解消できると提案された。
ニックネーム問題に関しては割と初めの頃からClaudeに相談してて、そのたびに「たこ焼きゲームのようなカジュアルなゲームではそこまで気にする必要はありません」と言われ続けてきた。いや、その通りなんだけど、今回で何となく問題を解決しておけば、今後も役に立つかなと思って悩み続けている。
会員登録システムを作れば問題は解決できるけど、そんな大げさなもの要らないし。
Geminiにも質問したらClaudeとは少しだけ違う方法を提案された。
==========================================================
Taloでの同名プレイヤー・スコア上書き問題の解決策まとめ
==========================================================
Webブラウザゲーム(Godotからitch.ioへエクスポート)における、Taloのスコア登録仕様(ニックネーム重複によるデータ上書き)をスマートに解決するための設計書です。
----------------------------------------------------------------------
1. 根本的な解決アプローチ(推奨)
----------------------------------------------------------------------
ユーザーに「ニックネーム入力の自由(いつでも変更可能)」を提供しつつ、システム側でスコアの上書きや衝突を防ぐには、「ユーザーが入力する名前」と「システムが管理するID」を完全に切り離すのが最も綺麗な方法です。
【全体構造のイメージ】
[ プレイヤーのブラウザ ]
│
├── 画面上の表示: 「たろう」(いつでも自由に変更可能)
└── 内部のセーブ: user://player_profile.save ──> [ player_id: "usr_8f3a9c2b" ] (固定)
│
└───(スコア送信 / 通信)───> [ Talo サーバー ]
├── プレイヤーID : usr_8f3a9c2b
└── カスタムデータ : nickname = "たろう"
💡 なぜこの方法が最適なのか?
GodotのWebエクスポート(HTML5)は、`user://` パスへの保存にブラウザのIndexedDBを使用します。これは通常の「ブラウザキャッシュクリア」では削除されない強固なエリアであるため、意図的にサイトデータを全削除されない限り、発行した `player_id` が長期間維持されます。
----------------------------------------------------------------------
2. Godot(GDScript)での実装コード例
----------------------------------------------------------------------
(以下、プレイヤーIDの自動生成、保存、読み込み、およびニックネーム変更時のTaloとの同期処理、ゲーム内ランキング描画の具体的なGDScriptコードを記載しています)
……ここから下は長くなるので割愛
これをClaudeに見せて、ニックネームとスコア送信の新仕様を決定。
・ユーザーごとにユニークなIDを持たせる
・ニックネームはいつでも変更可能
・TaloにはニックネームとIDとスコアを送信
・identify(本人確認) → player_id(固有ID)で行う
・props(付加情報) → nickname を紐付ける
・leaderboard → スコアを送信
・ランキング表示用のphpを修正してニックネームとスコアだけを表示
なんでこれ自分で思いつかないかな……。
最終チェック
ニックネーム問題を解決する仕組みを実装してチェックしまくる。ちゃんと機能してる!ニックネーム変更後に自己記録を更新してスコアをTaloに送信するとちゃんと反映されてる!

あとはページをもう少しいじって公開作業だ。
最後の仕上げ
ゲームページのデザインを何とかしたい。調べたらゲームが非公開状態だとデザインがいじれないようだ。限定公開状態で少しだけいじった。

もうこれで完成で良いだろう。公開状態にした。もし興味を持ってくれた方がいたら遊んでみてください。
いや~長かった。こんなシンプルなゲームでも、スコアランキングに対応させたりするとかなり手間がかかるな。ニックネーム問題でも悩んだし、ちょいちょいバグも出たしね。でも、AIのおかげで最後まで走りきれた。
次はDirector時代にもいくつか作った簡単な対戦ゲームが作りたい。出来るかな?
おわり
※2026.6.1追記
ニコニコ動画にオリジナルのプレイ動画をアップしてくれてる人を発見!
