前回で、単色の四角が壁を蹴って登るところまでできた。ここからは、見た目と音をつけていく。今回は効果音だ。ジャンプやコインに音をつけて、遊んだときの手応えを出してみよう。
今回のゴール
- 音をつける場所を、AIに洗い出させる頼み方
- AIの提案を受けて、ゲームの仕様をどこまで変えるかの判断
- 音をどう用意するか、手段を選ぶ判断
使ったもの
| 項目 | 値 |
|---|---|
| Godot | 4.7.2 |
| コード生成AI | Claude Code(Claude Opus 5.5) |
| 試した音の生成AI | Adobe Firefly(無料プラン) |
| 検証日 | 2026-09-28 |
やり取り
同じプロンプトを投げても、同じ返答が返ってくるとは限らない。モデルが変われば中身も変わる。参考にしてほしいのは文面そのものより、どんな制約をどの順で与えたかのほうだ。
これまでと同じく、私の入力はコード枠で、AIの返答は引用で示す。やり取りの全文は、末尾の「制作の記録」にある。
どこに音をつけるか
前回と同じフォルダで Claude Code を開き、まず音をつける場所を聞いた。
効果音をつけたいです。どの要素に付けるべきかリストアップして。
AIは、音をつけたい場面を11個、優先度の高・中・低に分けて返してきた。高はジャンプ・壁に着く・コインを拾う・トゲに当たる・ゲームオーバーの5つ、中はステージクリア・剥がれる・ゲーム開始の3つ、低は張り付きの残りが少ない・頂上が見えた・滑り落ち中の3つだ。それぞれに、コードのどこで鳴らすかと、音のイメージが添えてあった。
AIが返した11個の一覧(優先度 高・中・低)
| # | 場面 | 鳴らすきっかけ | 音のイメージ |
|---|---|---|---|
| 1 | ジャンプ | player.gd の _jump() |
短い「ピョン」 |
| 2 | 壁に着く | player.gd の _land() |
軽い「トン」 |
| 3 | コインを拾う | main.gd の _on_player_got_coin() |
高く明るい「チャリン」 |
| 4 | トゲに当たる | main.gd の _on_player_hit_spike() |
鈍い「ドン」 |
| 5 | ゲームオーバー | main.gd の _game_over() |
下がっていく短いフレーズ |
| 6 | ステージクリア | main.gd の _stage_clear() |
上がっていくファンファーレ |
| 7 | 剥がれる(張り付きの時間切れ) | player.gd で、張り付き(STUCK)から滑り落ち(SLIDING)に変わるとき | 「ズルッ」。張り付きすぎの合図 |
| 8 | ゲーム開始・リトライ | main.gd の _start_stage()(ステージ1のとき) |
短い「ポン」 |
| 9 | 張り付きの残りが少ない | 残り時間のバーが3割を切ったとき | 小さな「ピッ」を1回 |
| 10 | 頂上が見えた | 頂上の帯が画面に入ったとき | ほのかな上がり音 |
| 11 | 滑り落ち中 | 滑り落ちている間ずっと | 「ザー」というこすれる音(ループ) |
(元の返答は優先度ごとに3つの表に分かれている)
一覧のあとには、音をつけないほうがよい場面と、決めてほしいことが続いていた。
- 落下物が出てくる瞬間:出現間隔が最短 0.35 秒と短いので、うるさくなります。
- ボタンを押した瞬間:押すたびに張り付き、離すたびにジャンプするので、上の1と2で十分です。
- どれを付けますか? 最初は高の5つと、中の6・7を付けるのがおすすめです。
- 音のファイルはどうしますか?
- A. 仮の音を私が作る:コードで簡単な電子音を合成し、.wav ファイルにします。後から本番の音に差し替えられます。
- B. ご自身で用意する:フリー素材などを使う場合です。先にファイル名と置き場所を決め、差し替えるだけで済む形にしておきます。
この時点では、どちらの質問にもまだ答えなかった。一覧を見て、先に1つ変えたいものがあったからだ。
9番をチャージ音に差し替える
9番は「張り付きの残りが少ないとき、小さな『ピッ』を1回」鳴らす、残り時間を知らせる音だった。これを見て、代わりにこう頼んだ。
9の代わりにボタンホールド中にチャージしていくようなループ音が欲しい
AIは9番をチャージ音に差し替えた案を返してきた。張り付いている間だけ鳴るループ音で、張り付いた時間に合わせて音の高さを変えていく、というものだ。そのうえで、次のことを聞いてきた。
- ジャンプの強さはどうしますか? 今の仕様では、長く押してもジャンプの強さは変わりません。「チャージ」の音を鳴らすと、長く押すほど強く跳べるように感じる人もいそうです。
- 音だけ:仕様はそのままで、音は残り時間の目安にする
- ジャンプも強くする:長く押すほど高く跳べるようにする(ゲームの遊び方が変わります)
- どの音を付けますか?(前回の質問1)おすすめは、1〜5 と 6・7・9(チャージ音)です。
- 音のファイルはどうしますか?(前回の質問2)A は私がコードで仮の音を作る、B はご自身で用意する、です。
判断した1:チャージ音を入れても、跳ぶ強さは変えない
私の答えはこうだ。
1:変えない
2:1~9
3:GeminiまたはFireflyで生成するのでプロンプトを作って
1つ目の質問で、AIは、音が遊び方の感じ方に影響することを指摘していた。「チャージ」と名のつく音を鳴らせば、長く押すほど強く跳べると感じる人が出るかもしれない。ただ、跳ぶ強さを変えると、第2回で決めた遊び方が変わってしまう。この音はあくまで残り時間の目安にして、仕様は変えないことにした。
2つ目は、おすすめより多い1〜9を選んだ。3つ目は、AIが出したA(AIがコードで仮の音を作る)でもB(自分で用意する)でもなく、生成AIで作ることにして、そのためのプロンプトを頼んだ。
生成AIのプロンプトを書いてもらう
AIは9つの音のプロンプトを英語で書いてきた。英語のほうが結果が安定するという理由で、日本語の説明が添えてあった。「コピペで使えるように整えて」と頼むと、共通の指定を最初から入れた形に直してきた。ジャンプの音はこうだ。
Sound effect only: a short, light upward swoosh with a quick rising blip, a small character jumping off a wall. About 0.2 seconds. Casual mobile game sound effect, clean soft synth tones, dry, no reverb tail, no music, no voice, no background noise.
9つのプロンプトの全文と、生成するときのコツ
9. チャージ音(ループ) →
charge_loop.wavSound effect only: a steady, continuous humming energy charge tone, soft synth buzz with a gentle shimmer. Constant pitch, no rising, no fade in or fade out, seamless loop. About 1 second. Casual mobile game sound effect, clean soft synth tones, dry, no reverb tail, no music, no voice, no background noise.
チャージ音は、音が上がっていく変化をゲーム側で付けるので、生成する音自体は高さが一定になるように書かれていた。AIは生成するときのコツとして、次のことも添えていた。
- 「音楽」にならないようにする:特に Gemini は曲を作りがちです。そうなったら、先頭に
Sound effect only:を付けてください。- 何度か生成して選ぶ:同じプロンプトでも毎回違う音が出ます。3〜4回生成して、いちばん合うものを選ぶと早いです。
1〜9の全文は「制作の記録」にある。
このプロンプトで、Adobe Firefly の無料プランを1回試した。ところが、無料プランでは1日に1回しか生成できなかった。9つの音をそろえ、AIが勧めるように何度か生成して選ぶには、とても足りない。
判断した2:コードで作る方も試す
そこで、最初にAIが示していたAの手段を思い出して、こう頼んだ。
効果音をコードで作る方も試したい。
AIは、Godot のスクリプト(GDScript)で波形を計算して .wav に書き出す生成用のスクリプトを作り、9つの音を書き出してきた。出力先は、生成AIの音と聴き比べられるように別のフォルダにしてあった。
# ファイル 長さ 作り方 1 jump.wav 0.18秒 280→820Hz に上がる矩形波 2 land.wav 0.09秒 低い正弦波にノイズを少し重ねる 3 coin.wav 0.32秒 シ→ミの2音 4 hit.wav 0.35秒 低く下がる音にノイズを重ね、軽く歪ませる 5 game_over.wav 1.40秒 ソ→ミ→ドと下がる3音 6 stage_clear.wav 0.97秒 ド→ミ→ソ→高いドの和音 7 peel.wav 0.40秒 下がる音に「ズズッ」としたノイズを重ねる 8 start.wav 0.13秒 短く上がる「ポン」 9 charge_loop.wav 1.00秒 高さ一定のうなり音(ループ用)
報告の最後には、こう書いてあった。
私は音を耳で確かめられないので、聴いた感想を教えてください。
実際に聴いてみると、生成AIより自分のイメージに近い音が出ていた。気になったところを伝えて、直してもらった。
チャージの音はもう少し低めで
スタート音はジングルにして。
ループはもっと低くして
チャージ音は2回かけて1オクターブ下がり、スタート音は「タ・タ・ターン」と上がる短いジングルになった。「OK」と返して、音はコードで作ったものを使うことにした。
判断した3:使わない仕組みは入れさせない
組み込みの前に、AIはいつもどおり構成案を見せてきた。その方針には、こう書いてあった。
- 当面は、コードで作った音(
audio/sfx_synth/)を使います。- Gemini・Firefly の音(
audio/sfx/)に替えるときは、Main ノードの設定を1か所変えるだけで済むようにします。同じ名前のファイルが見つからない音は、コードで作った音を代わりに使います。
あとで生成AIの音に切り替えられるよう、気を利かせた案だ。ただ、音はコードで作ったものだけを使うと決めていたので、この仕組みは要らない。そこで、こう返した。
OK。ただし1点だけ変えてほしい。
効果音はコードで作ったものだけを使うことにしたので、Gemini・Firefly の音(audio/sfx/)に切り替える仕組みと、見つからないときの代わりの処理は入れないでほしい。
あわせて、フォルダ名は audio/sfx_synth/ から audio/sfx/ に変えてほしい。
AIは指示どおりに組み込み、自分で入力を送るテストで、9つの音がすべて決めた場面で鳴ることを確かめてから報告してきた。報告には「実際に耳で聞いての確認はしていません」ともあった。
遊んでみて、最後に2つ直した。
チャージのピッチを高低逆にして。
ジャンプの音量を現状の80%程度に下げて
チャージ音は、張り付いた直後がいちばん高く、時間切れに近づくほど低くなるように変わった。「OK。確認した。」と返して、効果音の作業は終わった。
動かしてみる
音は記事の中では聞かせられないので、第6回で公開するゲームで確かめてほしい。張り付いている間に鳴る音が、だんだん低くなっていくのが分かるはずだ。
今回のハマりどころ
AIは音を耳で確かめられない。 AIは、音が決めた場面で鳴るか、チャージ音の高さがどこまで変わるかを、テストで数値として確かめていた。それでも、音の良し悪しは聴いた人が判断するしかない。AI自身も報告のたびにそう書いていた。
書き出した .wav には、ループの設定が入らない。 AIが作ったチャージ音は、最初は1回鳴って止まる状態だった。Godot では、音を読み込むときの設定(.import ファイル)でループを指定する必要がある。このときはAIが自分で気づいて直していた。
無料の生成AIは、回数の制限で本数がそろわないことがある。 今回は Firefly の無料プランが1日1回だった。効果音のように何本も、しかも何度か作って選ぶものでは、使える回数を先に確かめておいたほうがいい。
今回のコード
ai-game-dev-sound(GitHub のタグ)。このタグは、第6回まで作り終えた完成版と同じ状態を指している。効果音・絵・Web 向けの書き出しを1回の作業でまとめて加えたので、この回の時点だけのコードは残っていない。この回で増えたのは、audio/sfx/ の9つの音と、それを作るスクリプト tools/generate_sfx.gd だ。
この回のやり取りの全文は、制作の記録(第4回)にある。
次回やること
第5回は「画像生成AIの絵をゲームに入れる」。単色の四角を、画像生成AIで描いた絵に置き換える。