音を鳴らそう:効果音とBGM【Unityスタートガイド12-1】

ゲームは音が鳴るだけで、一気に「それっぽく」なります。コインを取ったらチャリン、ボタンを押したらピッ、後ろではずっとBGM。今回はUnityで効果音とBGMを鳴らす方法をご紹介します!

目次

この記事で学べること

  • 音のファイル(AudioClip)の取り込み方と、インポート設定の目安
  • Audio SourceとAudio Listenerの役割
  • スクリプトから効果音(PlayOneShot)とBGM(Play/Stop)を鳴らす方法
  • オブジェクトを消すときに音が途切れないようにする方法

前提知識

音を鳴らす仕組み

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を鳴らしてみよう

  1. Hierarchyで右クリック>Create Emptyを作り、名前をBGMにする
  2. Add Component>Audio>Audio Sourceを追加
  3. Audio SourceのAudio Generatorの欄に、BGMのファイルをドラッグ&ドロップ
    • 以前のバージョンでは「AudioClip」という名前の欄でした
  4. 下記のように設定して再生
  • Play On Awake:チェック(再生と同時に鳴る)
  • Loop:チェック(最後まで鳴ったら最初に戻る)
  • Volume:0.5ぐらい(0〜1)

再生して、BGMが流れれば成功!

主な設定項目

項目内容
Audio Generator鳴らす音のファイル(AudioClip)
Mute音を消す
Play On Awakeオブジェクトが有効になったときに自動で鳴らす
Loopくり返し鳴らす
Volume音量(0〜1)
Pitch音の高さと速さ(1が普通)
Spatial Blend0で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
スライム

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

フェアリー

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

次のステップ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次