バージョン

menu_open

セカンダリ出力の統合

Wwiseでは、セカンダリ出力には、通常のTVオーディオ出力ではないいずれの物理的オーディオエンドポイントを指定します。最も一般的なセカンダリアウトプットとして、ゲームコントローラのスピーカーなどがあります。Secondary Output機能では、 主要なスピーカー/TVミックスに影響を与えることなく、これら出力のそれぞれに別のミックスを定義することができます。この同じ Wwise の一連の機能は、スピーカー/TVの代わりの出力ターゲットコントローラを除き、いずれ特定の制限なしに、通常のミックスとしてセカンダリ出力に適用されます。

セカンダリ出力バスへのルーティング

オーサリングサイドでは、セカンダリバス階層にルートされるサウンドは、次に示す2つの方法のうち1つを使って、セカンダリ出力に送られます:

  • 対象サウンドのアウトプットバスのプロパティをセカンダリバス階層にあるバスに直接、設定する方式。通常は1つのセカンダリアウトプットインスタンスだけに結び付いているサウンドなどに、向いている。例えば、プレイヤーが発射するガンショット、テニスラケットの打音、PDAの音、ゲームプレイのフィードバックなど。
  • 対象サウンドをマスターオーディオバス階層のバスにルーティングしてから、セカンダリバス階層のAUXバスへ送るユーザーセンド、またはゲームセンドの設定を追加する方式。複数のアウトプットとテレビから同時に聞こえてくるサウンドなどに向いている。例えば、スパイカメラ、アナウンスなど。

複数のコントローラとTVで同時に、同じソースを使用して、同じサウンドを再生することは可能です。 デザイン側では、ゲームを何人のプレイヤーがプレイしているかの知識はありません。これが、複数出力が可能であっても、マスターセカンダリーバスが一つしかない理由です。このバス階層は、ゲーム側から登録されている各出力へのルーティングのテンプレートとして使用されます。よって各出力は、再生されるサウンド、ゲームオブジェクトでアクティブなRTPC ならびにスイッチ値によって、異なるミックスやエフェクトが適用されている可能性があります。以下のセクションの例で、このような場合を見てみます。

出力の同期についての注意点

TVやゲームコントローラなど、多くのデバイスで同じオーディオを出力する場合、デバイスの間でのレイテンシに気づくことがあるでしょう。これは、オーディオ信号パスにおける、ハードウェアの違いのため、避けることはできません。コントローラ側では、この信号は無線のチャンネルを通過しなければならず、これが有線のコントローラと異なるディレイを与える可能性があります。TVでは、一度信号がコンソールを出ると、受信機および/またはTVを通過し、これのプロセッサーがある程度のディレイを追加します。AVの設定によって発生するディレイが各システムで異なるため、スピーカー/TVならびにゲームコントローラへ同時にルートされるサウンドを同期させるのは不可能です。サウンドをデザインする場合、この制限を考慮する必要があります。

複数出力のための、デバイス、リスナー、およびゲームオブジェクトの設定

ゲーム内でデバイスを表すために、通常のリスナー/ゲームオブジェクトの概念が使用されています。詳細については 概念:リスナー を参照して下さい。AKSoundEngine::AddSecondaryOutputを利用して出力デバイスとリスナーを関連付けることは、プログラマーの責任になります。プログラマーは、AKSoundEngine::SetActiveListeners または Ak::SoundEngine::RegisterGameObj を使用してこのリスナーに聞こえる必要のあるゲームオブジェクトのリスナーマスクを設定しなければなりません。サウンドがTVにも行く場合には、TVへリスナーを追加することを忘れないでください (通常 Listener 0)。

Note.gif
Note: ゲームコントローラー (またはいずれの他の種類のオーディオ出力) がシステムから接続、接続解除される時はいつでも、ゲームコードが AddSecondaryOutput ならびに RemoveSecondaryOutput の呼び出しを行います。Wwiseは、どのデバイスとどのリスナーを、および概念的にはどのプレイヤーを関連付けるのか、自動的に知ることはできません。

これらの例はPS4のために書かれています。各プラットフォームでパラメータが大変異なるので、AKSoundEngine::AddSecondaryOutput 関数の説明を確認してください。

UserIDsを得るためのコード (PS4 のみ):

SceUserServiceLoginUserIdList list;
sceUserServiceGetLoginUserIdList(&list);

1つのゲームコントローラ出力でのサウンド:

//Add a secondary output connected to the headphones endpoint for player 0, associated with listener #1 (listener 0 is for TV).
AddSecondaryOutput(list.userId[0] /*Player ID (first player)*/, AkSink_PAD,  0x2 /*Listener 1*/);

//Setup a game object to emit sound to the listener 1
RegisterGameObj(MY_GAME_OBJECT, 0x2);

//Play an event.  This sound must be routed to the Master Secondary Bus (or any sub bus)
PostEvent("Play_Pow", MY_GAME_OBJECT);

2つの異なるコントローラでの同じサウンド:

//Add a secondary output connected to the headphones output for player 0, associated with listener #1 (listener 0 is for TV).
AddSecondaryOutput(list.userId[0] /*Player ID (first player)*/, AkSink_PAD,  0x2 /*Listener 1*/);
AddSecondaryOutput(list.userId[1] /*Player ID (second player)*/, AkSink_PAD,  0x4 /*Listener 2*/);

//Set a game object to emit sound to the listener 1(player 0) and 2 (player 1)
SetActiveListeners(EXISTING_GAME_OBJECT, 0x6);

//Play an event.  This sound must be routed to the Master Secondary Bus (or any sub bus)
PostEvent("Play_Pow", EXISTING_GAME_OBJECT);

2つの異なるコントローラでの、異なるサウンド:

//Add a secondary output connected to the headphones output for player 0, associated with listener #1 (listener 0 is for TV).
AddSecondaryOutput(list.userId[0] /*Player ID (first player)*/, AkSink_PAD,  0x2 /*Listener 1*/);
AddSecondaryOutput(list.userId[1] /*Player ID (second player)*/, AkSink_PAD,  0x4 /*Listener 2*/);

//Set a game object to emit sound to the proper listeners
RegisterGameObj(MY_GAME_OBJECT1, 0x2);  
RegisterGameObj(MY_GAME_OBJECT2, 0x4);  

//Play an event.  These sounds must be routed to the Master Secondary Bus (or any sub bus) 
PostEvent("Play_Pow", MY_GAME_OBJECT1);
PostEvent("Play_Pif", MY_GAME_OBJECT2);

1つのゲームコントローラとTVでの同じサウンド:

//Add a secondary output connected to the headphones output for player 0, associated with listener #1 (listener 0 is for TV).
AddSecondaryOutput(list.userId[0] /*Player ID (first player)*/, AkSink_PAD,  0x2 /*Listener 1*/);

//Set a game object to emit sound to the listener 0 (TV) and 1 (controller for player 0)
RegisterGameObj(MY_GAME_OBJECT, 0x3);

//Play an event.  This sound must be routed to the Master Secondary Bus (or any sub bus) plus have a send to an auxiliary bus in the main hierarchy.
PostEvent("Play_Pow", MY_GAME_OBJECT);

このページはお役に立ちましたか?

サポートは必要ですか?

ご質問や問題、ご不明点はございますか?お気軽にお問い合わせください。

サポートページをご確認ください

あなたのプロジェクトについて教えてください。ご不明な点はありませんか。

プロジェクトを登録していただくことで、ご利用開始のサポートをいたします。

Wwiseからはじめよう