UnityでささっとBGMや効果音を鳴らす方法です。
音源データの書式の説明が古くなっていたので修正(2022/7/2)
列挙子などの名前をパスカル ケースに変更(2021/6/28)
目次
前提
Unityでとりあえず手っ取り早くBGMや効果音を鳴らしたい!というためのサンプルコードと手順です。機能は以下の通りです。
BGM
シーンごとに、設定したBGMを再生します
BGMをループ再生できます
同じシーン内で曲は変えません
シーンを跨いだBGMの再生には対応しません
SE
1つのオブジェクトですべての効果音を再生します
3Dサウンド は使いません
プロジェクトの準備
Unity2019.1.5での実装例です。
Unityでプロジェクトを新規に作るか、音を鳴らしたいプロジェクトを開きます
利用したい音源データ(ogg
、mp3
、wav
など)を用意したら、Project ウィンドウの任意のフォルダーにドラッグ&ドロップしてインポートします
BGMをAudios/BGM
フォルダー、SEをAudios/SE
フォルダーにまとめた場合、以下のような感じになります
音源データのインポート
音データの種類
Unityでは色々な音声データが利用できます(オーディオファイル - Unity マニュアル )。それらのうち、主に利用するのはogg
とmp3
、wav
の3種類かと思います。
ogg
とmp3
は録音したデータを圧縮したもので、やや音が劣化しますが容量が小さくなります。
(参考: oggとMP3の違いは何でしょうか?持ってるmp3の機械には対応して... - Yahoo!知恵袋 )
wav
は録音したデータをそのまま保存する形式です。同じ条件で録音した場合、ogg
やmp3
よりも容量が大きくなる代わりに音の劣化がありません。
Unityではプロジェクトに音源データを加えた時に内部形式に変換するので、どの形式の音源を使ってもビルドや実行時に違いはありません。
WebGL 環境だとキンキンした音の最後にノイズが入ることがあります。特にwav
形式で発生する印象があります。そのような場合は、以下のようなサイトで形式を変更したりすると直ることがあります。
Load Typeについて
読み込んだ音声データを選択した時にInspector に表示される設定です。効果音やゲーム中のBGMの場合はデフォルトのままで大丈夫です。
タイトル画面やゲームオーバーなど、処理が多少重くなっても構わないようなシーンでは、Load Type をStreaming に変更すると音が鳴り始めるのが早くなる(はず)で、よさげです。
タイトルやゲームオーバー用の音源はStreamingにするとよいかも
BGMを鳴らす
BGMを鳴らします。
Hierarchy ウィンドウのCreate をクリックして、Create Empty をクリックして空のゲームオブジェクトを作成して、名前をTinyAudio
などにします
Inspector ウィンドウのAdd Component をクリックして、Audio > Audio Source をクリックします
Project ウィンドウから、そのシーンで鳴らしたいBGMの音源ファイルをドラッグして、Inspector ウィンドウのAudio Clip 欄にドロップします
音源データをAudio Clip欄にドラッグ&ドロップ
BGMをループ再生したい場合は、Inspector ウィンドウのLoop 欄にチェックを入れます
Loop設定
以上で設定完了です。UnityをPlay するとBGMが再生されます。BGMはこれでOKです。
効果音を鳴らすためのクラスを作る
効果音はTinyAudio
というクラスを作成して、スクリプト から呼び出して鳴らすようにします。
Hierarchy ウィンドウから先ほど作成したTinyAudio オブジェクトをクリックして選択します
Inspector ウィンドウのAdd Component をクリックして、New script をクリックして、TinyAudio
などの名前でスクリプト を作ります
スクリプト は、Scripts
フォルダーなどを作って、そこにまとめておくのがオススメです
Project ウィンドウから作成したTinyAudio スクリプト をダブルクリックしてエディターで開きます
以下のコードを入力、あるいはコピペします
using UnityEngine;
public class TinyAudio : MonoBehaviour
{
public static TinyAudio Instance { get; private set; }
< summary >
</ summary >
public enum SE
{
Click,
Hit,
Magic
}
[Tooltip("効果音のAudio Clipを、SEの列挙子と同じ順番で設定してください。" ), SerializeField]
AudioClip[] seList;
AudioSource audioSource;
private void Awake()
{
Instance = this ;
audioSource = GetComponent<AudioSource>();
}
< summary >
</ summary >
< param name ="se" > </ param >
public static void PlaySE(SE se)
{
Instance.audioSource.PlayOneShot(Instance.seList[(int )se]);
}
}
上書き保存したら、Unityに切り替えます
Hierarchy ウィンドウからTinyAudio オブジェクトをクリックして選択します
Project ウィンドウから効果音のファイルをドラッグして、Inspector ウィンドウのSe List 欄にドロップします
設定する順番は、TinyAudio スクリプト のSE
列挙子に対応付けていきます。Click はクリック音、Hit は攻撃音、Magic は魔法のような音ということで、その順番に設定します
AudioClipを設定
効果音を鳴らす
スクリプト からTinyAudio.PlaySE(TinyAudio.SE.Click);
のように呼び出せば指定した効果音が鳴ります。TinyAudio.SE.Click
は、TinyAudio.cs
の10行目付近に宣言してあります。SE
列挙子の最初(0番目)なので、Se List のElement 0 に設定した音が鳴ります。
試しに、数字キーで効果音を鳴らす機能を実装します。
Hierarchy ウィンドウのCreate をクリックして、Create Empty をクリックして、空のゲームオブジェクトを作成して、SETest
などの名前にします
Inspector ウィンドウのAdd Component をクリックして、New script を選択して、SETest
などの名前にします
SETest
スクリプト は、Scripts
フォルダーに移動しておくとよいです
SETest
スクリプト をダブルクリックして、以下のコードにします
using UnityEngine;
public class SETest : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
TinyAudio.PlaySE(TinyAudio.SE.Click);
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
TinyAudio.PlaySE(TinyAudio.SE.Hit);
}
if (Input.GetKeyDown(KeyCode.Alpha3))
{
TinyAudio.PlaySE(TinyAudio.SE.Magic);
}
}
}
以上で保存して、Unityに切り替えてPlayします。数字キーの1
、2
、3
でそれぞれ効果音が鳴ります。
数字キーを連打すると、効果音が同時に鳴ることが確認できます。今回のように音に3D空間の効果を使わない場合は、1つのAudio Source でBGMも効果音も鳴らせます。
シーン切り替えに対応する
他のシーンでもBGMを鳴らせるようにします。
Hierarchy ウィンドウからTinyAudio オブジェクトをドラッグして、Project ウィンドウにドロップしてプレハブ化します
プレハブは、Prefabs
などのフォルダーを作ってまとめておくのがおススメです
ついでにSETest オブジェクトのドラッグ&ドロップしてプレハブ化しておきます
[Ctrl]+[S]キーでシーンを保存します
新しいシーンを作るか、既存の別のシーンに切り替えます
Project ウィンドウから、TinyAudio プレハブをドラッグして、Hierarchy ウィンドウにドロップします
必要に応じて、Project ウィンドウからSETest プレハブをドラッグして、Hierarchy ウィンドウにドロップします(効果音の再生テストが不要な場合は不要です)
Hierarchy ウィンドウのTinyAudio オブジェクトをクリックして選択します
新しいシーン用のBGMをProject ウィンドウからドラッグして、Inspector ウィンドウのAudioClip 欄にドロップします
BGMの音源データを設定
BGMをループさせたいかどうかに応じて、Inspector ウィンドウのLoop 欄のチェックをつけるか、外します
ループ設定
以上で完了です。PlayするとBGMが鳴ります。SETest オブジェクトを設定してあれば、数字キーの1
、2
、3
で効果音が鳴ります。
シーンを切り替えたら、そのシーンに設定したBGMが鳴り始めます。
効果音の増やし方や変え方
効果音を増やしたり変えるには、TinyAudio
クラスのSE
列挙子の宣言を変更して、それに合わせてTinyAudio オブジェクトに設定する効果音リストを更新します。
Project
ウィンドウからTinyAudio
スクリプト をダブルクリックして、エディターで開きます
使いたい効果音を全て列挙子SE
に定義します。例えば食べる効果音を増やしたいなら、Eat
などの名前で定義を追加します
列挙子を増やす
上書き保存したらUnityに切り替えます
Project ウィンドウのTinyAudio プレハブをクリックして選択します
TinyAudioプレハブを選択する
Project ウィンドウから追加したい音データをドラッグして、Inspector ウィンドウのSe List 欄にドロップするか、Size を増やして該当するスロットにドロップします
以下、matchstick-put-fire1
を追加している例です
音を追加
以上で完了です。あとはスクリプト からTinyAudio.PlaySE(TinyAudio.SE.Eat);
のように呼び出すことで、新しく追加した音を鳴らすことができます。
まとめ
シーン切り替え時に効果音が途切れたり、BGMがシーンを跨げないなど気になる部分はありますが、一先ずBGMと効果音を鳴らすことができました。2DゲームやUIのシステム音など、鳴っている場所の影響を受けない音はここで紹介した以下のような方法が効率よいです。
BGMは、Audio Source のAudio Clip 欄に音データを設定して再生
SEは、PlayOneShot()
で再生
3D対応させたり、最初に記載したような多様な機能を実装したい場合は以下のブログなどが役に立つと思います。
kan-kikuchi.hatenablog.com
qiita.com
参考URL