コンテンツにスキップ

第12週:音をつけて仕上げよう

前回は制限時間とリトライを作りました。

  • Time.deltaTimeを引いて残り時間を減らした
  • Mathf.CeilToIntで秒数を見やすく表示した
  • SceneManager.LoadSceneでやり直した
  • BGMと効果音の違いを理解する
  • 音ファイルを取り込んで鳴らす
  • 合体したときに音を鳴らす
  • 全体を調整して自分のゲームに仕上げる

音は「あとで付ける飾り」ではありません。 ゲームの気持ちよさを決める大きな要素です。

BGM 効果音(SE)
長さ 長い(数分) 短い(1秒以下)
鳴り方 ずっとループ そのときだけ1回
役割 雰囲気づくり 操作の手ごたえ
このゲームでは ゲーム中ずっと流す 合体、玉を落とす、時間切れ
ファイル形式 .mp3 .ogg .wav
用途 ファイル名の例 どんな音を選ぶか
合体 merge.wav ポン、キラッ(短く明るい音)
玉を落とす drop.wav ポトッ(ごく短い音)
時間切れ gameover.wav ブザー、下がる音
BGM bgm.mp3 落ち着いた、繰り返し聞ける曲
  1. Assetsを右クリック → Create → Folder
  2. 名前をSoundsにする
  3. 音ファイルをSoundsフォルダにドラッグ&ドロップ
音ファイルの取り込み
音ファイルの取り込み
もの 役割
AudioClip 音のデータそのもの(取り込んだファイル)
AudioSource 音を鳴らす装置(スピーカー)
項目 初期値 意味
AudioClip None 鳴らす音
Play On Awake オン 開始と同時に鳴らすか
Loop オフ 繰り返すか(BGMはオン)
Volume 1.0 音量(0〜1)
Pitch 1.0 音の高さ(1より大きいと高くなる)

なぜ「係」に鳴らしてもらうのか

Section titled “なぜ「係」に鳴らしてもらうのか”

合体の音を鳴らしたいので、玉にAudioSourceを付けたくなります。 でも、これはうまくいきません。

  1. Hierarchyで右クリック → Create Empty

  2. 名前をSoundManagerに変更

  3. Add Component → Audio Sourceを追加

  4. Play On Awakeチェックを外す

  5. Assets/ScriptsSoundManagerスクリプトを作る

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);
}
}
  1. SoundManager.csSoundManagerオブジェクトにドラッグ
  2. Inspectorで設定:
    • Se Source欄に、Hierarchyの SoundManager自身をドラッグ
      (同じオブジェクトのAudio Sourceが自動で入ります)
    • Merge Clipmerge
    • Drop Clipdrop
    • Game Over Clipgameover
SoundManagerの設定
SoundManagerの設定
メソッド 特徴
Play() AudioClip欄の音を鳴らす。 鳴っている音は止まる
PlayOneShot(clip) 指定した音を鳴らす。 重ねて鳴らせる

前回スコアを足した場所に、音の呼び出しを追加します。

// スコアを足す
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();
}

再生して遊んでみてください。

合体するたびに音が鳴ります! 大きい玉になるほど音が高くなるのも確認しましょう。

音が鳴るゲーム画面
音が鳴るゲーム画面

効果音とBGMは、別のAudioSourceで鳴らします。 音量を別々に調整できるようにするためです。

  1. Hierarchyで右クリック → Create Empty
  2. 名前をBgmPlayerに変更
  3. Add Component → Audio Source
  4. Inspectorで設定:
    • AudioClipbgmをドラッグ
    • Play On Awakeオンのまま
    • Loopオンにする
    • Volume0.3くらいに下げる

ここまでで機能は完成です。 残りの時間で自分のゲームらしく仕上げましょう。

  • クリックした場所から玉が落ちる
  • 玉が箱の中に積み上がる
  • 同じ玉同士が合体して1つ大きくなる
  • 合体後の玉が1個だけできる(2個できていない)
  • 合体するとスコアが増える
  • 制限時間がカウントダウンされる
  • 時間切れでゲームオーバーになり、最終スコアが出る
  • RETRYボタンでやり直せる
  • 合体の音、落とす音、BGMが鳴る
  • エラー(赤い表示)が出ていない
やること 方法
自分の画像に差し替え 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に任せる
症状 原因と対処法
音が鳴らない 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
  • 合体時にパーティクルエフェクトを出す
  • 次に出る玉を予告表示する
  • 特殊な玉(合体すると周りを消すなど)を追加する
  • タイトル画面を別シーンで作る
  • スマートフォン向けにビルドする(付録を参照)
  • Unityの画面と基本操作
  • C#の書き方(変数・条件分岐・繰り返し・配列)
  • オブジェクトを動かす、増やす、消す
  • 物理エンジンと当たり判定
  • UIとスコア表示
  • ゲームの始まりと終わりを作る
  • 音で気持ちよさを作る

作ったゲームは、ルールを変えれば別のゲームになります。

  • 合体ではなく「同じ色を3つ並べたら消える」ルールにする
  • 玉を落とすのではなく、飛ばして当てる
  • 制限時間を付けて、時間内のスコアを競う