ゲーム開発におけるボイスデータの効率的な管理 with CRI ADX2 (後編)

# 前編記事について
本記事は下記記事の後編となります。
ゲーム向け統合型サウンドミドルウェア「ADX2」についての概要や、waveファイルをツールに登録する手順については、前編をご確認ください。

https://qiita.com/Takaaki_Ichijo/items/9cd16a14c907c8793e72


また、ゲームエンジンへの組み込みについては以下の記事にて解説しています。

https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377

https://qiita.com/SigRem/items/4250925f6d66a4fd287a

# Atom Craftで設定できる便利なボイス設定
ADX2とそのオーサリングツールであるAtom Craftは、ゲームの開発環境に導入することで、ボイスデータ側に様々な再生制御情報を埋め込むことができます。
本記事では、逆引き的にボイスにまつわる再生制御について紹介します。

## 同一キャラのボイスを複数同時に再生させない設定
ADX2のシステムでは、音データにタグ付けできます。カテゴリと呼んでいます。カテゴリごとに同時再生できる数の上限ルールを設定することで、音の鳴り方を制御できます。

たとえば、ゲームの会話シーンなどでユーザーのタップによりセリフが飛ばせる仕様を考えてみましょう。
セリフをスキップしたとき、前のセリフのボイスが鳴りっぱなしでは聞きづらくなります。プログラムで制御しようとした場合、「ボイス再生中にタップされたら、いったん再生中のボイスを止めて、そして次のボイスを再生する」という処理になると思います。

ADX2では、カテゴリに対して「最大再生数は１、これを超えたら今鳴っている同カテゴリの音は止める」という設定ができます。ボイスデータがプログラムから再生をリクエストされたとき、すでにセリフが再生されていたらその音をキャンセルして、音声を再生します。これによりプログラムは単に次のセリフを再生するだけで済みます。

これを「カテゴリキューリミット」といいます。Atom Craftでは、プロジェクトツリーでカテゴリを選択したときのインスペクタービューで内容が確認できます。

![カテゴリキューリミット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/df8a7cc3-93d5-f2cb-479b-f503a37588c4.png)

「カテゴリ」をゲームに登場するキャラクターごとに用意しておき、それぞれの「カテゴリキューリミット数」を「1」にしておけば、同じキャラクターのボイスが同時に鳴ることがなくなります。

また、単に再生数上限にリミットをかけるだけではなく、指定した時間内は再生リクエストをキャンセルする「多重再生禁止時間」を指定することもできます。

## BGMが鳴っているときにボイスを再生すると、BGMの音量を落とす設定

ゲームの演出には、キャラクターのボイスが再生されている間はBGMの音量を一時的に下げる「ダッキング」というものがあります。
プログラムで制御しようとした場合は、キャラクターボイスの再生状況を監視して、一度BGMの音量を下げ、ボイスの再生が終わったら戻し、という処理になります。

ADX2の場合は、カテゴリに対してフラグ立てをして、どのような遷移で音量が変化するかをツール側で設定しておくだけで、この演出を導入できます。

先ほどの例では、カテゴリをキャラクターごとに作成していました。今回はもっと大きな枠組み「BGM」と「Voice」というカテゴリを作って制御します。

![カテゴリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/a4a6f1f4-4d8b-a74e-73ad-e002b4e7892a.png)

なお、ひとつのキューに複数のカテゴリ設定が可能です。先ほどのキャラクターボイスごとの制御と組み合わせる場合は、ボイスのキューはキャラクターのカテゴリと、全体的な音の種類のカテゴリ２つを持つ形になります。

カテゴリ分けされた音同士の相互作用を作るために「REACT」機能を使います。
プロジェクトツリービューの「REACT」で設定します。

REACTビューでは、パラメータの変化の仕方を表したグラフ、変化するカテゴリ対象、変化をトリガするカテゴリが表示されます。

![React設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/b409b085-5a34-6e9b-7f71-9f6589fd1c1e.png)

この図の例では、「BGM」カテゴリに属するキューに対し、「Voice」カテゴリの音が鳴った時にボリュームを一時的に下げ、「Voice」カテゴリの再生が終わったらボリュームを戻します。

カテゴリとREACTを組み合わせて設定することで、プログラム側で何もせずに音を再生するだけで「ダッキング」が実現します。

## 複数のボイスからランダムに選んで再生する設定

ゲーム中の「やられボイス」など、複数のバリエーションがあるボイスデータについて、ランダムに再生することを考えます。
プログラムで制御しようとした場合は、あらかじめ複数のボイスデータを再生準備状態にしておき、リクエストが来たら乱数でどれを鳴らすか決める、というやり方になると思います。

ADX2の場合は、そういった「複数ファイルからのランダム再生」はランタイム側に内蔵しています。

複数のボイスデータを内包する形でキューを作り、トラックの再生設定を「シーケンシャル（全部同時に再生）」から「ランダム」や「ランダムノーリピート」に変更するだけで実現できます。

![複数ランダム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/d16f942c-ab92-33c3-a289-e2ebe3ac20f3.png)

上記の例では、４つの音声データが含まれたキューとなっています。トラックの再生設定が「ランダムノーリピート」になっているため、このキューに再生リクエストをするたびにランダム、かつ前回鳴らしたものは繰り返さない（ノーリピート）挙動になります。

また、ランダム設定は再生の出現率を変更することもできます。
インスペクターの「ランダム」欄で乱数重みの数値を設定することで、ランダムの中でも再生されやすいボイスデータと、あまり再生されないボイスデータの演出ができます。

![乱数重み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/d86c4286-fba3-6868-9918-9010caca25e6.png)

## 一定間隔で連続再生されたときだけ特別なボイスを再生する（パズルゲーコンボ演出）

ひと言で説明するのが難しい演出なのですが、

* 格闘ゲームの連続ヒットで、短い間に攻撃を連続ヒットしているときだけ食らったときのボイスが変わっていく
* プレイヤーが武器を連射をしたいるときだけ別のボイスが流れる
* 落ちものパズルでコンボがつながった時だけボイスが変わっていく

などの、シチュエーションもAtom Craftで作ることができます。
「コンボシーケンシャル」という機能を使うのですが、以前の記事で紹介しています。

https://qiita.com/Takaaki_Ichijo/items/154929713062cf28deb2

## セリフの文字情報を音声データに埋め込む

音響制作会社からセリフのデータが納品されてくるとき、たいては連番のwaveファイルでやってきます。どの番号のファイルがどのセリフなのかについては、Excelで管理したり、ゲーム開発環境側で読めるデータ（UnityならScriptable Object）などで管理すると思います。

ADX2の場合は、音データそのものに文字列データを埋め込むことができ、これをセリフの管理に転用できます。
キューの中の設定に「ユーザーデータ」という、任意の文字列を含むことができる機能があります。

![ユーザーデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/f5105ca7-251d-49e9-a374-ed9c4608394c.png)

この文字列情報はビルドデータに含まれますので、どのデータがどんなセリフなのか、すぐに確かめることができます。
また、ゲームの実行時にも読み取ることができますので、そのままセリフ文字に使うこともできます。
ユーザーデータは、Atom Craftの「リストエディタビュー」で一覧表示できます。

![ユーザーデータの一覧表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/6cd5ee08-640c-685e-4c39-72b772dea54c.png)

埋め込まれた文字は、ゲームの開発環境側で読みだして表示できます。
Atom Craftで作業しない人でも、セリフの内容をいちいちプレビュー再生せずに確かめることができます。
Unityの場合は、ADX2 for Unity SDKのAtom Browserでユーザーデータの内容が確認できます。また、ウィンドウを改造することで、キューの横にセリフ文字を表示することも可能です。

![ユーザーデータの表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/4c6fbc7a-9f5a-d279-efb7-0e1a83463292.png)

拡張方法は、以下の記事を参考にしてください。

https://qiita.com/Takaaki_Ichijo/items/e39793805637a1bc576c

Atom Craft上の別の機能で「コメント」というものがありますが、これはAtom Craftのプロジェクトファイル上のみの表示となり、ビルドされたデータには含まれません。

# ADX2の機能の活用でコード量を減らそう

ゲームにおけるセリフデータの制御やデータ管理として、ADX2は幅広い応用が可能です。
フルボイスゲームであったり、バトルものでセリフが多いなどのケースでは特に活躍しまず。ぜひ触ってみてくださいね。