はじめに
ADXアンバサダーとして記事を書いておりますSigと申します。
この記事ではUE5とADX for UEを連携させ、マルチプレイヤーゲームにおける基本的なサウンドの実装を行っていきます。
マルチプレイヤーゲームでは、ゲーム内の状況のほとんどはすべてのプレイヤーに再現され、同じ世界を共有することになります。
サウンドにおいても、それは例外ではありません。UEのレプリケーション機能を使用して、参加しているプレイヤー全員に同じ音が聞こえるようなサウンド実装をしていきます。
やること
- ADX for UEを使ってサウンドを再生する
- マルチプレイヤーのテストプレイを有効にする
- 参加しているプレイヤー全員にサウンドを再生する
また、記事中に「blueprintue」を使用したBPグラフ共有を載せています。コピペするだけで大体の実装ができますので、よろしければご活用ください。
当記事ではUE5.6 及び 「ADX LE UE SDK(2.04.02)」を使用します。
また、基本的にブループリントのみでの実装を行います。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/
前提
「ADX for UE LE」を使用します。導入や簡単な使い方は以下の記事にあります。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)
ADX for UEの導入で、一歩上のサウンド表現を(実践編)
実装
マルチプレイヤーにおけるサウンドって、どう実装しよう?
シングルプレイのゲームのように、単純にPlay Sound at Locationなどでサウンドを再生しても、それは他のプレイヤーでは起こらなかったこととなり、状況は共有されません。
UE5のレプリケーション機能における「サーバー」と「クライアント」という2種のプレイヤー間で、相互に通信をしていく必要があります。実装にはひと手間ふた手間増えることになりますので、基本的な再生手段が確保できていることが前提になります。
今回は「Listen Server」という方式を使い、サーバー(ホスト)であるプレイヤーはイベントの発信とゲームのプレイというふたつの役割を持つことになります。
サーバーがゲームプレイの役割を持たない「Dedicated Server」という方式もありますが、テストの容易い「Listen Server」から始めるのがいいでしょう。
(画像)
今回はほぼデフォルトのThirdPersonTemplateから処理を追加していきます。
ネットワーク対応処理はアクターのReplication仕様などに深く関わってきますので、ネットワーク対応が初めてという方はThirdPersonTemplateを新しく作って、同じように操作していくことをおすすめします。
AtomCraftでサウンドを用意する
テスト用のサウンドをAtomCraftで用意します。
今回この工程は省略するため、詳細は必要に応じて導入編記事を参照してください。
UE5でマルチプレイ対応のサウンドを実装する
キューシートのインポート
ビルドしたキューシートをインポートします。
acbファイル、acfファイルをコンテンツドロワーにドラッグ&ドロップしてインポート。
acfファイルインポートの際のダイアログは「Yes」を選択します。


一応、キューが正常に再生できることを確認しておきます。

マルチプレイヤーのテストプレイを有効化する
今回のテストプレイを擬似マルチプレイヤーとして行うため、テストプレイの設定をします。
再生の右にあるボタンを押し、Net Modeを「Play As Listen Server」にします。
これでListen ServerとClientに分かれて行うマルチプレイヤーが可能になります。

Number of Playersを「2」に設定します。これがプレイヤー数になります。
最大「4」まで増加できますが、動作確認ができているかつスペックに余裕がある場合にのみおすすめします。

再生ボタンを押します。

ウィンドウがふたつ現れ、マルチプレイヤーのテストが実現できました。
この状態では、各ウィンドウにてキャラクターを操作すると、相手の画面からもキャラクターが動くのを確認できます。
この記事では、画面が一番大きいウィンドウをサーバー側プレイヤーのもの、そうでないものをクライアント側プレイヤーのものとしています。

サウンドの再生
プレイヤーが特定のキーを押すと、プレイヤーキャラクターからキューが再生されるよう実装してみます。

キーボードの「1」キーを押すと、Spawn Sound at Locationノードでサウンドが再生される単純な処理です。座標はGet Actor Locationでプレイヤーキャラ自身の場所を参照します。

Spawn Sound at Locationノードは必ずAtomカテゴリのものを使用してください。もう片方のノードはUEデフォルトのものなので、キューが再生できません。

サウンドの再生を確認するため、コンソールコマンドで再生キューの可視化を行います。
ゲームを再生し、@キーでコンソールコマンドを開きます。
「atom.3dVisualize.Enabled 1」を入力します。

ゲーム中に「1」キーを押すとサウンドが再生され、可視化されます。

サウンドが再生され……クライアント側の画面では表示がなく、どうやらサウンドが再生されていないようです。

クライアント側のウィンドウをアクティブにして「1」キーを押すと、今度はクライアント側でのみサウンドが再生され、可視化されました。

この状態ではサウンドが1プレイヤーの画面で再生されても、接続相手からは再生されていません。
これでは再生処理がネットワークでの遊びに対応できていないことになります。
サーバーからサウンドを一斉送信
これを解決するには、イベントの種類を変え全員に一斉送信されるイベントとして設定する必要があります。
新しくイベントを作り、そこにサウンドの再生処理を移植します。

Multicastのイベントを作るには、イベント名の最初に「Multicast_」をつけるか、イベントノードを選択した状態でDetailsパネルのReplicatesから「Multicast」を選択します。

1キーを押すとMulticastのイベントが呼び出されるようにします。

このようなネットワーク対応イベント、関数をRPC(Remote Produre Calls)と呼びます。
テストしてみましょう。1キーを押すと、プレイヤー1(サーバー)で再生したサウンドがクライアント側のプレイヤーの画面にも表示されました!

これでサウンドの再生がすべてのプレイヤーへ共有されることになりました!!
……本当に?
……クライアント側のプレイヤーの画面で1キーを押してみましょう。
クライアント側のプレイヤー画面ではサウンドが再生されていますが、サーバー側プレイヤーの画面では何も起こっていないようです。

クライアントからサーバーを介してサウンドを一斉送信
Multicastイベントはサーバーからクライアントにイベントを送ることができますが、クライアントからサーバーにイベントを送ろうとすると失敗してしまうようです。
これを解決するため、
- ひとつのクライアントからサーバーへMulticastイベントの送信を依頼する
- サーバーは全クライアントへMulticastイベントを送信する
- すべてのクライアントでイベントが実行される
という手順を踏んでみましょう。回りくどいやり方になってしまいますが、手順を把握してしまえば管理しやすくなります。
まずは新しくカスタムイベントを作り、こちらはRun on Serverイベントとして設定します。

Run on Serverイベントを作るにはイベント名の最初に「Server_」をつけるか、イベントノードを選択した状態でDetailsパネルのReplicationにて「Run on Server」を選択します。

Run on ServerのイベントからMulticastのイベントを呼び出します。
また、「1」キーを押した際のイベントからRun On Serverのイベントを呼び出します。

これで、画像のようにイベントがリレーされ、ネットワーク経由でサウンドが再生されることになります。

テストしてみましょう。
サーバー側で「1」キーを押すとクライアント側でもサウンドが再生・表示され……

クライアント側で「1」キーを押すと、サーバー側でもサウンドが再生・表示されるようになりました!

Number of Playersを4人にしてテストしても、同様に動作しているのが確認できます。


再生するサウンドをネットワーク経由で指定する
より汎用性の高い処理にするため、イベントの入力パラメータを有効にしてみます。
これによって、1プレイヤーから再生するサウンドを指定すると、すべてのプレイヤーに対して同じサウンドが再生されることになります。
Spawn Sound at Locationノードの入力ピンから線を伸ばし、イベントノードにドラッグ&ドロップします。
イベントにインプットピンが追加されます。

画像のようにピンをつなげ、情報がServer_PlaySoundからリレーされるようにします。

ここまでのブループリントグラフはこちらからコピペできます。
これにより、Server_PlaySoundイベントでサウンドや座標が指定できるようになりました。汎用的な、ネットワーク対応のサウンド再生イベントとして使用できます。
ネットワーク対応でのサウンド再生はひと手間かかりますが、マルチプレイヤーのゲームにおいて欠かせない部分になります。一度手順を覚えればそれほど苦労しない部分なので、挑戦してみてください。