Developer

【初心者Unity】BGM・SE(効果音)の付け方
2020.12.31
Lv1

【初心者Unity】BGM・SE(効果音)の付け方

ゲームを作成していく中で、音が欲しいな~、と思う場面ってたくさんありますよね。
例えば、キャラクターの足音、打撃音や発砲音、街の喧噪や川のせせらぎのような環境音などなど…。
Unityではこうしたニーズに対応して、簡単にサウンドを設定できるコンポーネントがいくつか用意されています。
本記事ではそれらのコンポーネントの内、基本となる音の再生・停止に関する項目について解説していこうと思います。

1.2つの必須コンポーネント


ゲームに音を付けるためには、以下の2つのコンポーネントが必須となります。
■AudioSource
音を再生するためのコンポーネント
■AudioListener
AudioSourceによって再生された音を聞き取るためのコンポーネント

具体例で考えてみましょう。
AudioSourceコンポーネントは音の発生源、例えば足音であったら、その足音を立てているキャラクターを表すゲームオブジェクトにアタッチします。
すなわち、ゲーム内で何らかの音を発するあらゆるゲームオブジェクトに設定する必要があるコンポーネントとなります。

一方、AudioListenerコンポーネントは、音を聞き取るためのコンポーネントです。
例えば、離れた位置にいるキャラクターの話し声は多少小さく聞こえて欲しいですし、遠ざかる車の音は次第に小さくなっていって欲しいものですが、これらを実現するためには、各ゲームオブジェクトが立てている音を聞いている場所という概念が必要になります。
俯瞰するような画面のゲームでしたら聞いているのはプレイヤーが操作するキャラクターですし、一人称のゲームでしたら聞いている場所は恐らくカメラの位置ということになるでしょう。
このように集音する基準点となるゲームオブジェクト(操作キャラクター・カメラ)に設定するのがAudioListenerコンポーネントです。

上の説明でわかりにくければ、(集音)マイクを想像してみると良いでしょう。
AudioListenerコンポーネントをアタッチしたゲームオブジェクトはゲーム内で(集音)マイクの役割を持ちます。
そのマイクで拾った音が、現実世界のスピーカーから流れ、我々ユーザーの耳に届く、という訳です。

以上をまとめると、
①AudioSourceコンポーネント(を設定したゲームオブジェクト)が音を発する
②AudioListenerコンポーネント(を設定したゲームオブジェクト)が音をキャッチする
③AudioListenerコンポーネントがキャッチした音が(現実世界の)スピーカーから出力される
という流れになります。
この関係性から想像される通り、AudioSourceコンポーネントとAudioListenerコンポーネントの位置関係によって、音の聞こえ方は異なってきます。
それでは、実際にUnity上でどのように音が聞こえるのか試してみましょう。

2.実例


それでは実際に音を出してみましょう。
以下のような構成を用意してください。

各ゲームオブジェクトの設定は以下のようになっています。
■3D Object > Sphere
・Transform.Position の値変更

・Rigidbodyコンポーネント追加
(Add Component > Physics > Rigidbody)
・Scriptコンポーネント追加
(Add Component > New Script)

スクリプトには以下の内容を記述します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // 中に記述された処理が一定間隔で繰り返し実行される
    void Update() {
        // このオブジェクトのRigidbodyコンポーネントのAddForce関数を呼び出し
        // Z軸方向に0.01fの力を、質量を考慮して瞬間的(ForceMode.Impulse)に加える
        GetComponent<Rigidbody>().AddForce(0, 0, 0.01f, ForceMode.Impulse);
    }
}

■3D Object > Plane
・Transform.Scale の値変更


今回は、Planeを道路、Sphereを救急車に見立てて音を鳴らしてみたいと思います。
まずはBGMの設定をしてみましょう。Planeから雑踏の音が発せられるような設定を追加します。
音の素材は効果音ラボ様のものを使用します。
DLした音源はプロジェクトビューにドラッグアンドドロップしてください。

■3D Object > Plane
・AudioSourceコンポーネント追加
(Add Component > Audio > Audio Source)
AudioClipにDLした雑踏の音(環境音ページの♪街の道路)をドラッグアンドドロップします。
また、Play On AwakeLoopにチェックを入れ、Spatial Blendを2Dに設定してください(各項目の説明は後述)。

これにてAudioSourceの設定は完了したので、続いてAudioListenerの設定を…と行きたいところですが、実はその必要はありません。
ゲーム作成時にデフォルトで作成されているゲームオブジェクトであるMain Cameraに、すでにAudioListenerとしての設定がされているのです。

よって、これですべての設定が完了です。
ゲームをスタートさせると、雑踏の音が再生されるかと思います。

続いて、救急車のサイレン音を設定してみましょう。
雑踏のBGMと同様の設定でも良いのですが、ここではSE(効果音)の設定の練習として、特定のキーを押すことでサイレンのON・OFFが切り換えられるようにしましょう(キャラクターの足音などはそうなっていますよね)。

■3D Object > Sphere
・AudioSourceコンポーネント追加
(Add Component > Audio > Audio Source)
AudioClipにDLしたサイレンの音(機械・乗り物ページの♪救急車サイレン1)をドラッグアンドドロップします。
また、Play On Awakeのチェックを外し、Spatial Blendを3Dに設定してください。

今回はスクリプトから音源の再生・停止を行う必要があります。
アタッチしているスクリプトを以下のように書き換えてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // 中に記述された処理が一定間隔で繰り返し実行される
    void Update() {
        // このオブジェクトのRigidbodyコンポーネントのAddForce関数を呼び出し
        // Z軸方向に0.01fの力を、質量を考慮して瞬間的(ForceMode.Impulse)に加える
        GetComponent<Rigidbody>().AddForce(0, 0, 0.01f, ForceMode.Impulse);
        // もし入力したキーが上矢印ならば、中の処理を実行する
        if (Input.GetKey(KeyCode.UpArrow)) {
            // AudioClipに設定した音源を再生する
            GetComponent<AudioSource>().Play();
        }
        // もし入力したキーが下矢印ならば、中の処理を実行する
        if (Input.GetKey(KeyCode.DownArrow)) {
            // AudioClipに設定した音源を停止する
            GetComponent<AudioSource>().Stop();
        }
    }
}

音源の再生にはAudioSourceコンポーネントのPlayメソッド、停止にはStopメソッドを使用します。
ゲームをスタートし、上矢印キーを押してサイレン音が再生されること、下矢印キーでサイレン音が停止することを確認してみてください。
また、Sphereが遠ざかるにつれてサイレン音が小さくなっていくことも確認できるかと思います。

今回は使用しませんでしたが、その他音源の再生・停止に関するメソッドとして、以下が用意されています。
すべてAudioSourceコンポーネントのメソッドになります。

メソッド名 説明
PlayOneShot Playメソッドと同様、音源を再生するメソッドです。
ただしPlayメソッドが音源の同時再生ができないのに対して、PlayOneShotメソッドは音源の同時再生に対応しています。
そのため、メニューの操作音やコインの取得音等、効果音が重なるような表現をする際にはこちらのメソッドを使用します。
Pause 再生中の音源を一時停止するメソッドです。
UnPause Pauseメソッドによって一時停止した音源の再生を再開するメソッドです。

3.主要項目の概説


今回の実例の中で触れたAudioSourceコンポーネントの項目について、簡単に解説します。

項目名 説明
Play On Awake チェックすることでゲーム起動時に自動的に音源が再生される設定になります。
Loop チェックすることで音源がループ再生されるようになります。
Spatial Blend 2Dの場合、Audio SourceとAudio Listener間の距離によらず、一定の音量で聞こえるようになります。
3Dの場合、Audio SourceとAudio Listener間の距離が聞こえる音量に影響するようになります。

 
 

連載目次リンク

「初心者のための」Unityゲーム制作 目次
 

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次