Wwise SDK 2023.1.8
|
Motionプラグインを使用し、コントロールインターフェースのハプティックフィードバックをコントロールできます。Wwiseでは、アプリケーションのモーションとオーディオの管理に同じツールセットを使用できます。内部的にはモーションデータとオーディオデータは全く変わらないため、オーディオで利用できるすべての機能をモーションでも利用できます。モーション機能を通じて2種類のハプティックフィードバックを利用でき、プロジェクトの任意のオーディオ信号をモーションに変換するか、Motionソースを使って専用のモーション信号を生成できます。モーションは、対応するコントローラがあれば、WindowsのWwise Authoringで直接テストできます。
Motionは、Wwise Sound Engineのプラグインシステムを使ってアプリケーション内で動作し、Motionと呼ばれるオーディオソースとWwise Motionと呼ばれるAudio Deviceの2つのモジュールに分けられます。Motionオーディオソースは任意ですが、正確で柔軟なモーションデザインを作成できる強力なツールです。
Wwise Motionオーディオデバイスプラグインは、サウンドエンジンをモーション対応デバイスにリンクします。ほかのオーディオデバイスプラグインと同様に、Listenerのセットからデータを受信し、このデータをデバイスに「提示」します。このプラグインは別のライブラリの中にあり、Wwise Authoringとアプリケーションの両方に入れる必要があります。詳細は、 ファイルロケーションの解決 のセクションを参照してください。
Motionソースプラグインを使用し、ハプティックフィードバックのエフェクトの動作をデザインできます。ほかのオーディオソースと同様に、WwiseプロジェクトのSound SFXノードにMotionソースプラグインを追加します。Sound SFXノードに、モーション対応バスに設定されたOutput Busがあることを確認してください。詳細についてはMotionをご覧ください。
アプリケーションでモーションを使用するには、各コンポーネントを適切に設定する必要があります。オーディオワークフローに該当する概念はすべてモーションにも該当します。同じバス、Listener、Emitterを利用します( リスナーの統合 を参照)。
サウンドデータやモーションデータをデバイスに送信するには、ライセンス取得済みの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ソースも使用します。オーディオとモーションを同時に使用するには、Sound SFXに少なくともモーションバスが1つと、Output BusまたはAuxiliary BusとしてAudio Busが1つ必要です。
ゲーム側は、 AkMotionSink
という別のライブラリとリンクします。このライブラリは、対応プラットフォームの標準コントローラのサポートを提供します。また、 SDK\include\AK\plugin
下にある AkMotionSinkFactory.h ファイルも含める必要があります。このファイルを含めることでプラグインが自動的に登録されるため、非常に重要です。
注釈: UnityとUnrealは、プラグインライブラリを自動的に管理します。マニュアルで AkMotionSink を追加する必要がありません。 |
対応するコントローラ一覧と追加要件については、下表を参照してください。
プラットフォーム | デバイス | デバイスのチャンネルコンフィギュレーション、レイアウト | 追加要件 |
Android | バイブレーション対応のAndroidデバイス | Anonymous 1-channel | |
iOS | バイブレーション対応のiOSデバイス iOS対応コントローラ | Anonymous 1-channel | CoreHaptics.framework GameController.framework |
Linux | 非対応。 | ||
Mac | Mac対応コントローラ | Anonymous 1-channel | CoreHaptics.framework GameController.framework |
OpenHarmony | バイブレーション対応のOpenHarmonyデバイス | Anonymous 1-channel | |
PlayStation 4 | DUALSHOCK 4 PlayStation Move | Anonymous 2-channel: 左モーター、右モーター | |
PlayStation 5 | DualSense VRコントローラ | Stereo 2-channel: 左バイブレーション、右バイブレーション | |
Switch | Joy-Con | Anonymous 4-channel: 左低周波バイブレーション、左高周波バイブレーション、 右低周波バイブレーション、右高周波バイブレーション | |
Windows | XboxおよびXInput対応コントローラ DirectInput対応コントローラ | Anonymous 2-channel: 左モーター、右モーター | XInput.lib Dinput8.lib Winmm.lib |
Xbox One Xbox Series X | Xboxコントローラ | Anonymous 4-channel: 左モーター、右モーター 左トリガー、右トリガー |
アプリケーションでモーションを1つ以上のデバイスで使用する場合は、各デバイスに専用の出力を追加する必要があります。例えば、分割画面のゲームで4人のプレイヤーが参加する場合、コントローラでハプティックフィードバックを受信するには4つの出力が必要です。出力デバイスを追加するには、Wwise APIの AK::SoundEngine::AddOutput
関数を使用し、ShareSet名(Wwiseプロジェクトで設定済み)を AkOutputSettings
パラメータで指定します。さらに、複数のデバイスを接続できるためデバイスIDを提供する必要があります。デバイスIDの詳細については下表をご覧ください。
プラットフォーム | デバイス | 情報 |
Android | バイブレーション対応のAndroidデバイス | 0を使用します。 |
iOS | バイブレーション対応のiOSデバイス、iOS対応コントローラ | デバイスを振動させるには0を使用します。接続されたコントローラを振動させるには、まずGameController.framework APIを使用して希望するGCControllerインスタンスにプレイヤーインデックスをアサインします。次に、 AK::SoundEngine::GetDeviceIDFromPlayerIndex をコールしてそのプレイヤーインデックスのDeviceIDを取得します。 常駐モードを使用する場合はDeviceIDにAKMOTION_RESIDENT_MODEを追加します。通常、無音から開始するとバイブレーションが数十ミリ秒間無視されますが、常駐モードで実行時はこのディレイが除去されます。ただし常駐モードで実行すると、デバイスの電力消費量がわずかに増加します。 |
Linux | 非対応。 | - |
Mac | Mac対応コントローラ | まずGameController.framework APIを使用して希望するGCControllerインスタンスにプレイヤーインデックスをアサインします。次に、 AK::SoundEngine::GetDeviceIDFromPlayerIndex をコールしてそのプレイヤーインデックスのDeviceIDを取得します。 常駐モードを使用する場合はDeviceIDにAKMOTION_RESIDENT_MODEを追加します。通常、無音から開始するとバイブレーションが数十ミリ秒間無視されますが、常駐モードで実行時はこのディレイが除去されます。ただし常駐モードで実行すると、デバイスの電力消費量がわずかに増加します。 |
OpenHarmony | バイブレーション対応のOpenHarmonyデバイス | 0を使用します。 |
PlayStation 4 | DUALSHOCK 4、PlayStation Move | scePadOpenまたはscePadGetHandleで返されたデバイスのハンドルを使用します。 |
PlayStation 5 | DualSenseコントローラ、VRコントローラ | scePadOpenまたはscePadGetHandleで返されたデバイスのハンドルを使用します。PSVR2の場合、両方のVRコントローラでバイブレーションを得るには、左または右のVRコントローラのハンドルを使用して出力デバイスを1つだけ作成します。デバイスIDとして0を指定すると、ワイヤレスコントローラ向けにのみシステムが初期化され、VRコントローラ向けに初期化されません。 PlayStation 5のDualSenseコントローラおよびVRコントローラでは、System Softwareで、ハプティックフィードバックに必要なAdvancedバイブレーションコントロールモードがデフォルトで有効化されています。ご自分のコードがscePadSetVibrationModeをコールする場合、バイブレーションモードのSCE_PAD_VIBRATION_MODE_COMPATIBLEを設定するなど、Advancedバイブレーションコントロールモードを無効にする動作は一切使用しないでください。 |
Switch | Joy-Con | 希望するインデックスのnn::hid::NpadIdを使用します。 |
Windows | XboxおよびXInput対応コントローラ | 0から3までのプレイヤーインデックスを使用します。 |
Windows | DirectInput対応コントローラ | DIDEVICEINSTANCEに保存されたguidProductを使用します。guidProductをハッシュするには、 AK::FNVHash32 を使います。 |
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
を提供してください。
Motion出力はほかのSecondary Outputと同様のため、制約や要件も同じです。シングルプレイヤーのゲームを作成中で、1人のプレイヤーがローカルでゲームをコントロールする場合、Listener/Game Objectの設定は非常にシンプルです。通常は新しいモーション出力に、メインのオーディオ出力と同じデフォルトのListenerを再利用します。つまりシングルプレイヤー設定では、Listenerを管理する必要がほとんど必要ありません。
マルチプレイヤーゲームの場合は、モーション出力ごとにListener/Game Objectを1つ作成する必要があります。これは各プレイヤーが、ゲームにおける状況に応じて、独自のハプティックフィードバックのミックスを得るために必要です。デバイスに関連付けられたListenerの初期化を、アウトプットが AK::SoundEngine::AddOutput()
で初期化されるのと同時に行う必要があります。特定のListenerがあれば、サウンドやモーションのルーティングのレイヤーが1つ増えます。特定のプレイヤーのListenerに限定して関連付けられているGame Objectに対してEventを再生する場合は、そのプレイヤーをターゲットとすることができます。この関連性を確立するには AK::SoundEngine::SetListeners
をコールします。さらに、同じゲームオブジェクトに複数のリスナーを関連付けることもでき、それによりすべてのリスナーに対する「ブロードキャスト(同時配信)」効果を実現できます。ListenerやGame Objectの詳細は、 リスナーの統合 を参照してください。
注釈: Emitterに、モーション出力に設定されたListenerがある場合も、サウンドをモーションバス階層にルーティングする必要があります。 |
以下に例を示しながら、モーションを使用できるようにアプリケーションを設定する方法について説明します。SDKサンプルに含まれるIntegration Demo(DemoMotion.cpp)にあるDemo Motion例もご参照ください。全ての対応プラットフォーム用に、それぞれ動かせるデモを提供しています。
まず初めに、ほかのプラグインと同様に、該当するファイルを含め、ライブラリにリンクする必要があります(Wwiseネイティブ開発のみが対象で、Unityでは不要です)。
次に、WwiseプロジェクトのWwise Motion Audio Device ShareSet名を使用して別の出力を追加しますが、今回の場合は「Wwise_Motion」です。最初に接続されたゲームコントローラを使用するので、出力IDを0にします。
続いてEventを再生します。Wwiseプロジェクト内で、「Play_Explosion」EventがリンクしているSound SFXは、Audio Deviceとして「Wwise_Motion」ShareSetをアサインしたバスにルーティングされています。
このセクションではマルチプレイヤー向けのモーションの設定方法を説明しますが、同じコンソール上の複数のプレイヤーについてであり、ネットワーク接続のマルチプレイヤーゲームについてではありません。マルチプレイヤーのシナリオでは、モーションなど、そのプレイヤー専用の出力のミックスは、プレイヤーのゲーム内の視点を表現できるように変える必要があります。そのためには、プレイヤーごとのListenerが必要です。
各プレイヤーに出力を追加します。Audio Device ShareSetは繰り返し使用できるため、複数のAudio Device ShareSetを作成する必要はありません。必ずコントローラごとに実際のデバイスIDを提供します。これは、Windowsで、Xboxコントローラの例です。それぞれのプラットフォームでデバイスIDを取得する方法については、 ゲームの設定 の表を参照してください。
続いてEventを再生します。Wwiseプロジェクト内で、「Play_GunFire」EventがリンクしているSound SFXは、Audio Device ShareSetとして「Wwise_Motion」をアサインしたバスにルーティングされています。
複数のデバイスに作用するEventを再生するには、新しいGame Objectを設定し、それぞれのプレイヤーのListenerがそれを聞くようにします。
マルチプレイヤーの設定例については、IntegrationDemoサンプルの DemoMotion
クラスをご参照ください。
特定のデバイスが、1つのデバイスでモーションを受信するには以下を実行する必要があります:
AkMotionSink
ライブラリにリンクします。AkMotionSinkFactory.h
を含め、 AkMotionSink
ライブラリにリンクします。 注釈: UnityとUnrealは、プラグインライブラリを自動的に管理します。このステップは不要です。 |
AK::SoundEngine::RegisterGameObj
で作成します。Ak::SoundEngine::AddOutput
をコールします。マルチプレイヤーの場合は、それぞれにListenerオブジェクトを提供します。MotionをWwiseプロジェクトに追加するには:
問題をトラブルシューティングするには、アプリケーションをプロファイリングすることを推奨します。プロファイリングに記載されている通り、Wwise Authoringでアプリケーションをプロファイリングできます。問題の根源を理解するために、役立つツールがいくつかあります。Capture Logビューではエラーコードが赤字で表示されます。Graphビューで、サウンドエンジンのパイプラインのイメージ図を確認できます。モーションデバイスはパイプラインの最後に表示されます。モーションデバイスが表示されていない場合は、指定したデバイスをサウンドエンジンが見つけられなかったということです。最後に、Emitter/ListenerタブにEmitter-Listenerの組み合わせがすべて表示されます。Motion Effectが機能していない場合、モーションデバイスに指定したListenerがEmitterに関連付けられていない可能性があります。
Motionエフェクトをトリガーしても実行されない場合は、以下を行います:
AkMotionSinkFactory.h
が含まれ、 AkMotionSink
ライブラリにリンクしているかを確認してください。AddOutput
をコールした時にCapture Logにエラーが表示されます。RegisterGameObj
、 SetListeners
、 AddOutput
に対するコールを確認してください。Androidデバイスの場合は、アプリケーションのAndroidManifest.xmlファイルにパーミッションを追加してください: