はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではUE5とADX for UEを連携させ、カードを扱うテーブルゲームなどにおけるサウンド実装について紹介します。
カードゲームやボードゲームではたくさんのカードやコンポーネントを扱うため、それに伴うサウンド再生数も多くなります。一度にたくさんのサウンドを扱うと聴覚的にごちゃついた印象になったり、最大発音数を超えて他のサウンドがかき消されてしまう、といった体験をしたことがある方もいるのではないでしょうか。
本記事ではADXの機能で発音数を制限し、また発音数が規定を超えた際の挙動などについて設定をする方法について記載しています。
また、それらをブループリントで管理する方法についても併記します。
やること
- サウンドを構成する
- UE内でサウンドを再生する
- 最大発音数を制限し、音の印象を際立たせる
- 発音数制限時の挙動を設定する
- 発音数制限をブループリントから管理する
また、記事中に「blueprintue」を使用したBPグラフ共有を載せています。コピペすることで大体の実装ができますので、よろしければご活用ください。
当記事ではUE5.7 及び 「ADX LE UE SDK(2.05.01)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
カードゲームにおけるサウンドテクニック
AtomCraftでサウンドを構成する
まずはサウンドオーサリングツール「AtomCraft」でサウンドを構成します。
今回はBGMやSEを次のように用意しました。
AtomCraftのマテリアルツリーにドラッグ&ドロップしてインポートします。
今回の主役はカードなので、カードをめくる音にいくつかバリエーションを作っています。

BGMのマテリアルだけはループ再生したいので、インスペクターにてループを設定します。

キューシートを右クリックし、新規にキューを作成します。
BGMなど、通常通り再生するキューの場合は「新規オブジェクト」→「キュー『ポリフォニック』の作成」を選択します。

作成したキューにマテリアルツリーから音源をドラッグ&ドロップして配置します。


カードをめくる音は何種類かバリエーションを用意したので、これらがランダムに再生されるようにします。
キューシートを右クリックし、「新規オブジェクト」→「キュー『ランダム』の作成」です。

該当するマテリアルをキュー内に配置します。

キューのタイプ「ランダム」では、キューを再生するたびにランダムなトラックが再生されます。

SEは再生する座標によって聞こえ方を変えたいので、インスペクターにてパンタイプを「3Dポジショニング」に設定しておきます。

ここまでできたらキューシートをビルドします。


UEでサウンドを再生する
UE5のエディタを起動します。
キューシートのインポート
ビルドしたacbファイル、acfファイルをコンテンツドロワー内にドラッグ&ドロップしてインポートします。
この際に表示されるダイアログでは「Yes」を選択します。これにより、ビルドしたAtom Configがプロジェクトに自動で設定されます。

2つのアセットが作られます。

キューアセットを開き、再生できることを確認します。
ランダムタイプのキューもここで挙動が確認可能です。

ブループリントからキューを再生する
まずはシンプルにカードの音を鳴らしてみましょう。
カードなどのブループリントアクターを開き、キューを再生するロジックを組んでいきます。
Spawn Sound at Locationで、カードの座標にてサウンドを再生します。
必ずAtomカテゴリのものを使用してください。Audioカテゴリの同名のノードはUEデフォルトのサウンドを再生するためのものなので、Atomキューが再生できません。

キューシート、再生するキューと座標を指定します。
Get Actor Locationノードを使用し、カードの座標を取得するといいでしょう。

ゲームを再生し、サウンドを視覚化したものです。
ドロー時にカードごとのサウンドが再生されていることが分かります。

サウンドを視覚化するには、コンソールコマンド「atom.3dVisualize.Enabled 1」などを使用します。

最大発音数を制限する
カード1枚ごとにキューを1つ再生してもいいのですが、一度に動かす枚数が多くなるにつれサウンドが同時発声されてごちゃつき、他の音がかき消されてしまうこともあるかもしれません。
そこで、指定されたサウンドに適用される同時発音が制限される、Atom Concurrencyの機能を使い、サウンドを制御してみましょう。
最大発音数はAtomCraftでも設定できますが、UE上でのAtom Concurrency機能を使うこともできます。
これら2つを使用するとUE側の設定で上書きされます。
UE側ではアクター単位で適用できますので、より直感的な設定をしたい場合に向いています。
コンテンツドロワーで右クリックし、「ADX Atom」→「Atom Concurrency」アセットを作ります。

名前をつけておきます。
このアセットはAtomキューを再生したり、Atomキューに対して設定できるため、ゲーム内の一部サウンドに対してだけ発音を制限する、ということができます。

アセットを開きます。ここでは同時発音制限を行うルールを設定できます。
「Max Count」では同時に発音可能な数を制限できます。

「Limit to Owner」は、「ひとつのアクターが持つサウンド内でだけ発音制限する」などの用途に使用できます。

「Resolution Rule」では発音数制限に達した場合の挙動を設定できます。
例えば「新しく再生されるものを制限する」、「古いものを停止する」や「距離が遠いものを制限する」、「優先度を指定し、低いものを停止する」などがあります。

Atom Concurrencyをキューに対し設定してみましょう。
Spawn Sound at Locationノードを拡張して追加項目を表示します。

「Concurrency Settings」に先ほど設定したAtom Concurrencyアセットを指定します。

このグラフはこちらから参照できます。
この状態でゲームを再生すると、最後にドローした6枚のカードに対してキューが再生され、先にドローしたカードの音声が停止します。

例として、「Max Count」を「1」に設定した場合は最後の1枚のカードのみが再生されています。

優先度を設定する
キューの優先度を指定してみましょう。この機能を使う場合は、「Resolution Rule」を「Stop Lowest Priority」に設定します。

Spawn Sound at LocationノードのアウトプットピンからSet Priorityノードで優先度が指定できます。
Priorityのノードが高いほど優先度が高くなります。

また、アクター内にAtom Componentなどを配置する場合(BGMの再生など)はDetailsパネルでPriorityが指定可能です。

発音数制限によるダッキング(音量抑制)を適用する
Atom Concurrencyでは、発音数制限に達したとき、既存のサウンドの音量を抑えてサウンドの飽和を抑制することもできます。
レベルに配置したBGMのキューを選択し、DetailsパネルでConcurrency Setの項目でAtom Concurrencyを設定します。これはカードの発音数制限に使用しているものと同アセットを指定します。

「Resolution Rule」を「Stop Oldest」にします。

「Volume Scaling」の項目を設定します。
「Can Recover」は抑制後にサウンドが発音数制限未満になった場合、抑えられた音量をもとに戻すかを設定するものです。
また、「Volume Scale」で抑制時の音量を、「Duck Time」「Recover Time」で移行にかかる時間を設定できます。

Atom Concurrencyの設定次第で単純な発音数制限だけでなく、主要なサウンド以外を抑制して、プレイヤーに聞かせたい音を際立たせることも可能です。
狭い範囲でたくさんの音が行き交うテーブルゲームやカードゲームのサウンド表現に役立つかもしれません。
