BGMや効果音をゲームで鳴らすにはどうしたらいいのかな?
本記事の内容
・Unityのサウンド周りの仕組み(超簡易版)
・BGM、SEを鳴らすオススメの無料アセット、AudioManagerの導入方法!
・SEの鳴らし方、BGMの鳴らし方、BGMの変更方法も紹介!
ゲーム中にBGMや効果音を鳴らしたい!
(前準備)音源を準備する
アタリマエ過ぎますが音を鳴らすなら音源が必要です。
有用な音源の無料配布サイトは以下の記事でまとめているので、ぜひ参考にしてみてください。
音声を再生するにはAudioClip(音源)とAudioSource(音源の再生)の2つが必要
次にUnity内の音源の仕組みについてです。
ゲーム制作において、音源を再生するには以下の3つのコンポーネントが必要になります。
コンポーネント | 役割 |
---|---|
AuidoClip | 音源のこと、ダウンロードしたりして取り込んだサウンド達です |
AuidoSource | 音源を再生するコンポーネントのこと、AuidioClipがCDだとすると、AudioSourceはCDプレイヤーの役割です。 |
AudioListener | 再生した音声を受信するコンポーネントのこと、通常カメラにデフォルトでアタッチされているのであまり意識する必要はありません。これにより、カメラに近い音は大きく聞こえて、遠い音は小さく聞こえます。 |
音源の再生はアセットに頼るのが吉
音源を再生するための処理を自分で作成することは可能ですが、初心者であればアセットに頼ることをオススメします。
単純に音源を再生するだけならそこまで難しくないのですが、音源が複数あり、場合によって使い分けたり、音量を調節したり、フェードイン/フェードアウトの処理を自前で作るには大分手間が掛かります。
こういったサウンド関連の処理をまとめてくれているアセットを使った方が、カンタンです。
それでも自分で、サウンドを鳴らす処理を作りたいという方向けのメモ。
初心者がやりがちな失敗として、ゲーム中に破壊される可能性があるオブジェクトに、AudioSourceを設定しないようにしましょう。
例えば、破壊時に音を出すオブジェクトの場合、音声の再生中に破壊してしまうとエラーになります。
なので、AudioSourceは破壊されない空のゲームオブジェクトにアタッチしておき、必要に応じてAudioSourceに設定するAudioClipをスクリプトから制御するのが望ましいです。
カンタンに音源の再生が可能な無料アセット、AudioManager
ではアセットの紹介です。
初心者向けには、Unityで開発をしてみたことがある人は誰しも一度はお世話になっているKan Kikuchiさんが制作されている、AudioManagerがオススメです。
無料でかつ、ゲーム演出に欲しい最低限必要な機能は一通り兼ね備えていて、有料アセットと遜色のないものになっています。
使い方の解説は以下リンク先(外部)にあります。
アセットのダウンロードはこちら。
上記の使い方記事にも書いてありますが、一応インストール方法を解説。
以下の画像にある緑のCodeボタンから、DownloadZIP
を選択。
ダウンロードしたファイルの「AudioManager(ver1.2).unitypackage」というファイルを、Unityエディタのプロジェクトビューにドラッグアンドドロップするだけです。
元サイトに詳しく使い方が書いてあるので、この記事ではより初心者向けに、実際に動かすまでの詳細手順と、少し応用させて、音量調整スライダーを作るところまでを実装してきます。
自分でダウンロードした音源を再生したい場合は、プロジェクトビューから以下のファイルパスに進んでください。
Assets > AudioManager_KanKikuchi > Resources
BGMかSEのフォルダ内に自前のダウンロードしたAudioClipを配置することで、自前の音源を使用することが出来ます。また、Resourcesフォルダの中に追加でフォルダを作成しても問題ないです。
ボタンを押したら効果音を再生する処理を作ってみる
まず、ボタンを押したら効果音を再生する機能を作ってみます。まずは、シーン内にボタンを作成して配置します。
前提として、ボタンの作り方は以下の記事で解説していますので、よければ参照ください。
やり方1:プログラムなしでカンタン実装
ボタンオブジェクトに、以下の画像のとおり、SEAssistantというコンポーネントを追加し、
以下の画像のとおり、クリック時の処理にSEAssistantの処理を紐づけて、Playという処理をセットします。
はい、これで終わりです。
再生するとボタンを押すとSEが再生されるようになっています(カンタン!)
ただ、個人的にはこのボタンのクリック時に処理をアタッチすることを推奨していません(理由は以下の関連記事を読んでください)ので、やり方2の方がオススメです。
やり方2:プログラムから実装
UIManagerというクラスを作成し、以下のコードを設定します。
using KanKikuchi.AudioManager;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
public Button soundBtn; //音を鳴らすボタン
void Start()
{
// ボタンのonClickイベントにリスナーを追加
soundBtn.onClick.AddListener(OnClickSoundBtn);
}
void OnClickSoundBtn()
{
SEManager.Instance.Play(SEPath.SYSTEM20);
}
}
空のゲームオブジェクト(UIManagerというオブジェクト名にしました)を作成して、UIManagerをアタッチ後、
インスペクタから、ボタンとUIManagerを紐づけを設定します。
これで終わりです。
ボタンを押してみると、SEが再生されます。
肝は、SEManager.Instance.Play(SEPath.SYSTEM20);
の部分です。
このコードがSEを鳴らす処理です。
SEPathのクラスにあるサウンドのパスを参照しています。SEPathの中身は以下のようになっています。
ボタンを押したらBGMを切り替える処理を作ってみる
次にBGMを切り替える処理を作ってみます。せっかくなので、以下の要件で作っていきたいと思います。
- ゲーム開始時BGMを再生
- ボタンを押すと、前のBGMがフェードアウトし、新しいBGMをフェードイン
- BGMは2曲あり、ボタンを押すたびに音源を切り替える
という流れで実装していきたいと思います。UIManagerのスクリプトを以下のように修正します。
using KanKikuchi.AudioManager;
using System;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
public Button soundBtn; //音を鳴らすボタン
public Button changeBGMBtn; //音を鳴らすボタン
private int bgmNo;
void Start()
{
// ボタンのonClickイベントにリスナーを追加
soundBtn.onClick.AddListener(OnClickSoundBtn);
changeBGMBtn.onClick.AddListener(OnClickChangeBGM);
bgmNo = 0;
ChangeBgmByIndex(bgmNo);
}
void OnClickSoundBtn()
{
SEManager.Instance.Play(SEPath.BOBOO);
}
void OnClickChangeBGM()
{
//2秒掛けてフェードアウトする処理
BGMManager.Instance.FadeOut(2.0f,() =>{
ChangeBgmByIndex(bgmNo);
//2秒掛けてフェードインする処理
BGMManager.Instance.FadeIn(2.0f);
});
}
void ChangeBgmByIndex(int index)
{
switch (index)
{
case 0:
//初期状態のBGM
BGMManager.Instance.Play(
audioPath: BGMPath.FANTASY14, //再生したいオーディオのパス
volumeRate: 1, //音量の倍率
delay: 0, //再生されるまでの遅延時間
pitch: 1, //ピッチ
isLoop: true, //ループ再生するか
allowsDuplicate: false //他のBGMと重複して再生させるか
);
bgmNo = 1;
break;
case 1:
//変更後のBGM
BGMManager.Instance.Play(
audioPath: BGMPath.BATTLE27, //再生したいオーディオのパス
volumeRate: 1, //音量の倍率
delay: 0, //再生されるまでの遅延時間
pitch: 1, //ピッチ
isLoop: true, //ループ再生するか
allowsDuplicate: false //他のBGMと重複して再生させるか
);
bgmNo = 0;
break;
default: break;
}
}
}
インスペクタから、UIManagerとボタンの紐づけを設定します。
これで設定は完了です。
ChangeBGMボタンを押すと、2秒かけて前の音源がフェードアウトし、2秒かけて新しい音源がフェードインするようになります。
(音声付き動画をこの記事で流すと著作権的に危なそうなので、実際の動きはご自身で確かめてみてください)
まとめ
以上、Unityで音源を再生する方法でした。
無料でここまでのアセットを作ってくれているKan.Kikuchiさんには頭が上がらないですね。
それでは素敵なゲーム制作ライフを!
コメント
コメント一覧 (1件)
[…] 【神アセット】無料でUnityでBGM・SEを簡単に鳴らす方法 BGMや効果音をゲームで鳴らすにはどうしたらいいのかな? 本記事の内容 […]