バージョン
menu

警告:一部の保護された情報は表示されません。
特定プラットフォームのライセンスを所有しているユーザであれば、サインインしてください。
Wwise SDK 2025.1.2
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 を追加する必要がありません。

対応するコントローラ一覧と追加要件については、下表を参照してください。

PlatformDeviceDevice Channel Config and LayoutAdditional Requirements
AndroidAndroid device with vibration supportAnonymous 1-channelHigh-resolution vibration support for Android 8 and later
iOSiOS device with vibration support
iOS対応コントローラ(iOS 14.0以降)
Anonymous 1-channelCoreHaptics.framework
GameController.framework
iOS 13.0以降
tvOStvOS対応コントローラ(tvOS 14.0以降)Anonymous 1-channelCoreHaptics.framework
GameController.framework
Linuxサポート対象外。
MacMac対応コントローラ(macOS 11.0以降)Anonymous 1-channelCoreHaptics.framework
GameController.framework
macOS 10.15以降
OpenHarmonyバイブレーション対応のOpenHarmonyデバイスAnonymous 1-channel
PlayStation 4DUALSHOCK 4
PlayStation Move
Anonymous 2-channel:
左モーター、右モーター
PlayStation 5DualSense
VRコントローラ
Stereo 2-channel:
左バイブレーション、右バイブレーション
SwitchJoy-ConAnonymous 4-channel:
左低周波バイブレーション、左高周波バイブレーション、
right low-freq vibration, right high-freq vibration
Switch 2Joy-ConStereo 2-channel:
Left vibration, right vibration
WindowsXInput-compatible ControllersAnonymous 2-channel:
Left motor, right motor
Xinput.lib
WindowsGameInput-compatible ControllersAnonymous 4-channel and Stereo 2-channelSee Support for GameInput on Windows for more information.
WindowsDualShock 4 and DualSense ControllersAnonymous 2-channel and Stereo 2-channelSee the "Support for DualShock 4 and DualSense on Windows using libScePad" section below (login with PS5 license required)
Xbox One
Xbox Series X
XboxコントローラAnonymous 4-channel:
左モニター、右モニター、左Impulse Trigger、右Impulse Trigger


アプリケーションでモーションを1つ以上のデバイスで使用する場合は、各デバイスに専用の出力を追加する必要があります。例えば、分割画面のゲームで4人のプレイヤーが参加する場合、コントローラでハプティックフィードバックを受信するには4つの出力が必要です。出力デバイスを追加するには、Wwise APIの AK::SoundEngine::AddOutput 関数を使用し、ShareSet名(Wwiseプロジェクトで設定済み)を AkOutputSettings パラメータで指定します。さらに、複数のデバイスを接続できるためデバイスIDを提供する必要があります。デバイスIDの詳細については下表をご覧ください。

プラットフォームデバイス情報
Androidバイブレーション対応のAndroidデバイス0を使用します。
iOSバイブレーション対応のiOSデバイス、iOS対応コントローラデバイスを振動させるには0を使用します。To vibrate a connected controller, first assign a player index to the desired GCController instance using the GameController.framework API. Then, retrieve the DeviceID of that player index by calling AK::SoundEngine::GetDeviceIDFromPlayerIndex.
Normally, vibrations are delayed for a few tens of milliseconds when starting from silence. If this delay is unacceptable, add AKMOTION_RESIDENT_MODE to DeviceID. This eliminates the delay at the cost of increased power consumption and reduced battery life.
LinuxNot supported.-
MacMac-compatible ControllersFirst, assign a player index to the desired GCController instance using the GameController.framework API. Then, retrieve the DeviceID of that player index by calling AK::SoundEngine::GetDeviceIDFromPlayerIndex.
Normally, vibrations are delayed for a few tens of milliseconds when starting from silence. If this delay is unacceptable, add AKMOTION_RESIDENT_MODE to DeviceID. This eliminates the delay at the cost of increased power consumption and reduced battery life.
OpenHarmonyOpenHarmony device with vibration supportUse 0.
PlayStation 4DUALSHOCK 4 and PlayStation MoveUse the handle of the device returned by scePadOpen or 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を使用します。
Switch 2Joy-ConUse nn::hid::NpadId with the desired index.
WindowsXInput-compatible ControllersUse the player index between 0 to 3.
WindowsGameInput対応コントローラゲームパッドのGameInputDeviceInfoを取得し、GameInputDeviceInfo::deviceIdのアドレスをパラメータとして指定して AK::GetAppLocalDeviceIdHash を呼び出します。
Note that the Motion output is only initialized for devices with either a non-zero value for GameInputDeviceInfo::supportedRumbleMotors, or a non-zero value for GameInputHapticInfo::locationCount.
レーシングホイールやフライトスティックといったフォースフィードバックのみを使用するデバイスには対応していません。
Xbox One (XDK)XboxコントローラIGamepadオブジェクトに保存されたIDを使用します。
Xbox One (GDK)
Xbox Series X
XboxコントローラAK::SoundEngine::GetGameInputDeviceID を呼び出して、ゲームパッドのDeviceIDを取得します。


注釈: Windows以外のすべてのプラットフォームで、デバイスIDが「0」の場合は最初の利用可能なモーション対応デバイスがターゲットとなります。WindowsではデバイスIDが「0」の場合はXInputデバイスとして初期化されます。

ゲームコントローラは、物理的に接続が切れたり、接続問題により切れたりすることがあります。接続が切断された場合、リソースが無駄に消費されること以外に、サウンドエンジンへの悪影響はありません。デバイスの接続が長時間切れた状態だと考えられる場合は AK::SoundEngine::RemoveOutput をコールし、対応する AddOutput() 関数コールが返す AkOutputDeviceID を提供してください。

Support for GameInput on Windows

Wwise Motion supports both rumble-based gamepads and haptic-based gamepads through the GameInput API for Windows.

If your project uses advanced haptics with GameInput, the following additional considerations apply:

  • GameInput v2.0 or newer must be installed on the target Windows system.
  • You must incorporate the GameInput redistributable in your application's installer yourself, according to the instructions provided in the Microsoft documentation (see Overview of GameInput).

When you provide the device ID retrieved through AK::GetAppLocalDeviceIdHash as-is, Wwise Motion will default to the rumble-based Motion implementation for the gamepad associated with this device ID. In order to use the haptic-based implementation with a haptic-compatible device, you must first apply a bitwise-OR operation of the flag AKMOTION_GAMEINPUT_HAPTICS_MODE to the device ID before initializing the device. This flag is provided in the AkMotionSinkGameInputHelpers.h file. The following example demonstrates detection of a haptic-enabled device:

const GameInputDeviceInfo* pDeviceInfo = nullptr;
pGameInputDevice->GetDeviceInfo(&pDeviceInfo);
//Get the AkDeviceID for the GameInput device
AkDeviceID wwiseDeviceID = AK::GetAppLocalDeviceIdHash(&pDeviceInfo->deviceId);
//If the device supports haptics, apply the flag to the AkDeviceID before initialization.
GameInputHapticInfo hapticInfo;
pGameInputDevice->GetHapticInfo(&hapticInfo);
if (hapticInfo.locationCount > 0 && hapticInfo.locationCount <= GAMEINPUT_HAPTIC_MAX_LOCATIONS)
{
}
注釈:
  • When using GameInput advanced haptics, Wwise Motion creates a WASAPI audio session so that the waveform is automatically sent to the configured channels of the audio device for the gamepad. 通常どおりに操作するには、オーディオデバイスが、PC上で通常のオーディオデバイスであるかのようにアクティブである必要があります。

マルチプレイヤーの場合の検討事項

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では不要です)。

#include "AkMotionSinkFactory.h" //AkMotionSink.libにリンクします

次に、WwiseプロジェクトのWwise Motion Audio Device ShareSet名を使用して別の出力を追加しますが、今回の場合は「Wwise_Motion」です。最初に接続されたゲームコントローラを使用するので、出力IDを0にします。

AkOutputSettings outputSettings("Wwise_Motion", 0);

続いてEventを再生します。Wwiseプロジェクト内で、「Play_Explosion」EventがリンクしているSound SFXは、Audio Deviceとして「Wwise_Motion」ShareSetをアサインしたバスにルーティングされています。

AkGameObjectID explosionGO = 100;
AK::SoundEngine::RegisterGameObj(explosionGO, "Explosion");
AK::SoundEngine::PostEvent("Play_Explosion", explosionGO);

マルチプレイヤーの設定

このセクションではマルチプレイヤー向けのモーションの設定方法を説明しますが、同じコンソール上の複数のプレイヤーについてであり、ネットワーク接続のマルチプレイヤーゲームについてではありません。マルチプレイヤーのシナリオでは、モーションなど、そのプレイヤー専用の出力のミックスは、プレイヤーのゲーム内の視点を表現できるように変える必要があります。そのためには、プレイヤーごとのListenerが必要です。

int NUM_PLAYERS = 4;
const AkGameObjectID OBJ_FOR_PLAYER[MAX_PLAYERS] = {100 ,200, 300, 400}; // Game Object IDは任意です。
for(int i = 0; i < NUM_PLAYERS; i++)
{
AK::SoundEngine::RegisterGameObj(OBJ_FOR_PLAYER[i]); // Listenerとして使用するGameObjectを登録します。
AK::SoundEngine::SetListeners(OBJ_FOR_PLAYER[i], &OBJ_FOR_PLAYER[i], 1); // Game Object自身をリスナーにします。
}

各プレイヤーに出力を追加します。Audio Device ShareSetは繰り返し使用できるため、複数のAudio Device ShareSetを作成する必要はありません。必ずコントローラごとに実際のデバイスIDを提供します。これは、Windowsで、Xboxコントローラの例です。それぞれのプラットフォームでデバイスIDを取得する方法については、 ゲームの設定 の表を参照してください。

const AkUInt32 DEVICE_SPECIFIC_ID[MAX_PLAYERS] = {0, 1, 2, 3}; // Windowsで、Xboxコントローラの場合は、デバイスIDは単純に0から3までです。ほかのプラットフォームは、要件が異なります。
for(i = 0; i < NUM_PLAYERS; i++)
{
AkOutputSettings settings("Wwise_Motion", DEVICE_SPECIFIC_ID[i]); // "Wwise_Motion" シェアセットを使い、デバイスDEVICE_SPECIFIC_ID[i]を実行します。
res = AK::SoundEngine::AddOutput(settings, &motionOutputIDs[i], &OBJ_FOR_PLAYER[i], 1); // アウトプットを追加して、適切なリスナーをリンクします。
}

続いてEventを再生します。Wwiseプロジェクト内で、「Play_GunFire」EventがリンクしているSound SFXは、Audio Device ShareSetとして「Wwise_Motion」をアサインしたバスにルーティングされています。

AK::SoundEngine::PostEvent("Play_GunFire", OBJ_FOR_PLAYER[0]); // これが再生されるのは、プレイヤー0のコントローラだけで、それはゲームオブジェクトとリスナーの関係のためです。

複数のデバイスに作用するEventを再生するには、新しいGame Objectを設定し、それぞれのプレイヤーのListenerがそれを聞くようにします。

AK::SoundEngine::RegisterGameObj(explosionGO, "Explosion"); // エクスプロージョンを再生するゲームオブジェクトを登録します。
AK::SoundEngine::SetListeners(explosionGO, OBJ_FOR_PLAYER, 4); // このGame Objectにプレイヤー達の4つのリスナーを全て接続して、全員がMotion Effectを受信できるようにします。
AK::SoundEngine::PostEvent("Play_Explosion",explosionGO ); // 4つのリスナーが全てexplosionGOに紐づいているので、Play_Explosion Eventが、全員にブロードキャストされます。

マルチプレイヤーの設定例については、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ファイルにパーミッションを追加してください:

<uses-permission android:name="android.permission.VIBRATE"/>
AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypedefs.h:47
AKSOUNDENGINE_API AKRESULT RegisterGameObj(AkGameObjectID in_gameObjectID)
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
#define AKMOTION_GAMEINPUT_HAPTICS_MODE
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)
static AkUInt32 GetAppLocalDeviceIdHash(const APP_LOCAL_DEVICE_ID *in_pAppLocalDeviceId)
AkUInt32 AkDeviceID
I/O device ID
Definition: AkTypedefs.h:65

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

サポートは必要ですか?

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

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

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

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

Wwiseからはじめよう