ゲームは音が鳴るだけで、一気に「それっぽく」なります。コインを取ったらチャリン、ボタンを押したらピッ、後ろではずっとBGM。今回はUnityで効果音とBGMを鳴らす方法をご紹介します!
この記事で学べること
- 音のファイル(AudioClip)の取り込み方と、インポート設定の目安
- Audio SourceとAudio Listenerの役割
- スクリプトから効果音(PlayOneShot)とBGM(Play/Stop)を鳴らす方法
- オブジェクトを消すときに音が途切れないようにする方法
前提知識
- その他のよく使うコンポーネント:Audio Sourceの概要
- よく使うUnity専用の関数とプロパティ:GetComponentと[SerializeField]
- 衝突を検知しよう:当たり判定のイベントとタグ:コインを取る仕組み
音を鳴らす仕組み
Unityの音は、3つの登場人物で鳴ります。
- AudioClip:音のファイルそのもの(wav・mp3・oggなど)
- Audio Source:音を鳴らすスピーカー。オブジェクトに付けるコンポーネント
- Audio Listener:音を聞く耳。普通はMain Cameraに最初から付いている
「Audio SourceにAudioClipをセットして鳴らし、それをAudio Listenerが聞く」というイメージです。
スライムAudio Listenerはシーンに1つだけにしましょう。カメラを増やしたときに2つ付いていると、Consoleに警告が出ます
音のファイルを取り込む
取り込み方
- 音のファイルを、ProjectウィンドウのAssetsにドラッグ&ドロップ
- Assets/Soundsのようにフォルダを分けておくと探しやすいです
- 使える形式:wav、mp3、oggなど
インポート設定の目安
音のファイルを選ぶと、Inspectorに設定が表示されます。
- 効果音(短い音)
- Load Type:Decompress On Load
- BGM(長い音)
- Load Type:Streaming(少しずつ読み込むので、メモリを使いすぎない)
- 設定を変えたら、下のApplyを押す
最初は初期設定のままでも鳴ります。音の数が増えてきたら見直せばOKです。
Audio Sourceの設定
BGMを鳴らしてみよう
- Hierarchyで右クリック>Create Emptyを作り、名前をBGMにする
- Add Component>Audio>Audio Sourceを追加
- Audio SourceのAudio Generatorの欄に、BGMのファイルをドラッグ&ドロップ
- 以前のバージョンでは「AudioClip」という名前の欄でした
- 下記のように設定して再生
- Play On Awake:チェック(再生と同時に鳴る)
- Loop:チェック(最後まで鳴ったら最初に戻る)
- Volume:0.5ぐらい(0〜1)
再生して、BGMが流れれば成功!
主な設定項目
| 項目 | 内容 |
|---|---|
| Audio Generator | 鳴らす音のファイル(AudioClip) |
| Mute | 音を消す |
| Play On Awake | オブジェクトが有効になったときに自動で鳴らす |
| Loop | くり返し鳴らす |
| Volume | 音量(0〜1) |
| Pitch | 音の高さと速さ(1が普通) |
| Spatial Blend | 0で2D(どこでも同じ音量)、1で3D(距離や左右で聞こえ方が変わる) |
Spatial Blendの使い分け
- BGMや、画面のどこで鳴っても同じ音量でいい効果音 → 0(2D)
- 3Dゲームで、遠くの敵の足音を小さく・左右から聞こえるようにしたい → 1(3D)
スクリプトから鳴らす
効果音:PlayOneShot
効果音は、PlayOneShotで鳴らします。同じAudio Sourceで、音を重ねて何回でも鳴らせます。
using UnityEngine;
public class SoundTest : MonoBehaviour
{
[SerializeField] private AudioSource audioSource;
[SerializeField] private AudioClip jumpSound;
void Start()
{
// 効果音を1回鳴らす(2つ目の数字は音量の倍率)
audioSource.PlayOneShot(jumpSound, 1.0f);
}
}
[SerializeField]にしておいて、InspectorでAudio SourceとAudioClipをセットします- Audio SourceのAudio Generatorの欄は空のままでOK(鳴らす音は
PlayOneShotに渡すので)
BGM:Play と Stop
using UnityEngine;
public class BgmPlayer : MonoBehaviour
{
[SerializeField] private AudioSource bgmSource;
[SerializeField] private AudioClip stageBgm;
void Start()
{
PlayBgm(stageBgm);
}
// BGMを切り替えて鳴らす
public void PlayBgm(AudioClip clip)
{
bgmSource.clip = clip;
bgmSource.loop = true;
bgmSource.Play();
}
// BGMを止める
public void StopBgm()
{
bgmSource.Stop();
}
}
| 書き方 | 使いどころ |
|---|---|
audioSource.PlayOneShot(clip) | 効果音。重ねて鳴らせる |
audioSource.clip = clip; → audioSource.Play() | BGM。鳴っている音は切り替わる |
audioSource.Stop() | 止める |
audioSource.isPlaying | 今鳴っているか(true/false) |



効果音はPlayOneShot、BGMはPlay!この2つを覚えておけば、ほとんどの音は鳴らせるよ
コインを取ったら音を鳴らす
6-10のコイン集めに、「チャリン」を足してみましょう。
よくある失敗:コインに付けたAudio Sourceで鳴らす
コインにAudio Sourceを付けて、取った瞬間に鳴らしてすぐDestroyすると、Audio Sourceもコインと一緒に消えてしまうので、音がすぐに途切れます(または聞こえません)。
鳴らし方は2つあります。
方法1:プレイヤー側で鳴らす
プレイヤーにAudio Sourceを付けて、コインを取ったらプレイヤーが鳴らします。
using UnityEngine;
public class CoinSound : MonoBehaviour
{
[SerializeField] private AudioSource audioSource;
[SerializeField] private AudioClip coinSound;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Coin"))
{
audioSource.PlayOneShot(coinSound);
}
}
}
- PlayerにAudio Sourceと、このCoinSoundを追加して、InspectorでAudio SourceとCoinの効果音をセットします
- 6-10のCoinCollectorと一緒に付けておけば、コインを消すのはCoinCollector、音を鳴らすのはCoinSound、と役割を分けられます
- 2Dゲームなら
OnTriggerEnter2D(Collider2D other)に書き換えます
方法2:AudioSource.PlayClipAtPointで鳴らす
AudioSource.PlayClipAtPoint(coinSound, transform.position);
指定した位置に音だけのオブジェクトを一時的に作って鳴らし、鳴り終わったら自動で消してくれます。消えるオブジェクトの側から鳴らしたいときに便利です。ただし3Dの音(距離で音量が変わる)として鳴るので、カメラから遠い位置だと小さく聞こえます。
音量をまとめて変えるには
9-5の記事で作った音量スライダーでは、AudioListener.volumeでゲーム全体の音量を変えていました。
AudioListener.volume:すべての音の音量(0〜1)audioSource.volume:そのAudio Sourceだけの音量
「BGMだけ小さく」「効果音だけ大きく」のように分けて調整したい場合は、Audio Mixerを使います。詳しくはAudioMixerを使った音量調整方法についてで紹介しています。
よくあるエラーと対処法
エラー:音が鳴らない
- 原因:Audio SourceのAudio Generatorが空、Volumeが0、Muteにチェック、またはゲームビューのMute Audioがオンになっている
- 対処法:Inspectorの設定と、ゲームビュー右上のMute Audioを確認する
警告:There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.
- 原因:Audio Listenerが2つ以上ある(カメラを複製したときなど)
- 対処法:Main Camera以外のカメラのAudio Listenerを削除する
エラー:音がすぐ途切れる
- 原因:鳴らしているAudio Sourceのオブジェクトを、すぐにDestroyしている
- 対処法:消えないオブジェクト(プレイヤーなど)で鳴らすか、
AudioSource.PlayClipAtPointを使う
エラー:NullReferenceException(PlayOneShotの行)
- 原因:InspectorでAudio Sourceを設定し忘れている
- 対処法:
[SerializeField]の欄が「None」になっていないか確認する
まとめ
- 音はAudioClip(ファイル)・Audio Source(スピーカー)・Audio Listener(耳)の3つで鳴る
- 効果音はPlayOneShot、BGMはclipをセットしてPlay
- 消えるオブジェクトから鳴らすと途切れるので、プレイヤー側で鳴らすかPlayClipAtPoint
- 全体の音量は
AudioListener.volume、細かく分けるならAudio Mixer



フリー素材の効果音を入れたら、急に本物のゲームっぽくなった・・・



音の力はすごいよね!ただし音素材の利用条件(クレジット表記など)は、配布元のページで確認しておこうね
コメント