Wwise SDK 2021.1.14
|
Motion(モーション)は、コントロールインターフェースのハプティックフィードバックをユーザーがコントロールするための機能です。Wwiseでは、アプリケーションのオーディオを管理するために使用するのと同じ機能セットでモーションを管理できます。Wwiseにとって、モーションデータもオーディオデータも同じです。つまり、オーディオ用に提供された機能は、全てモーションでも使えます。Wwiseモーション機能を使って利用できるハプティックフィードバックは、2種類あります。プロジェクトのオーディオシグナルを使ってモーションに変換するか、Motion Generatorソースを使って専用のモーションシグナルを生成します。この機能は、対応するコントローラがあれば、WindowsのWwiseオーサリングツール上で直接テストできます。
Motion機能は、Wwiseサウンドエンジンのプラグインシステムによってアプリケーション内で作動しますが、2つのモジュールに分けることができ、それがMotion Generatorというオーディオソースと、Wwise Motionというオーディオデバイスです。Motion Generatorはオプションですが、正確で柔軟なモーションデザインを作成するための、高い性能のツールです。
Motionシンクプラグインは、サウンドエンジンとモーション対応のデバイスの間のリンクとして考えることができます。ほかのシンクプラグインと同様に、リスナーのセットからデータを受信して、このデータをデバイスに「見せる」役割を担います。このプラグインは別のライブラリの中にあり、オーサリングツールとアプリケーションの両方に入れる必要があります。詳細は、 ファイルロケーションの解決 のセクションを参照してください。
The Motion source plug-in is a very useful and accurate way to design the behavior of haptic feedback effects. Just like any audio source, you can add a Motion source plug-in to a Sound SFX node in your Wwise project. Sound SFXノードに、モーション対応バスに設定されたアウトプットバスがあることを確認してください。詳細は、 Motion を参照してください。
あなたのアプリケーションでモーションを使うには、全てのコンポーネントを正しく設定する必要があります。なお、オーディオワークフローに該当するコンセプトは、全てモーションにも該当します。同じバス、リスナー、エミッタを利用します( リスナーの統合 を参照)。
サウンドデータやモーションデータをデバイスに送信するには、ライセンス取得済みのWwise Motion Audio Deviceを、あなたのWwiseプロジェクトの、Project ExplorerのAudioタブにあるAudio Deviceフォルダに追加します。Wwise Motion Audio Deviceは、サウンドエンジンがモーション対応デバイスとのインターフェースとして利用するプラグインです。Wwise Motion Audio Deviceを最上位のAudio Busにアサインすることも、重要です。ここでは単純化のために モーションバス を、Wwise Motion Audio Deviceをアサインした最上位のAudio Busのこととします。 トラブルシューティングやモニタリングを容易にするためのグッドプラクティスとして、プロジェクト内のモーションバス階層は、1つだけにします。これで、どのSound SFXのOutput Busでも、モーションバスに設定して、ハプティックフィードバックを作成できます。一般的に、モーションバスを使用するSound SFXエレメントは、Motion Generatorソースも使用します。オーディオとモーションを同時に使うには、サウンドSFXに少なくともモーションバスが1つと、アウトプットバスまたはAuxバスのオーディオバスが1つ、必要です。
ゲーム側では、まず別のライブラリである AkMotionSink
とのリンクを確実に設定します。このライブラリは、対応プラットフォームの標準コントローラのサポートを提供します。また、 SDK\include\AK\plugin
の下にある AkMotionSinkFactory.h ファイルも含める必要があります。このファイルを含めることでプラグインが自動的に登録されるので、非常に重要です。
注釈: UnityとUnrealは、プラグインライブラリを自動的に管理します。マニュアルで AkMotionSink を追加する必要がありません。 |
対応するコントローラ一覧と追加要件については、下表を参照してください。
プラットフォーム | デバイス | デバイスのチャンネル、レイアウト | 追加要件 |
Android | バイブレーション対応Androidデバイス | Anonymous 1-channel | |
iOS | 非対応。 | ||
Linux | 非対応。 | ||
Mac | 非対応。 | ||
PlayStation 4 | DUALSHOCK 4 PlayStation Move |
Anonymous 2-channel: 左モーター、右モーター |
|
PlayStation 5 | DualSense VR コントローラー |
Stereo 2-channel: 左バイブレーション、右バイブレーション |
|
Stadia | Stadia対応ゲームパッド | Anonymous 2-channel: 左モーター、右モーター |
|
Switch | Joy-Con | Anonymous 4-channel: 左低周波バイブレーション、左高周波バイブレーション、 右低周波バイブレーション、右高周波バイブレーション |
|
Windows | XboxおよびXInput対応コントローラ DirectInput対応コントローラ |
Anonymous 2-channel: 左モーター、右モーター |
XInput.lib Dinput8.lib Winmm.lib |
UWP | UWPゲームパッド | Anonymous 4-channel: 左モーター、右モーター 左トリガー、右トリガー |
C++/CX |
Xbox One Xbox Series X |
Xboxコントローラ | Anonymous 4-channel: 左モーター、右モーター 左トリガー、右トリガー |
あなたのアプリケーションでモーションを使うデバイスごとに、専用アウトプットを追加する必要があります。例えば、分割画面のゲームで4人のプレイヤーが参加する場合、コントローラでハプティックフィードバックを受信するには、4つのアウトプットを追加する必要があります。アウトプットデバイスを追加するには、Wwise APIファンクションの AK::SoundEngine::AddOutput
を使い、シェアセット名(Wwiseプロジェクトで設定済み)を、 AkOutputSettings
パラメータで指定します。さらに、複数のデバイスを接続することもあるので、デバイスIDを提供する必要があります。デバイスIDの詳細については、下表を参照してください。
プラットフォーム | デバイス | 情報 |
Android | バイブレーション対応Androidデバイス | 0を使用。 |
iOS | 非対応 | - |
Linux | 非対応。 | - |
Mac | 非対応。 | - |
PlayStation 4 | DUALSHOCK 4、PlayStation Move | scePadOpenまたはscePadGetHandleで返されたデバイスのハンドルを使用。 |
PlayStation 5 | DualSenseコントローラ、VRコントローラ | scePadOpenまたはscePadGetHandleで返されたデバイスのハンドルを使用。PSVR2用には、左右どちらのVRコントローラでもバイブレーションを得るためには、左右どちらかのVRコントローラのハンドルを使い、出力デバイスを1つだけ作成するようにします。デバイスIDとして0を指定すると、VRコントローラではなく、ワイヤレスコントローラだけのために、システムが初期化されます。 |
Stadia | Stadia対応ゲームパッド | ggp::Gamepadオブジェクトで AK::SoundEngine::GetDeviceID を呼び出して、ゲームパッドのDeviceIDを取得。
|
Switch | Joy-Con | 希望インデックスの nn::hid::NpadId を使用。 |
Windows | XboxおよびXInput対応コントローラ | 0から3までのプレイヤーインデックスを使用。 |
Windows | DirectInput対応コントローラ | DIDEVICEINSTANCEに格納のguidProductを使用。guidProductをハッシュするには、 AK::FNVHash32を使います。 |
UWP | UWPゲームパッド |
AK::GetDeviceIDFromGamepad を呼び出して、ゲームパッドのDeviceIDを取得。
|
Xbox One (XDK) | Xboxコントローラ | IGamepadオブジェクトに格納のIDを使用。 |
Xbox One (GDK) Xbox Series X |
Xboxコントローラ |
AK::SoundEngine::GetGameInputDeviceID を呼び出して、ゲームパッドのDeviceIDを取得。 |
注釈: Windows以外のプラットフォームで、デバイスIDとして単に"0"を指定すると、モーション対応の最初の利用可能なデバイスがターゲットとなります。 |
なお、ゲームコントローラーは物理的に切断されたり、接続問題で切断されたりすることがあります。これは、リソースを無駄に消費してしまう以外は、サウンドエンジンへの悪影響は特にありません。デバイスが長時間、接続が切れた状態だと考えられる場合は、 AK::SoundEngine::RemoveOutput
をコールして、対応する AddOutput()ファンクションコールが返却するAkOutputDeviceIDを提供してください。
モーションアウトプットは、ほかのセカンダリアウトプットと同じで、制約事項や要件も同じです。作成中のゲームがシングルプレイヤーで、ローカルでゲームをコントロールしているプレイヤーが1人だけの場合は、Listener/Game Object の設定が非常に簡単です。通常は新しいモーションアウトプットに、メインのオーディオアウトプットと同じデフォルトのリスナーを再利用します。つまり、シングルプレイヤー設定でリスナーを管理する必要はほとんどありません。
マルチプレイヤーゲームの場合はモーションアウトプット1つに対して、Listener/Game Objectを1つ作成する必要があります。それぞれのプレイヤーが、自分のゲーム状況によって、自分用のハプティックフィードバックのミックスをもつために必要なのです。デバイスに関連付けられたリスナーの初期化を、アウトプットが AK::SoundEngine::AddOutput()
で初期化されるのと同時に行う必要があります。特定のリスナーがあれば、サウンドやモーションのルーティングのレイヤが1つ増えます。特定のプレイヤーのListenerに限定して関連付けられているGame Objectに対してEventを再生する場合は、そのプレイヤーをターゲットとすることができます。関連付けは、 AK::SoundEngine::SetListenersをコールして行います。リスナーやゲームオブジェクトの詳細は、
リスナーの統合 を参照してください。なお、同じゲームオブジェクトに複数のリスナーを関連付けることもでき、その結果、全てのリスナーに対するブロードキャスト(配信)のような効果となります。
注釈: エミッタがリスナーとしてモーションアウトプットに設定されている場合も、サウンドをモーションバス階層にルーティングする必要があります。 |
以下は、モーションが使えるようにアプリケーションを設定する方法について、例を通して説明します。また、SDKサンプルに含まれるIntegration Demo (DemoMotion.cpp) のDemo Motionも参照してください。全ての対応プラットフォーム用に、それぞれ動かせるデモを提供しています。
最初に一般的なプラグイン管理のルールとして、ほかのプラグインと同様に、該当するファイルを含めて、ライブラリにリンクする必要があります。(Wwiseネイティブデプロイメントに限った設定です。Unityでは不要です。)
次に、あなたがWwiseプロジェクトで指定したMotion ShareSet名を使って追加アウトプットを追加しますが、今回の名前は"Wwise_Motion"です。最初に接続されたゲームコントローラを使いたいので、アウトプットIDは0にします。
次に、通常通りにEventを再生します。Wwiseプロジェクト内で、"Play_Explosion" Eventがポイントするのは、"Wwise_Motion"シェアセットをAudio DeviceにアサインしてあるバスにルーティングされたサウンドSFXです。
念のための確認ですが、マルチプレイヤーゲームとは、「同じコンソールで複数のプレイヤー」を意味するのであって、「ネットワーク接続のマルチプレイヤーゲーム」ではありません。マルチプレイヤーのシナリオで、モーションなど、そのプレイヤー専用のアウトプットのミックスは、プレイヤーのゲーム内の視点を表現できるように、変える必要があります。そのためには、プレイヤーごとのリスナーが必要です。
次に、プレイヤー別にそれぞれアウトプットを追加します。複数のシェアセットは不要で、どのシェアセットでも何回も使えます。コントローラ別に、本当のデバイスIDを提供する必要があります。これは、Windowsで、Xboxコントローラのレイです。それぞれのプラットフォームでデバイスIDを取得する方法については、 Game Setup の表を参照してください。
次に、通常通りにEventを再生します。Wwiseプロジェクト内で、"Play_GunFire" Eventがポイントするのは、"Wwise_Motion" ShareSetをAudio DeviceにアサインしてあるバスにルーティングされたサウンドSFXです。
複数のデバイスに影響するEventを再生するには、新しいGame Objectを設定して、それぞれのプレイヤーのListenerがそれを聞くように、設定する必要があります。
また、IntegrationDemoサンプルの中の DemoMotion
クラスも、参照してください。マルチレイヤ設定の例を提供しています。
特定のデバイスが、1つのデバイスでモーションを受信するには以下を実行する必要があります:
AkMotionSink
ライブラリにリンクして、AkMotionSinkライブラリにリンクしてください。 注釈: UnityとUnrealは、プラグインライブラリを自動的に管理します。前の手順は不要です。 |
AK::SoundEngine::RegisterGameObj
を使って作成します。Ak::SoundEngine::AddOutputをコールします。マルチプレイヤーの場合は、それぞれのプレイヤー用にリスナーオブジェクトを提供します。
WwiseプロジェクトでMotionを使うには
問題のトラブルシューティングをする場合は、あなたのアプリケーションをプロファイリングすることを推奨します。オーサリングツール内でアプリケーションをプロファイリングするには、接続してから、Profilerレイアウト(F6)を開きます。問題の根源を理解するために、役立つツールがいくつかあります。Capture Logビューで、赤字で表示されるエラーコードを確認できます。Graphビューで、サウンドエンジンのパイプラインのイメージ図を確認できます。パイプラインの最後に、モーションデバイスが表示されるはずです。なければ、指定したデバイスをサウンドエンジンが見つけられなかったということです。Emitter/Listenerタブも、非常に便利なビューです。エミッタとリスナーのペアが、全て表示されます。モーションエフェクトが作動しない場合は、あなたがモーションデバイスに指定したリスナーが、エミッタに関連付いていない可能性があります。
Motionエフェクトをトリガーしても実行されない場合は、以下を行います:
AddOutput
をコールしたときにエラーが表示されます。RegisterGameObj
、 SetListeners、そして
AddOutput
へ出したコールを確認してください。Androidデバイスの場合は忘れずに、アプリケーションのAndroidManifest.xmlファイルに、パーミッションを以下の通りに追加してください: