はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事は、UE5のGameplayTagとADX for UEを組み合わせてサウンドを管理する実装の活用法です。
基礎編では、UE5の機能であるGameplayTagでサウンドを識別し、データテーブル経由で再生する仕組みを作りました。
UE5 + ADXで、サウンドをタグによって管理・再生する
今回の記事ではキャラクターごとのゲーム中のボイスをタグで管理し、再生する手法を扱います。
ゲームに登場するキャラクターが増えてくると、キャラクターごとに「攻撃ボイス」「被弾ボイス」「スキル使用時ボイス」などと再生処理が膨らんでいきます。さらに「近接戦闘キャラの戦士と騎士、遠隔戦闘キャラの魔法使いと僧侶でキャラボイスを変える」などの派生バリエーションが増える場合、ひとつひとつに再生処理を書いていると手間になる上、メンテナンスのコストも馬鹿になりません。
これらをタグの組み合わせで管理することで、以下のような利点があります。
- キャラクターごとに再生処理を書き分ける必要がない
- 派生キャラボイスなどに対し、個別のボイスと共通ボイスを手軽に再生できる
- 新しいキャラを追加するときも、データテーブルに行を追加するだけで済む
また、タグ階層を活かすことで「戦士と騎士は通常攻撃や被弾時のボイスは共通だが、スキル使用時のボイスだけ個別に設定する」といった設計が自然に書けます。
当記事ではUE5.7 及び 「ADX LE UE SDK(2.05.01)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
実装
キャラクターとアクションのタグを用意する
「GameplayTags」タブの「Manage Gameplay Tags」からタグのマネージャを開きます。

タグの追加メニューが出ていない場合、「+ボタン」から表示します。

今回はキャラクターを示すタグと、アクション(行動)を示すタグの2系統を用意します。
キャラクター用のタグは「Character」下に追加します。タグを右クリックして「Add Sub Tag」です。
「.」で区切ると階層分けが可能です。タグの階層を使い、キャラ種別と職業を表現します。

例:
- Character.Melee : 近接職キャラ
- Character.Melee.Warrior : 戦士
- Character.Melee.Knight : 騎士
- Character.Ranged : 遠隔職キャラ
- Character.Ranged.Mage : 魔法使い
- Character.Ranged.Priest : 僧侶
これらはサウンドに限らず、ゲーム的なロジック上のキャラ判別でも使用できます。共通規格として練ってみるといいでしょう。
アクション用のタグは「Sound.Voice」下に追加します。
例:
- Sound.Voice.Attack : 攻撃時のボイス
- Sound.Voice.Damaged : 被弾時のボイス
- Sound.Voice.Skill : スキル使用時のボイス
このように2系統のタグを用意することで、
- 「Character.Melee」の「Sound.Voice.Attack」で近接職共通の攻撃ボイス
- 「Character.Melee.Knight」の「Sound.Voice.Skill」で近接職騎士限定のスキル使用ボイス
というように、キャラとアクションの掛け合わせで音を識別できるようになります。
AtomCraftでキューを用意する
AtomCraftで素材及びキューを用意します。
キャラクターごとにフォルダ分けして、ボイス素材をインポートしておくと整理しやすいです。
今回はこのような素材を用意しました。
- CV_Melee_Attack
- CV_Melee_Damaged
- CV_Melee_Skill
- CV_Ranged_Attack
- CV_Ranged_Damaged
- CV_Ranged_Skill
- CV_Melee_Knight_Skill
- CV_Ranged_Mage_Skill
すべて選択し、キューシートにドラッグ&ドロップしてそれぞれのキューを作成します。
キューシートにもフォルダを作ることができます。
キューシートを右クリックし、「新規オブジェクト」→「キューフォルダーの作成」です。

キャラ種別ごとにフォルダ分けしました。

キューシートをビルドします。
UE5のコンテンツドロワーにドラッグ&ドロップしてインポートします。

データテーブルでタグとキューを紐づける
基礎編で作成したデータテーブルを開き、行を追加していきます。
Row Nameには「キャラクタータグ + アクションタグ」を連結した文字列を使用します。
例:
- 「Character.Melee_Sound.Voice.Attack」→ キュー「CV_Melee_Attack」
- 「Character.Melee_Sound.Voice.Damaged」→ キュー「CV_Melee_Damaged」
- 「Character.Melee_Sound.Voice.Skill」→ キュー「CV_Melee_Skill」
- 「Character.Melee.Knight_Sound.Voice.Skill」→ キュー「CV_Melee_Knight_Skill」
今回騎士と魔法使いのスキルボイスは用意しましたが、戦士と僧侶のスキルボイスはありません。
本来登録していないタグを呼び出すとデータテーブルの行が見つからず正常に再生されませんが、これを解決する仕組みを補足としてこちらの記事で紹介します。
(発展編記事リンク)
キャラクターアクターにタグを持たせる
キャラクターのアクターに、自分自身を識別するためのタグを持たせます。
既存のキャラクターBP(プレイヤーキャラクターやNPCなど)を開きます。
GameplayTag型の変数「CharacterTag」を追加します。
閉じた目玉のアイコンを押し、Instance Editableにしておきます。これにより、配置されたアクターごとにタグを変更できるようになります。
コンパイル後、デフォルト値として該当のキャラクタータグを設定します。
これにより、配置されたキャラクターはどの種類のキャラであるかを自分で把握できるようになります。
複合タグで音を引く再生関数を作る
キャラクタータグとアクションタグを組み合わせ、対応するキューを再生する関数を作ります。
基礎編で作成した関数ライブラリ「BFL_SoundUtility」を開き、新しい関数を追加します。
関数名は「PlayVoiceByTag」としました。
引数を追加します。
引数として以下の情報を受け取ります。
- CharacterTag : GameplayTag型
- ActionTag : GameplayTag型
- PlayActor : Actor型
「PlayActor」は発話するアクターを設定するもので、再生位置などの設定に使用する想定です。
関数の中身では、まず2つのタグを連結して検索用の文字列を作ります。
Get Tag NameノードでそれぞれのタグからName型の文字列を取り出し、文字列を結合します。
結合の際は、データテーブルの行と同じように「_」をはさんで「Character.Melee」と「Sound.Voice.Attack」を「Character.Melee_Sound.Voice.Attack」のように連結します。
基礎編で作ったPlaySoundByTagAtLocation関数と同じ処理を持ってきます。コピペでOKです。

ローカル変数はそのままでは参照できずエラーが出るので、ノードを右クリックしてローカル変数を作ります。

引数のデフォルト値を設定しておきます。
特にボリュームとピッチはデフォルト値を1.0にしておかないと、設定を忘れた場合にサウンドが正常に再生されません。

これで「キャラタグ + アクションタグ」を渡せば、対応するキューが再生されるようになりました。
キャラクターから再生関数を呼び出す
キャラクターBPなどから、攻撃や被弾のアクションが発生したタイミングで関数を呼び出します。
例として、攻撃アクションのタイミングで次のようにノードを組みます。
- 自身のCharacterTag変数をPlayVoiceByTagのCharacterTagピンに渡す
- ActionTagピンには「Sound.Voice.Attack」を直接指定する
被弾やスキル使用時など他のアクションでも同様に、ActionTagを変えるだけで対応できます。
動作確認
レベルに各種キャラクターのアクターを配置し、それぞれでボイスを再生します。
データテーブルに登録したサウンドが再生されるようになりました。
新しい派生キャラ(例えば弓使い)を追加したくなったときも、「Character.Ranged.Archer」というタグを追加してアクターに設定し、データテーブルに新しい行を登録します。
登録していないタグに対する処理は、こちらの発展編で紹介する実装を使うことで自動的に共通ボイスにフォールバックさせることができます。
(発展編記事リンク)
この仕組みは、キャラクターのバリエーションが増えていくほど効果を発揮するでしょう。タグ階層を意識した設計を最初に行っておけば、後の拡張がぐっと楽になります。























