バージョン
セカンダリアウトプットとは、メインテレビやメインスピーカーアウトプット以外のあらゆるオーディオアウトプットを指します。状況によって、このアウトプット用に別のオーディオミックスを行う必要があります。ゲームで使うと思われる各アウトプット用に、それぞれ、マスターセカンダリバスを必要な数だけ作成できます。最も一般的なセカンダリアウトプットは、ゲームコントローラのスピーカーやヘッドフォンです。これ以外の独立したアウトプットも考えられます(チャット、BGM、ヘッドフォンなど)。このセクションでは主にゲームコントローラのスピーカーについて説明しますが、ほかの全ての種類のアウトプットにも該当する内容です。
セカンダリアウトプットからアウトプットするには、サウンドをマスターセカンダリバス階層に送る必要があり、その2種類の方式を以下に示します:
対象サウンドのアウトプットバスのプロパティを、セカンダリバス階層にあるバスに直接設定する方式。 これは、ほかのサウンドルーティングと同じように使います。通常は1つのセカンダリアウトプットインスタンスだけに結び付いているサウンドなどに向いています。例えば、プレイヤーが発射するガンショット、テニスラケットの打音、PDAの音、ゲームプレイのフィードバックなどがあります。
対象サウンドをマスターオーディオバス階層のバスにルーティングしてからセカンダリバス階層のAUXバスへ送る、ユーザーセンドまたはゲームセンドの設定を追加する方式。 複数のアウトプットやテレビから同時に聞こえてくるサウンドなどに向いています。例えば、スパイカメラやアナウンスなどです。
バス階層は、ミキシングの構造を定義するだけです。そのミックスを具体的なアウトプットと関連付けるには、対応するマスターセカンダリバスで、適切なAudio Deviceシェアセットを選択します。
ゲーム中に複数のインスタンスが存在するかもしれないプレイヤー関連のアウトプット(ゲームコントローラやヘッドフォンなど)の場合は、それに関連するミキシング階層が、プレイヤーごとにコピーされることを、知っておく必要があります。プロジェクトで定義するのは、特定のアウトプットタイプ用のミキシングレシピのようなもの だけです。実際にどのコピー構造にルーティングされるかは、プログラマーの設定するリスナーとゲームオブジェクトの関連付けで決まります。これを以下の例を用いて説明します。
全ての例で、Secondary Bus階層として下記のバス構造を用いています。メインAudio Bus階層は省略します。この構造はアウトプットごとに複製されるので、最終的なミックスは互いに独立しています。なお、インスタンス化されるのは必要なバスだけです。
これは、1つのサウンドがメインアウトプットに送られる単純な例です。通常のゲームでは、複数のサウンドが複数のサブバスにルーティングされます。ここでは簡略化して、テレビアウトプットで再生される音が1つと仮定します。
次に、2人目のプレイヤーのゲームコントローラで別のサウンドを再生するとします。例えば、メニュー画面にこのプレイヤーだけが入り他のプレイヤーが入らない場合の、メニューサウンドを考えます。この場合、メニューサウンドが通常通り設定されたアウトプットバスにミキシングされ、TVミックスとは別となります。このサウンドがプレイヤー2のコントローラだけで再生されるのは、ゲーム内で、リスナーとゲームオブジェクトの関連付けが設定されたからです。この場合プログラマーは、コントローラ2のリスナーだけが聞くゲームオブジェクトで、このサウンドを再生させます。
上記の例で明らかなことが2点あり、つまりあるサウンドを複数のセカンダリアウトプットと同時にTVミックスへもルーティングできるということです。この例では、事前に録音された助けを求めるプレイヤー1の無線通信というサウンドが、同じチームのプレイヤー2に聞こえ、またテレビの視点がこのサウンドを発するプレイヤー2の近くにあるため、テレビからも聞こえます。なお、このサウンドのアウトプットバスはBus 1に設定されています。このバスと、マスターセカンダリバスは、プレイヤー1とプレイヤー2の両方で複製されます。当然、プレイヤー2のミックスには、プレイヤー2にしか聞こえないSound 2と、Sound 1が入らなければなりません。エフェクトがある場合は、両者のマスターセカンダリバスのコピーに同じエフェクトが適用されますが、その対象となるオーディオシグナルが異なります。
またSound 3からTVミックスに向かうSendがあります。他のアウトプットに対して送る場合は、全種類のSendを使えます。この例では、距離関係や減衰によって無線通信がカメラにも聞こえることがあるので、メインTVミックスへ入れる必要があり、設定されたAuxiliary Busから送ります。
著作権のある音楽の録音は、一般的にPS4、PS5、Xbox One、Xbox Series XのDVR機能で禁止されています。これらのプラットフォームでは、音楽だけを管理するための、特別なバーチャルデバイスを提供し、その録音を回避しています。Wwiseでも、音楽だけを違う階層で別にミキシングすることになります。インテグレーションのデモプロジェクトで、これを実装してみました。NonRecordable_Bus、RecordableMusic、NonRecordableMusicの設定を確認できます。コードの観点からは、DemoBGM.cppを見てください。
以下の通り、NonRecordableMusicは、Non Recordable Busへとルーティングされ、ここから信号がDVR_Bypassアウトプットにアウトプットされます。
コード的には、これを実装するための作業はそれほどありません。アウトプットを初期化するために、ゲームがAudio Deviceシェアセットの名前を使い、 AK::SoundEngine::AddOutput()
をコールする必要があります。
Wwise Advanced Profilerを使うと、各サウンドが別々のバスや別々のアウトプットに行くのが分かります。これが、対応しているプラットフォーム上の通常の流れです。(中間のバスミュージックは、省略しています。)
DVR機能は、ほかの対応プラットフォームには存在しないので、何か違う処理が必要です。その場合、当然ゲーム中に音楽を失いたくないので、正しくルーティングするようにします。対処するには、Audio Deviceプロパティをアンリンクするだけです。マスターバスのプロパティエディタで、Audio Deviceプロパティをアンリンクすることもできます。以下の例では、Non Recordable Busのアウトプットを通常のシステムアウトプットにしました。ただし対応しているプラットフォームでは、DVR_Bypassにいくので、リンクアイコンが半分、オレンジ色です。以上を、インテグレーションデモプロジェクトで設定しました。この場合、コードでアウトプットを初期化するためのAK::SoundEngine::AddOutput
をコールする必要はなく、それはシステムのアウトプットが起動時に必ず初期化されるからです。
両方のサウンドを再生すると、2つのソースのシグナルが別々のバスを通り、最終的に同じシステムアウトプットでミキシングされるのが分かります。