バージョン

menu_open
警告:このページでは、一部の保護された情報が表示されません。
あなたが特定プラットフォームのライセンスを所有しているユーザであれば、最初にログインしてください。
Wwise SDK 2023.1.8
Wwise Motionの統合

Motionプラグインを使用し、コントロールインターフェースのハプティックフィードバックをコントロールできます。Wwiseでは、アプリケーションのモーションとオーディオの管理に同じツールセットを使用できます。内部的にはモーションデータとオーディオデータは全く変わらないため、オーディオで利用できるすべての機能をモーションでも利用できます。モーション機能を通じて2種類のハプティックフィードバックを利用でき、プロジェクトの任意のオーディオ信号をモーションに変換するか、Motionソースを使って専用のモーション信号を生成できます。モーションは、対応するコントローラがあれば、WindowsのWwise Authoringで直接テストできます。

Motionコンポーネント

Motionは、Wwise Sound Engineのプラグインシステムを使ってアプリケーション内で動作し、Motionと呼ばれるオーディオソースとWwise Motionと呼ばれるAudio Deviceの2つのモジュールに分けられます。Motionオーディオソースは任意ですが、正確で柔軟なモーションデザインを作成できる強力なツールです。

Wwise Motionオーディオデバイスプラグイン

Wwise Motionオーディオデバイスプラグインは、サウンドエンジンをモーション対応デバイスにリンクします。ほかのオーディオデバイスプラグインと同様に、Listenerのセットからデータを受信し、このデータをデバイスに「提示」します。このプラグインは別のライブラリの中にあり、Wwise Authoringとアプリケーションの両方に入れる必要があります。詳細は、 ファイルロケーションの解決 のセクションを参照してください。

Motionソースプラグイン

Motionソースプラグインを使用し、ハプティックフィードバックのエフェクトの動作をデザインできます。ほかのオーディオソースと同様に、WwiseプロジェクトのSound SFXノードにMotionソースプラグインを追加します。Sound SFXノードに、モーション対応バスに設定されたOutput Busがあることを確認してください。詳細についてはMotionをご覧ください。

Motionの設定

アプリケーションでモーションを使用するには、各コンポーネントを適切に設定する必要があります。オーディオワークフローに該当する概念はすべてモーションにも該当します。同じバス、Listener、Emitterを利用します( リスナーの統合 を参照)。

Wwise Authoringの設定

サウンドデータやモーションデータをデバイスに送信するには、ライセンス取得済みの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-channelCoreHaptics.framework
GameController.framework
Linux非対応。
MacMac対応コントローラAnonymous 1-channelCoreHaptics.framework
GameController.framework
OpenHarmonyバイブレーション対応のOpenHarmonyデバイスAnonymous 1-channel
PlayStation 4DUALSHOCK 4
PlayStation Move
Anonymous 2-channel:
左モーター、右モーター
PlayStation 5DualSense
VRコントローラ
Stereo 2-channel:
左バイブレーション、右バイブレーション
SwitchJoy-ConAnonymous 4-channel:
左低周波バイブレーション、左高周波バイブレーション、
右低周波バイブレーション、右高周波バイブレーション
WindowsXboxおよび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非対応。-
MacMac対応コントローラまずGameController.framework APIを使用して希望するGCControllerインスタンスにプレイヤーインデックスをアサインします。次に、 AK::SoundEngine::GetDeviceIDFromPlayerIndex をコールしてそのプレイヤーインデックスのDeviceIDを取得します。
常駐モードを使用する場合はDeviceIDにAKMOTION_RESIDENT_MODEを追加します。通常、無音から開始するとバイブレーションが数十ミリ秒間無視されますが、常駐モードで実行時はこのディレイが除去されます。ただし常駐モードで実行すると、デバイスの電力消費量がわずかに増加します。
OpenHarmonyバイブレーション対応のOpenHarmonyデバイス0を使用します。
PlayStation 4DUALSHOCK 4、PlayStation MovescePadOpenまたはscePadGetHandleで返されたデバイスのハンドルを使用します。
PlayStation 5DualSenseコントローラ、VRコントローラscePadOpenまたはscePadGetHandleで返されたデバイスのハンドルを使用します。PSVR2の場合、両方のVRコントローラでバイブレーションを得るには、左または右のVRコントローラのハンドルを使用して出力デバイスを1つだけ作成します。デバイスIDとして0を指定すると、ワイヤレスコントローラ向けにのみシステムが初期化され、VRコントローラ向けに初期化されません。
PlayStation 5のDualSenseコントローラおよびVRコントローラでは、System Softwareで、ハプティックフィードバックに必要なAdvancedバイブレーションコントロールモードがデフォルトで有効化されています。ご自分のコードがscePadSetVibrationModeをコールする場合、バイブレーションモードのSCE_PAD_VIBRATION_MODE_COMPATIBLEを設定するなど、Advancedバイブレーションコントロールモードを無効にする動作は一切使用しないでください。
SwitchJoy-Con希望するインデックスのnn::hid::NpadIdを使用します。
WindowsXboxおよびXInput対応コントローラ0から3までのプレイヤーインデックスを使用します。
WindowsDirectInput対応コントローラ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つのデバイスでモーションを受信するには以下を実行する必要があります:

  1. Wwise Motion Audio Device ShareSetをプロジェクトに追加します。
  2. 最上位のAudio Busを作成し、そのAudio Deviceに、今追加したWwise Motion Audio Device ShareSetを設定します。
  3. Sound SFXを作成し、モーションバス階層にルーティングします。
  4. ゲーム内で AkMotionSink ライブラリにリンクします。AkMotionSinkFactory.h を含め、 AkMotionSink ライブラリにリンクします。
    注釈: UnityとUnrealは、プラグインライブラリを自動的に管理します。このステップは不要です。
  5. モーションEventをコールしたり受信したりするためのGame Objectを AK::SoundEngine::RegisterGameObj で作成します。
  6. Wwise Motion ShareSet とデバイスIDを使用し、 Ak::SoundEngine::AddOutput をコールします。マルチプレイヤーの場合は、それぞれにListenerオブジェクトを提供します。
  7. Eventをトリガーするには、オーディオEventと同じ方法で行います。

MotionをWwiseプロジェクトに追加するには:

  1. Wwise Motion Audio Device ShareSetをプロジェクトに追加します。
  2. 最上位のAudio Busを作成し、そのAudio Deviceに、今追加したWwise Motion Audio Device ShareSetを設定します。
  3. Sound SFXを作成し、モーションバス階層にルーティングします。
  4. Audio Preferencesで、モーションを使用するバスに移動し、各バスのデバイスに設定するモーションデバイスをリストから選択します。

プロファイリング

問題をトラブルシューティングするには、アプリケーションをプロファイリングすることを推奨します。プロファイリングに記載されている通り、Wwise Authoringでアプリケーションをプロファイリングできます。問題の根源を理解するために、役立つツールがいくつかあります。Capture Logビューではエラーコードが赤字で表示されます。Graphビューで、サウンドエンジンのパイプラインのイメージ図を確認できます。モーションデバイスはパイプラインの最後に表示されます。モーションデバイスが表示されていない場合は、指定したデバイスをサウンドエンジンが見つけられなかったということです。最後に、Emitter/ListenerタブにEmitter-Listenerの組み合わせがすべて表示されます。Motion Effectが機能していない場合、モーションデバイスに指定したListenerがEmitterに関連付けられていない可能性があります。

Motionエフェクトをトリガーしても実行されない場合は、以下を行います:

  • Capture Logで、プラグインの登録エラーがないことを確認します。もしあれば、 AkMotionSinkFactory.h が含まれ、 AkMotionSink ライブラリにリンクしているかを確認してください。
  • サウンドエンジンがデバイスを初期化したことを確認します。していなければ、ゲームが AddOutput をコールした時にCapture Logにエラーが表示されます。
  • 再生するSound SFXが、モーションデバイスにつながったバスにルーティングされていることを確認します。Sound SFXのAudio Busプロパティと、バスのAudio Deviceプロパティを確認してください。
  • Voices Graphタブで、どのEmitterがトリガーされたのかを特定します。Emitter-Listenerタブで、関連付けられたListenerがあることを確認してください。同じGame Objectがエミッターであり、リスナーでもある可能性もあります。関連付けられたListenerがない場合は、 RegisterGameObjSetListenersAddOutput に対するコールを確認してください。
  • Listenerが希望する出力デバイスに関連付けられていることを確認します。
  • これまでに行ったAPIコールの結果を確認し、エラーがないか調べてください。

Androidデバイスの場合は、アプリケーションのAndroidManifest.xmlファイルにパーミッションを追加してください:

AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypes.h:60
AKSOUNDENGINE_API AKRESULT RegisterGameObj(AkGameObjectID in_gameObjectID)
AkUInt32 AkDeviceID
I/O device ID
Definition: AkTypes.h:78
Platform-independent initialization settings of output devices.
#define AKMOTIONSINK_DYNAMIC_LINK_SCEPAD_FUNCTIONS
AKSOUNDENGINE_API AKRESULT SetListeners(AkGameObjectID in_emitterGameObj, const AkGameObjectID *in_pListenerGameObjs, AkUInt32 in_uNumListeners)
#define AKMOTIONSINK_STATIC_LINK_SCEPAD_FUNCTIONS
AKSOUNDENGINE_API AKRESULT AddOutput(const AkOutputSettings &in_Settings, AkOutputDeviceID *out_pDeviceID=NULL, const AkGameObjectID *in_pListenerIDs=NULL, AkUInt32 in_uNumListeners=0)
#define AKMOTION_SCEPAD_HAPTICS_MODE
uint32_t AkUInt32
Unsigned 32-bit integer
AKSOUNDENGINE_API AkPlayingID PostEvent(AkUniqueID in_eventID, AkGameObjectID in_gameObjectID, AkUInt32 in_uFlags=0, AkCallbackFunc in_pfnCallback=NULL, void *in_pCookie=NULL, AkUInt32 in_cExternals=0, AkExternalSourceInfo *in_pExternalSources=NULL, AkPlayingID in_PlayingID=AK_INVALID_PLAYING_ID)

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

サポートは必要ですか?

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

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

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

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

Wwiseからはじめよう