Unity ADX2LE 演出付きでBGMを再生する CriAtomExPlayer

UnityでADX2LEを用いた演出付きBGM再生

サウンドミドルウェアのADX2LEを用いたBGM再生についてまとめてみた。
※自己流のため参考程度にお願いします。

サンプルプログラム1

using CriWare;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class SoundSample : MonoBehaviour {
   public CriAtomSource criAtomSource;
   public string bgmCueSheet = "BGM";
   public string[] bgmCueNames = new string[] { "BGM1", "BGM2", "BGM3", "BGM4", "BGM5" };   //キューシート「BGM」に入っているキューの名前一覧
   private CriAtomExPlayer exPlayer, exPlayer2;
   private CriAtomExAcb atomExAcb;
   int num = 0;

   private IEnumerator Start(){
      /* キューシートファイルのロード待ち */
      yield return new WaitUntil(() => !CriAtom.CueSheetsAreLoading);

      atomExAcb = CriAtom.GetAcb("BGM");   //BGMの入ったACBファイルを拾う

      //クロスフェードPlayer
      exPlayer = new CriAtomExPlayer();   //プレイヤーの生成
      exPlayer.SetCue(atomExAcb, bgmCueNames[0]); //プレイヤーにキューをセットする
      exPlayer.Loop(true);   //プレイヤーにループを設定する
      exPlayer.AttachFader(); //プレイヤーにフェーダーを付ける
      exPlayer.SetFadeInTime(1000);   //フェードイン時間を設定する
      exPlayer.SetFadeOutTime(1000);  //フェードアウト時間を設定する
      exPlayer.Start();   //再生する

      //クロスフェードPlayer2   以下ほぼ同様
      exPlayer2 = new CriAtomExPlayer();
      exPlayer2.Loop(true);
      exPlayer2.AttachFader();
      exPlayer2.SetFadeInTime(1000);
      exPlayer2.SetFadeOutTime(1000);
      
      CriAtom.SetCategoryVolume("BGM", 0.2);   //指定したカテゴリーのボリュームを設定する
      CriAtom.SetCategoryVolume("SE", 0.2);     //上に同じ
   }
   //ボタンなどで呼び出す。
   public void PlayBGM(){
      num = (num + 1) % (bgmCueNames.Length - 1);   //numは0からbgmCueNamesの要素の範囲で実行毎に加算される
      if(exPlayer.GetStatus() != CriAtomExPlayer.Status.Playing)   //exPlayerが再生されているかどうかを判別
      {
         if (exPlayer2.GetStatus() == CriAtomExPlayer.Status.Playing)
            exPlayer2.Stop();   //exPlayer2が再生中なら止める
         exPlayer.SetCue(bgmAcb, bgmCueNames[num]);   //exPlayerにキューをセットする
         exPlayer.Start();   //exPlayerを再生する
         return;
      }
      else if(exPlayer2.GetStatus() != CriAtomExPlayer.Status.Playing)   //exPlayer2が再生されているかどうかを判別
      {
         if (exPlayer.GetStatus() == CriAtomExPlayer.Status.Playing)
            exPlayer.Stop();   //exPlayerが再生中だったら止める
         exPlayer2.SetCue(bgmAcb, bgmCueNames[num]);   //exPlayer2にキューをセットする
         exPlayer2.Start();   //exPlayer2を再生する
         return;
      }
   }
}

※以下は公式のマニュアルに記載されている。
CriAtomExPlayerは再生中にSetCueを実行しても停止することはないが、キューをセットした後に
Start()を実行するとその前に再生していた音が停止して、新しくセットしたキューが再生される。
CriAtomExPlayerの初期化はシーンのロード時など、負荷が許容できるタイミングで実行するのが
望ましい。

再生する毎に初期化するとフレーム落ちの原因になる。
また、クロスフェードを行うために、AttachFader()を実行する場合は再生する前か停止中に行う。
再生中にAttachFader()を実行すると停止してしまう。
SetFadeInTime()などは再生に影響しない。

exPlayerとexPlayer2がある理由は、クロスフェードするタイミングで前の音をフェードアウトさせながら
次の音をフェードインさせるために2つ宣言している。
この時、音は2音同時に再生される区間を作ることができる。
プレイヤーが1つの場合は、Stop()を実行してフェードアウトが開始されても、次のStart()が実行
されるタイミングで強制的に停止させられる為、フェードアウトしきる前に次の音がフェードインを開始
してしまう。

SetCategoryVolume()はCriAtomCraftLEで設定したカテゴリーの音量を個別に設定することができる。

参考

CRIWARE Unity Plugin Manual: CriAtomExPlayer クラス
CRIWARE Unity Plugin Manual: CriAtom クラス

※間違ってたらすみません。
わかった時点で修正します。

コメント

このブログの人気の投稿

ダイソー テープライト リモコン付 分解

C++ round関数を使わずに小数第n位の四捨五入をする

C++ cout関数とcin関数を用いた基本的な入出力