Unity連携編.04 / CriAtomSourceを使わずに音を鳴らす
ADX2 for Unityプラグインは、Unity標準のAudio Sourceを模した「Cri Atom Source」コンポーネントを持っています。
これをシーンに配置することによって音を鳴らすことができます。
たとえばこんな感じに、シーンにゲームオブジェクトを作って、Cri Atom Sourceコンポーネントをアタッチします。
Audio Sourceと使い勝手が近く、各種パラメーターもインスペクターから変更できるため使いやすいです。
また、このコンポーネントは音源の位置や距離を音に反映する3Dサウンド向けの機能を内包しており、ゲームオブジェクトの位置に応じた3Dサウンドの処理を自動で行います。
しかし、BGMやボタンを押した音などの効果音には3Dサウンドは使わないため、少々冗長です。ADX2はシーンにコンポーネントを配置しなくても、再生用のクラスをスクリプトで直接インスタンスを作って再生することができます。
ADX2の使い道に慣れてきたら、Cri Atom Sourceを使わず、スクリプトで直接音を鳴らす方法を併用するとヒエラルキーがすっきりします。
CriAtomExPlayerクラスを利用する
Atom Sourceは、内部で再生用のクラスとしてCriAtomExPlayerクラスを生成しています。このクラスを自前で作ることで、2Dのサウンドを簡単に再生するスクリプトを用意できます。
次のスクリプトファイルを見てください。このスクリプトは、メンバに指定されたキューシートの読み込み処理を行った後、「BGMの再生」としてキューを再生します。
using System.Collections;
using UnityEngine;
public class BGMPlayer : MonoBehaviour
{
public string CueSheetName;
public string AcbFilePath;
private CriAtomExAcb acb;
private CriAtomExPlayer atomExPlayer;
public string BgmCueName;
private void Awake()
{
atomExPlayer = new CriAtomExPlayer();
}
private IEnumerator Start()
{
var cueSheet = CriAtom.AddCueSheet(CueSheetName, AcbFilePath, "");
while (cueSheet.IsLoading)
{
yield return null;
}
acb = cueSheet.acb;
PlayBgm(BgmCueName);
}
public void PlayBgm(string bgmCueName)
{
if (!acb.Exists(bgmCueName)) return;
atomExPlayer.SetCue(acb, bgmCueName);
atomExPlayer.Start();
}
public void StopBgm()
{
atomExPlayer.Stop();
}
}
キューシート(ACBファイル)のインスタンスを保持するCriAtomExAcbメンバと、CriAtomExPlayerクラスを保持するメンバがあります。
はじめに、CriAtom.AddCueSheet()メソッドから、指定されたパスのACBファイルをロードします。
もし、シーン内のCRIWAREゲームオブジェクト(CriAtomコンポーネントがアタッチされたゲームオブジェクト)のインスペクター内でキューシートが指定されている場合は、この読み込み処理は必要ありません。読み込みが終わったら、CriAtomExPlayerのインスタンスを生成しています。
インスペクターでの見え方は次の通りです。
PlayBgmメソッドは、引数に渡されたキュー名がこのクラスの持つキューシート内に存在するか調べ、存在する場合は再生します。
この例では、CueSheet_0.acbにbgm_loopキューシートがあるか調べ、あれば再生します。
CriAtomExPlayerは、再生処理のメソッドが少し変わっています。最初にSetCue()メソッドでacbの参照とキュー名をセットし、その後Start()メソッドを呼びます。
CriAtomExPlayerの用途
例のように、BGMの再生といったような、ゲーム中ずっと存在する再生インスタンスに対しては、CriAtomExPlayerでの再生に向いています。
ボタンを押した音などの効果音再生にも使えますが、シーンを破棄する際などは、自分でCriAtomExPlayerのインスタンスを破棄する必要があることに注意してください。
具体的には、OnDestroyオーバーライドメソッドでゲームオブジェクトが破棄された際にCriAtomExPlayer.Dispose()を呼びます。
private void OnDestroy()
{
CriAtom.RemoveCueSheet(CueSheetName);
atomExPlayer.Dispose();
}
アドベンチャ―ゲームスタイルのキャラクター会話シーンが入るようなゲームの場合は、セリフ音声の再生に便利です。
CriAtomExPlayerをシナリオ進行のシステムを組み合わせることで、スクリプトの見通しがよくなります。
ゲーム空間内に配置された敵の声や物体の音については3Dサウンドの処理を行うため、CriAtomSourceの利用がおすすめです。