CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
[CriAtom]インゲームプレビュー(ピンボールデモ)

サンプル内容

概要

cri4u_samples_criatom_scene07_game_mini.png

CRI ADXのインゲームプレビュー機能のデモです。
ピンボールゲーム風のデモになっています。
また、BGM、SEを[Setting]から切り替えることができます。

インゲームプレビューについて

Unity Editorで実行時にCRI Atom Craftからインゲームプレビュー接続することで、発音数の確認を行うことができます。
また、再生位置や再生パラメータの変更を行うことも可能です。
データのサイズ変更が行われるような編集の場合は再転送が必要ですが、インゲームのパディングサイズまでの波形の差し替えなども可能です。
インゲームプレビューの詳細については「インゲームプレビュー 」も参照してください。

インゲームプレビュー用データについて

もしもACF、ACBを再ビルドする場合は、インゲームビルドしたデータをAssetに追加してください。

[注意]
インゲームプレビュー用ではないACF、ACBの場合、インゲーム接続してもツールと連動しません。
インゲームプレビュー用のACF、ACBを生成したCRI Atom Craftプロジェクトで接続するようにしてください。

サウンドの集中管理について

CriAtomSourceコンポーネントをエディタで貼り付けて作業をするのですが、 例えば、大量の音声アセットを管理する場合には、操作が煩雑になりがちです。
そこで、このサンプルではサウンドを一箇所で管理するように再生関数をラッパーしています。
[例] PlayBGM() ・・・ BGMを再生する

サウンドのダイナミックな変更

BGM、SEを[Setting]から切り替えることができます。
再生を間接的に行うことも行っているため、音のダイナミックな変更が可能になります。
例えば、画面の[Setting]を押すことで、SEとBGMを切り替えることができます。

サウンドシステムラッパーのメリット

サウンドシステムを隠蔽することで、スクリプトの変更を最小にしながらサウンドの修正・改善を行うことが可能になります。

[例]
Unity標準のサウンドシステムとの切り替えを可能にすることができます。
(このサンプルではUnity標準の再生処理は含まれていません。)

インゲームプレビューの手順

  • (1) 「CRI Atom Craft」を起動してください。
  • (2) [ファイル]->[プロジェクトを開く] メニューより次のプロジェクトファイルを開いてください。
    • [CRI Atom Craftアプリフォルダ]/example/pinball/Pinball.atmcproj
  • (3) サンプルを動作させるPCのIPアドレスを設定してください。
    • (3-1) [プロジェクトツリー]->[ターゲットコンフィグ]項目よりPCを選択します。
    • (3-2) 右クリックメニューから[プレビュー設定を編集...]を選択します。
    • (3-3) [ターゲットコンフィグのプレビュー設定の編集]ウインドウより[編集]ボタンを押下します。
    • (3-4) IPアドレス欄にサンプルを動作させるPCのIPアドレスを設定します。
  • (4) 画面右上[プレビューターゲット]を[PC]に変更します。
  • (5) [F10]キーを押して、インゲームプレビューを開始します。

    [備考]
    インゲームプレビューの詳細については「 インゲームプレビュー 」をご覧ください。

シーン情報


ミドルウェア CRI ADX (CRI Atom) 補足
サンプル Basicサンプル
格納場所 /cri/unity/samples/UnityProject/Assets/Scenes/criatom/basic/
シーンファイル Scene_07_Ingame_Pinball.unity
スクリプトファイル Scene_07_Ingame_Pinball_PlayBounce.cs 物理コリジョン判定時に音を再生させるスクリプトです。
SoundManagerの関数を呼び出します。
スクリプトファイル Scene_07_Ingame_Pinball_SoundManager.cs サウンド処理を管理するスクリプトです。
ACFファイル Pinball.acf
ACBファイル PinballMain.acb


プログラムの解説

基本は1つのプロジェクトでサウンドアセット管理

基本的には、1つの「Unityのプロジェクト」で1つの「CRI Atom Craftプロジェクト」を使用することを推奨しています。
複数のCRI Atom Craftプロジェクトを1タイトルで使用する場合は、少し工夫が必要です。

このサンプルでは、CRI Atom CraftでインゲームビルドされたACFとACB(Pinball.acfとPinballMain.acb)を使用しています。
CRI Atom Craftのプロジェクトも他のサンプルと異なります。
(他のサンプルでは、DemoProj.acf、DemoProj.acbを共有して使用しています。)
例えば、ダウンロードコンテンツなどで、ACFとACBをまるごと差し替えたい場合などもこれに当たります。

[SoundManager]オブジェクトについて

ACF、ACBを管理するCriAtomコンポーネントをセットしています。

サウンド再生を管理するCriAtomSourceコンポーネントはスクリプトのAwake()関数内で生成しています。
PlayBounce()関数を呼び出すことで、もしBGMが再生されていない場合、初期処理(カテゴリボリューム反映、DSPバス設定、BGMの再生)を行っています。
この処理は、インゲーム接続時にACF、ACBのサイズが変化する編集が行われ、バイナリを更新する必要があった時に、定常でなっていて欲しいBGMの再生が停止されたことを元に動作しています。
(※将来のバージョンでインゲーム時の更新イベントなど適切なコールバックを用意する予定です。)

ACB情報のスクリプトからの取得について

このサンプルでは、他のサンプルと異なり、CriAtomProjInfo_Unity.cs(Unity情報ファイル)は使用せず、直接スクリプトでACBから情報取得を行います。
CriAtomProjInfo_Unity.csは一つのCRI Atom Craftプロジェクトの情報を出力するファイルなのですが、複数のプロジェクトの情報を持つことはできません。
(※AtomCraftツールと一対一対応の制限があります。)

ここではキュー名の情報のみ取得していますが、他にも様々な情報を取得することができます。 Awake()関数にて行います。

/* Get the Cue info by specifying the ACB file name (CueSheet name). */
CriAtomExAcb acb = CriAtom.GetAcb(cueSheetName);
/* Create a list of Cue names. */
CriAtomEx.CueInfo[] cueInfoList = acb.GetCueInfoList();
foreach(CriAtomEx.CueInfo cueInfo in cueInfoList){
cueNameList.Add(cueInfo.name);
}

CriAtomSourceの作成について

このサンプルでは、他のサンプルではCriAtomSourceコンポーネントをUnityエディタ上で生成時に指定するのですが、スクリプトで生成しています。

注意点ですが、Unityエディタ上で生成した場合、必要なCriAtomコンポーネント(CRIWAREオブジェクト)が自動生成されるのですが、
スクリプトで生成した場合は自動生成されないため、UnityEditor上でCriAtomコンポーネントを追加し、ACF、ACBの設定をしておく必要があります。
(※将来のバージョンでCriAtomコンポーネントもスクリプトから生成する方法を用意する予定です。)

/* AtomSource for bouncing sound */
private CriAtomSource atomSourceBounce = null;
/* AtomSource for BGM */
private CriAtomSource atomSourceBGM = null;
(省略)
/* Create the CriAtomSource for bouncing sound. */
atomSourceBounce = gameObject.AddComponent<CriAtomSource>();
atomSourceBounce.cueSheet = cueSheetName;
atomSourceBounce.cueName = cueNameList[(int)enumCueNameList.wood + seNo];
/* Create the CriAtomSource for BGM. */
atomSourceBGM = gameObject.AddComponent<CriAtomSource>();
atomSourceBGM.cueSheet = cueSheetName;
atomSourceBGM.cueName = cueNameList[(int)enumCueNameList.bgm0 + bgmNo];

CriAtomSourceの再生について

PlayBounce() 関数を呼び出すことで音を再生します。
publicな関数であるため外から呼び出し可能です。
このサンプルでは Scene_07_Ingame_Pinball_PlayBounce から呼び出しています。

[Source:Scene_07_Ingame_Pinball_SoundManager.cs]
/* Bouncing sound */
public void PlayBounce()
{
/* Specify a Cue name. */
atomSourceBounce.cueName = cueNameList[(int)enumCueNameList.wood + seNo];
/* Play */
atomSourceBounce.Play();
}

[Suorce:Scene_07_Ingame_Pinball_PlayBounce.cs]
#region Variables
private Scene_07_Ingame_Pinball_SoundManager soundManager = null;
#endregion
#region Functions
void Start()
{
/* Get the SoundManager. */
soundManager = FindObjectOfType(typeof(Scene_07_Ingame_Pinball_SoundManager)) as Scene_07_Ingame_Pinball_SoundManager;
}
/* Play at collision. */
void OnTriggerEnter(Collider other)
{
/* Play at collision hit. */
soundManager.PlayBounce();
/* If BGM is stopped, restore it. */
soundManager.ResumeBGM();
}
#endregion

インゲーム時のACF,ACB差し替えについて

インゲームによってACFやACBが変更された場合、再生中の音が停止したままになったり、カテゴリボリュームなどが初期状態に戻ってしまいます。
このサンプルでは、常に再生されているBGMの状態が停止状態になっていた時の再開時に、アプリケーションから再指定が必要な項目をまとめて行っています。
DSPバス設定、インゲーム時にレベルもモニタをツール上で表示させるフラグなどの更新も行っています。

public void ResumeBGM()
{
/* Play when in the PLAYEND or in the STOP. */
/* (Automatically restore at the time of ACB update) */
CriAtomSource.Status status = atomSourceBGM.status;
if ((status == CriAtomSource.Status.Stop) || (status == CriAtomSource.Status.PlayEnd)) {
/* Play */
PlayBGM(); /* Change the volume of category [main]. */
CriAtom.SetCategoryVolume("main", mainVolume);
/* Add the feature of level monitor for in-game preview. */
CriAtom.SetBusAnalyzer(true);
}
}