第12週:音をつけて仕上げよう
前回は制限時間とリトライを作りました。
Time.deltaTimeを引いて残り時間を減らしたMathf.CeilToIntで秒数を見やすく表示したSceneManager.LoadSceneでやり直した
- BGMと効果音の違いを理解する
- 音ファイルを取り込んで鳴らす
- 合体したときに音を鳴らす
- 全体を調整して自分のゲームに仕上げる
ゲームにおける音の役割
Section titled “ゲームにおける音の役割”音があるとどう変わるか
Section titled “音があるとどう変わるか”音は「あとで付ける飾り」ではありません。 ゲームの気持ちよさを決める大きな要素です。
| BGM | 効果音(SE) | |
|---|---|---|
| 長さ | 長い(数分) | 短い(1秒以下) |
| 鳴り方 | ずっとループ | そのときだけ1回 |
| 役割 | 雰囲気づくり | 操作の手ごたえ |
| このゲームでは | ゲーム中ずっと流す | 合体、玉を落とす、時間切れ |
| ファイル形式 | .mp3 .ogg |
.wav |
音素材を用意しよう
Section titled “音素材を用意しよう”無料で使える素材サイト
Section titled “無料で使える素材サイト”- 効果音ラボ:https://soundeffect-lab.info/
- 魔王魂:https://maou.audio/
- フリーBGM DOVA-SYNDROME:https://dova-s.jp/
| 用途 | ファイル名の例 | どんな音を選ぶか |
|---|---|---|
| 合体 | merge.wav |
ポン、キラッ(短く明るい音) |
| 玉を落とす | drop.wav |
ポトッ(ごく短い音) |
| 時間切れ | gameover.wav |
ブザー、下がる音 |
| BGM | bgm.mp3 |
落ち着いた、繰り返し聞ける曲 |
取り込む手順
Section titled “取り込む手順”Assetsを右クリック → Create → Folder- 名前を
Soundsにする - 音ファイルを
Soundsフォルダにドラッグ&ドロップ

音を鳴らす部品
Section titled “音を鳴らす部品”AudioSourceとAudioClip
Section titled “AudioSourceとAudioClip”| もの | 役割 |
|---|---|
| AudioClip | 音のデータそのもの(取り込んだファイル) |
| AudioSource | 音を鳴らす装置(スピーカー) |
AudioSourceの主な設定
Section titled “AudioSourceの主な設定”| 項目 | 初期値 | 意味 |
|---|---|---|
| AudioClip | None | 鳴らす音 |
Play On Awake |
オン | 開始と同時に鳴らすか |
Loop |
オフ | 繰り返すか(BGMはオン) |
Volume |
1.0 | 音量(0〜1) |
Pitch |
1.0 | 音の高さ(1より大きいと高くなる) |
効果音を鳴らそう
Section titled “効果音を鳴らそう”なぜ「係」に鳴らしてもらうのか
Section titled “なぜ「係」に鳴らしてもらうのか”合体の音を鳴らしたいので、玉にAudioSourceを付けたくなります。 でも、これはうまくいきません。
SoundManagerを作る
Section titled “SoundManagerを作る”-
Hierarchyで右クリック → Create Empty
-
名前を
SoundManagerに変更 -
Add Component → Audio Sourceを追加
-
Play On Awakeのチェックを外す -
Assets/ScriptsにSoundManagerスクリプトを作る
using UnityEngine;
public class SoundManager : MonoBehaviour{ // どこからでも呼び出せる入口 public static SoundManager instance;
// 効果音を鳴らす装置 public AudioSource seSource;
// 鳴らす音たち public AudioClip mergeClip; public AudioClip dropClip; public AudioClip gameOverClip;
void Awake() { instance = this; }
// 合体の音(レベルが高いほど高い音にする) public void PlayMerge(int level) { seSource.pitch = 1f + level * 0.1f; seSource.PlayOneShot(mergeClip); }
// 玉を落とす音 public void PlayDrop() { seSource.pitch = 1f; seSource.PlayOneShot(dropClip); }
// ゲームオーバーの音 public void PlayGameOver() { seSource.pitch = 1f; seSource.PlayOneShot(gameOverClip); }}取り付けと設定
Section titled “取り付けと設定”SoundManager.csをSoundManagerオブジェクトにドラッグ- Inspectorで設定:
- Se Source欄に、Hierarchyの
SoundManager自身をドラッグ
(同じオブジェクトのAudio Sourceが自動で入ります) - Merge Clipに
merge - Drop Clipに
drop - Game Over Clipに
gameover
- Se Source欄に、Hierarchyの

PlayとPlayOneShotの違い
Section titled “PlayとPlayOneShotの違い”| メソッド | 特徴 |
|---|---|
Play() |
AudioClip欄の音を鳴らす。 鳴っている音は止まる |
PlayOneShot(clip) |
指定した音を鳴らす。 重ねて鳴らせる |
各スクリプトから音を呼ぶ
Section titled “各スクリプトから音を呼ぶ”Ballスクリプト(合体の音)
Section titled “Ballスクリプト(合体の音)”前回スコアを足した場所に、音の呼び出しを追加します。
// スコアを足す if (ScoreManager.instance != null) { ScoreManager.instance.AddScore(level * 10); }
// 合体の音を鳴らす if (SoundManager.instance != null) { SoundManager.instance.PlayMerge(level); }BallSpawnerスクリプト(落とす音)
Section titled “BallSpawnerスクリプト(落とす音)” // 玉を作る Instantiate(ballPrefabs[index], spawnPos, Quaternion.identity);
// 落とす音を鳴らす if (SoundManager.instance != null) { SoundManager.instance.PlayDrop(); }
timer = 0f;GameManagerスクリプト(ゲームオーバーの音)
Section titled “GameManagerスクリプト(ゲームオーバーの音)” // 画面を表示する gameOverPanel.SetActive(true);
// ゲームオーバーの音を鳴らす if (SoundManager.instance != null) { SoundManager.instance.PlayGameOver(); }再生して確認
Section titled “再生して確認”再生して遊んでみてください。
合体するたびに音が鳴ります! 大きい玉になるほど音が高くなるのも確認しましょう。

BGMを流そう
Section titled “BGMを流そう”専用のオブジェクトを作る
Section titled “専用のオブジェクトを作る”効果音とBGMは、別のAudioSourceで鳴らします。 音量を別々に調整できるようにするためです。
- Hierarchyで右クリック → Create Empty
- 名前を
BgmPlayerに変更 - Add Component → Audio Source
- Inspectorで設定:
- AudioClipに
bgmをドラッグ Play On AwakeをオンのままLoopをオンにするVolumeを0.3くらいに下げる
- AudioClipに
仕上げをしよう
Section titled “仕上げをしよう”ここまでで機能は完成です。 残りの時間で自分のゲームらしく仕上げましょう。
完成チェックリスト
Section titled “完成チェックリスト”- クリックした場所から玉が落ちる
- 玉が箱の中に積み上がる
- 同じ玉同士が合体して1つ大きくなる
- 合体後の玉が1個だけできる(2個できていない)
- 合体するとスコアが増える
- 制限時間がカウントダウンされる
- 時間切れでゲームオーバーになり、最終スコアが出る
- RETRYボタンでやり直せる
- 合体の音、落とす音、BGMが鳴る
- エラー(赤い表示)が出ていない
仕上げのアイデア
Section titled “仕上げのアイデア”| やること | 方法 |
|---|---|
| 自分の画像に差し替え | Spritesに画像を入れ、PrefabのSpriteを変える |
| 背景をつける | Squareを大きくして後ろに置く(Order in Layerを$-1$に) |
| 箱の見た目をよくする | 壁と床の色を変える、枠をつける |
| 次に出る玉を見せる | 画面上に小さく表示する |
| 難しさを調整 | 箱の幅、limitTime、出る玉の種類を変える |
| タイトルを入れる | Canvasにゲーム名のテキストを置く |
Pythonとの比較:ここまでで学んだこと
Section titled “Pythonとの比較:ここまでで学んだこと”12週間で学んだことを、Pythonと並べて振り返ります。
| やりたいこと | Python | Unity (C#) |
|---|---|---|
| 繰り返し実行 | while True: |
void Update() |
| 画面に出力 | print() |
Debug.Log() |
| 物を増やす | クラスからインスタンスを作る | Instantiate() |
| 物を消す | del やリストから削除 |
Destroy() |
| まとめて持つ | リスト [a, b, c] |
配列 [] |
| ランダム | random.randint() |
Random.Range() |
| 重力・衝突 | 自分で計算式を書く | Rigidbody 2Dに任せる |
よくある問題と解決方法
Section titled “よくある問題と解決方法”| 症状 | 原因と対処法 |
|---|---|
| 音が鳴らない | AudioSourceを追加したか確認 |
| 合体音が途中で切れる | 玉のAudioSourceで鳴らしている。SoundManagerから鳴らす |
| 開始と同時に効果音が鳴る | Play On Awakeをオフにする |
| BGMが1回で止まる | Loopをオンにする |
| 効果音が聞こえない | BGMのVolumeを下げる(0.3くらい) |
NullReferenceException |
Clip欄やSe Source欄が空 |
| 音が高すぎる/低すぎる | Pitchの計算を調整(0.1を小さくする) |
| リトライしたらBGMが最初から | 正常な動作です(シーンを読み込み直すため) |
基礎課題全員必須
ゲームを完成させる:
SoundManagerを作り、合体音を鳴らす- BGMを流す
- 完成チェックリストの項目をすべて確認する
- 最後にCtrl + Sで保存する
標準課題時間があれば
自分のゲームに仕上げる:
- 玉の画像を自分で用意したものに差し替える
- 背景とタイトルをつける
- 音量を調整して聞きやすくする
- 友達に遊んでもらって、感想をもらう
- もらった感想をもとに1つ以上改善する
発展課題チャレンジ
オリジナル要素を加える:
- ハイスコアを保存する(
PlayerPrefs) - 合体時にパーティクルエフェクトを出す
- 次に出る玉を予告表示する
- 特殊な玉(合体すると周りを消すなど)を追加する
- タイトル画面を別シーンで作る
- スマートフォン向けにビルドする(付録を参照)
12週間で身についたこと
Section titled “12週間で身についたこと”- Unityの画面と基本操作
- C#の書き方(変数・条件分岐・繰り返し・配列)
- オブジェクトを動かす、増やす、消す
- 物理エンジンと当たり判定
- UIとスコア表示
- ゲームの始まりと終わりを作る
- 音で気持ちよさを作る
いちばん大事だったこと
Section titled “いちばん大事だったこと”これから何を作るか
Section titled “これから何を作るか”作ったゲームは、ルールを変えれば別のゲームになります。
- 合体ではなく「同じ色を3つ並べたら消える」ルールにする
- 玉を落とすのではなく、飛ばして当てる
- 制限時間を付けて、時間内のスコアを競う