【Unity】効果音やBGMなど音の付け方・鳴らし方

Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityで音の付け方を知りたい。」

「効果音を鳴らしたいんだけど、やり方が分からない。」

というお悩みの方に向けた内容となっています。

ゲーム作りでは、動きに合わせた効果音やゲーム内で流れるBGMは、ゲームをプレイする際に重要になってきます。

Unityでゲーム内で音を鳴らす場合は、AudioSourceコンポーネントというものを使います。

このAudioSourceコンポーネントは、シーン内でAudio Resourceに設定した音声データを流すという役割を持つコンポーネントです。

そこで、このページでは、Unityで効果音やBGMなどの音を付けたり鳴らしたりする方法を紹介していきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Unityで音を鳴らす方法

Unityで音を鳴らす場合、

という基本的に3つの設定が必要になってきます。

AudioSourceコンポーネントを付ける

まずは、音を鳴らしたいオブジェクトに対して、AudioSourceコンポーネントを付けていきます。

このAudioSourceコンポーネントは、そのオブジェクトから音を発生させるという役割を持っていて、音声データを紐づけたり、音量やピッチなどを調整することができるコンポーネントです。

AudioSourceコンポーネントの付け方は、オブジェクトを選択してインスペクターウィンドウの「Add Component」をクリック、

AudioからAudioSourceを選択します。

これで、AudioSourceコンポーネントを付けることができました。

なお、AudioSourceが音の発生であれば、その音声を聞き取るためのコンポーネントとして、AudioListenerコンポーネントというものもあります。

AudioListenerコンポーネントは、基本的にカメラのオブジェクトに付いているもので、その位置から聞こえる音が実際に流されることになります。

デフォルトのMainCameraにも付いているので、特に設定をする必要はありませんが、音を流す際に知っておくと良いでしょう。

Audio Resourceに音声データを紐づける

次に、先ほどのAudioSourceコンポーネントの中にあるAudio Resourceにどの音声データを流すのか紐づけていきます。

音声データは、画像などと同じく、先にプロジェクトウィンドウにインポートしておきましょう。

なお、Unityでは、ほとんどの音声データの拡張子を使うことができ、インポートするとAudio Clipというデータ形式で保存されることになります。

主な音声データの拡張子
.mp3 .ogg .wav .aiff .modなど

そして、そのAudio ClipをAudio Resourceの項目にドラッグ&ドロップしてあげることで、紐づけることができます。

これで、AudioSourceコンポーネントに音声データを紐づけることができました。

Audio Resourceの音声を鳴らすやり方

AudioSourceコンポーネントのAudio Resourceに音声データを紐づけられたら、後はゲーム内のタイミングに合わせて音を鳴らす処理を行っていきます。

ここでは、

の3つの鳴らし方について紹介していきます。

アクティブになったら音を流す

オブジェクトがアクティブになったタイミングで音を流す場合、AudioSourceコンポーネントにある「Play On Awake」にチェックを入れておきます。

このPlay On Awakeは、デフォルトでチェックが入っていて、オブジェクトが生成されたタイミングで音を流すという処理が行われます。

そのため、オブジェクトが初めからアクティブ状態の場合、ゲームを実行してすぐにその音声データが流れることになります。

もし、オブジェクトが生成されたタイミングで音声を流したくない場合は、Play On Awakeのチェックを外しておきましょう。

Playメソッドで音を流す

AudioSourceコンポーネントで定義されているPlayメソッドで、音声を好きなタイミングで流すことができます。

例えば、スペースキーを押したタイミングで、音声を流したいという場合は、以下のようなスクリプトをオブジェクトにアタッチしておきます。

using UnityEngine;

public class SoundManager : MonoBehaviour
{
    AudioSource audioSource;

    void Start()
    {
        audioSource = GetComponent<AudioSource>();  // AudioSourceコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))  // スペースキーを押した場合
        {
            audioSource.Play(); // 音声を流す
        }
    }
}

Playメソッドを使うためにはAudioSourceコンポーネントを取得しておく必要があるので、Startメソッドの9行目でGetComponentを使って、AudioSourceを取得しています。

そして、16行目のスペースキーを押した処理の中で、Playメソッドを書いて音を流しています。

このPlayメソッドは、

AudioSource.Play();

と書くことで、AudioSourceコンポーネントに紐づいているAudio Resourceを流す処理を行ってくれます。

実際にゲームを実行してスペースキーを押すと、音声が流れると思います。

PlayOneShotメソッドで音を流す

AudioSourceコンポーネントには、Playメソッドともう一つ、PlayOneShotメソッドが定義されています。

このPlayOneShotメソッドは、音声を重ねて流すことができます。

もう少し詳しく説明すると、PlayOneShotメソッドで音を流していた場合、再度音を流す処理が行われると、それぞれの音声が重なって流れるようになります。

一方で、先ほどのPlayメソッドを使って音を流していた場合は、再度音を流そうとすると、重複されず最初に流れていた音が止まり、もう一度頭から再生されることになります。

そのため、PlayOneShotメソッドは効果音などの重複する再生に適していて、PlayメソッドはBGMなどの再生に適しています。

また、PlayOneShotメソッドを使う際は、

AudioSource.PlayOneShot(音源のclipデータ, 音量の倍率);

と、第一引数にAudioSourceのAudio Clipデータ、第二引数にfloat型で音量の倍率を指定することができます。

なお、第二引数は省略することができます。

例えば、先ほどと同じくスペースキーを押したら音声を流す場合、

using UnityEngine;

public class SoundManager : MonoBehaviour
{
    AudioSource audioSource;

    void Start()
    {
        audioSource = GetComponent<AudioSource>();  // AudioSourceコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))  // スペースキーを押した場合
        {
            audioSource.PlayOneShot(audioSource.clip); // 音声を流す
        }
    }
}

のように、16行目でPlayOneShotメソッドで流したい音声データを指定してあげます。

実際にゲームを実行して連続でスペースキーを押すと、音が重なって流れているのがわかると思います。

まとめ

このページでは、Unityのゲーム内で音を鳴らす方法についてまとめていきましたが、いかがでしたでしょうか?

Unityで音を鳴らす場合は、オブジェクトにAudioSourceコンポーネントを付けてあげて、AudioClipに音声データを紐づけることで、音声を流すことができます。

音声をゲーム内のタイミングに合わせて鳴らす場合は、PlayメソッドもしくはPlayOneShotメソッドを使うことで、そのタイミングで音声を流す処理を行うことができます。

ゲームにおいて、音声があるのと無いのとでは楽しみ方が大きく異なるので、ゲーム内に音声もしっかりと付けておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント