バージョン

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

Motion(モーション)は、コントロールインターフェースのハプティックフィードバックをユーザーがコントロールするための機能です。Wwiseでは、アプリケーションのオーディオを管理するために使用するのと同じ機能セットでモーションを管理できます。Wwiseにとって、モーションデータもオーディオデータも同じです。つまり、オーディオ用に提供された機能は、全てモーションでも使えます。Wwiseモーション機能を使って利用できるハプティックフィードバックは、2種類あります。プロジェクトのオーディオシグナルを使ってモーションに変換するか、Motion Generatorソースを使って専用のモーションシグナルを生成します。この機能は、対応するコントローラがあれば、WindowsのWwiseオーサリングツール上で直接テストできます。

Motion Components

Motion機能は、Wwiseサウンドエンジンのプラグインシステムによってアプリケーション内で作動しますが、2つのモジュールに分けることができ、それがMotion Generatorというオーディオソースと、Wwise Motionというオーディオデバイスです。Motion Generatorはオプションですが、正確で柔軟なモーションデザインを作成するための、高い性能のツールです。

Motion Sink Plug-in

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

Motion Source Plug-in

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 を参照してください。

Setting Up Motion

あなたのアプリケーションでモーションを使うには、全てのコンポーネントを正しく設定する必要があります。なお、オーディオワークフローに該当するコンセプトは、全てモーションにも該当します。同じバス、リスナー、エミッタを利用します( リスナーの統合 を参照)。

Wwise Authoring Setup

サウンドデータやモーションデータをデバイスに送信するには、ライセンス取得済みの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つ、必要です。

Game Setup

ゲーム側では、まず別のライブラリである 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を提供してください。

Multiplayer Considerations

モーションアウトプットは、ほかのセカンダリアウトプットと同じで、制約事項や要件も同じです。作成中のゲームがシングルプレイヤーで、ローカルでゲームをコントロールしているプレイヤーが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では不要です。)

#include "AkMotionSinkFactory.h" //Link to AkMotionSink.lib, implements the output to ga
#include "AkMotionGeneratorSourceFactory.h" //Link to AkMotionGenerator.lib, implements the Motion Generator source.

次に、あなたがWwiseプロジェクトで指定したMotion ShareSet名を使って追加アウトプットを追加しますが、今回の名前は"Wwise_Motion"です。最初に接続されたゲームコントローラを使いたいので、アウトプットIDは0にします。

AkOutputSettings outputSettings("Wwise_Motion", 0);
AK::SoundEngine::AddOutput(outputSettings);

次に、通常通りにEventを再生します。Wwiseプロジェクト内で、"Play_Explosion" Eventがポイントするのは、"Wwise_Motion"シェアセットをAudio DeviceにアサインしてあるバスにルーティングされたサウンドSFXです。

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

マルチプレイヤーの設定

念のための確認ですが、マルチプレイヤーゲームとは、「同じコンソールで複数のプレイヤー」を意味するのであって、「ネットワーク接続のマルチプレイヤーゲーム」ではありません。マルチプレイヤーのシナリオで、モーションなど、そのプレイヤー専用のアウトプットのミックスは、プレイヤーのゲーム内の視点を表現できるように、変える必要があります。そのためには、プレイヤーごとのリスナーが必要です。

int NUM_PLAYERS = 4;
const AkGameObjectID OBJ_FOR_PLAYER[MAX_PLAYERS] = {100 ,200, 300, 400}; // Game Object IDs are arbitrary.
for(int i = 0; i < NUM_PLAYERS; i++)
{
AK::SoundEngine::RegisterGameObj(OBJ_FOR_PLAYER[i]); // Register a GameObject to use as Listener.
AK::SoundEngine::SetListeners(OBJ_FOR_PLAYER[i], &OBJ_FOR_PLAYER[i], 1); // Make the Game Object listen to itself.
}

次に、プレイヤー別にそれぞれアウトプットを追加します。複数のシェアセットは不要で、どのシェアセットでも何回も使えます。コントローラ別に、本当のデバイスIDを提供する必要があります。これは、Windowsで、Xboxコントローラのレイです。それぞれのプラットフォームでデバイスIDを取得する方法については、 Game Setup の表を参照してください。

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がポイントするのは、"Wwise_Motion" ShareSetをAudio DeviceにアサインしてあるバスにルーティングされたサウンドSFXです。

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つのデバイスでモーションを受信するには以下を実行する必要があります:

  • あなたのWwiseプロジェクトのオーディオデバイスに、Wwise Motionシェアセットを追加します。
  • 最上位のオーディオバスを作成して、そのシェアセットとして、今追加したWwise Motionを設定します。
  • サウンドSFXを作成して、モーションバス階層にルーティングします。
  • ゲーム内で、AkMotionSinkFactory.hを含めることで AkMotionSink ライブラリにリンクして、AkMotionSinkライブラリにリンクしてください。
    注釈: UnityとUnrealは、プラグインライブラリを自動的に管理します。前の手順は不要です。
  • モーションEventをコールしたり受信したりするためのGame Objectを、AK::SoundEngine::RegisterGameObjを使って作成します。
  • Wwise MotionシェアセットとデバイスIDを使い、 Ak::SoundEngine::AddOutputをコールします。マルチプレイヤーの場合は、それぞれのプレイヤー用にリスナーオブジェクトを提供します。
  • あなたのEventを、オーディオEventの場合と同様にトリガーします。

WwiseプロジェクトでMotionを使うには

  • あなたのWwiseプロジェクトのオーディオデバイスに、Wwise Motionシェアセットを追加します。
  • 最上位のオーディオバスを作成して、そのシェアセットとして、今追加したWwise Motionを設定します。
  • サウンドSFXを作成して、モーションバス階層にルーティングします。
  • Audio Preferencesで、モーションを使うバスに移動して、そのデバイスに設定するモーションデバイスを、リストから選びます。

プロファイリング

問題のトラブルシューティングをする場合は、あなたのアプリケーションをプロファイリングすることを推奨します。オーサリングツール内でアプリケーションをプロファイリングするには、接続してから、Profilerレイアウト(F6)を開きます。問題の根源を理解するために、役立つツールがいくつかあります。Capture Logビューで、赤字で表示されるエラーコードを確認できます。Graphビューで、サウンドエンジンのパイプラインのイメージ図を確認できます。パイプラインの最後に、モーションデバイスが表示されるはずです。なければ、指定したデバイスをサウンドエンジンが見つけられなかったということです。Emitter/Listenerタブも、非常に便利なビューです。エミッタとリスナーのペアが、全て表示されます。モーションエフェクトが作動しない場合は、あなたがモーションデバイスに指定したリスナーが、エミッタに関連付いていない可能性があります。

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

  • Capture Logを見て、プラグインの登録エラーがないか、確認します。あれば、AkMotionSinkFactory.hが含まれているか、またAkMotionSinkライブラリにリンクしているかを、確認してください。
  • サウンドエンジンがデバイスの初期化に成功したか、確認します。していなければ、ゲームが AddOutput をコールしたときにエラーが表示されます。
  • 再生したサウンドSFXが、モーションデバイスにつながったバスにルーティングされているか、確認します。確認するには、サウンドSFXのAudio Busプロパティや、バスのAudio Deviceプロパティを見ます。
  • Voices Graphタブで、どのエミッタがトリガーされたのかを探します。Emitter-Listenerタブで、関連付けされたリスナーがあることを確認します。同じゲームオブジェクトがエミッタでありリスナーであることも、可能です。それ以外の場合は RegisterGameObjSetListeners、そして AddOutput へ出したコールを確認してください。
  • 希望するアウトプットデバイスに関連付けされたリスナーが、リスナーとして設定されていることを確認します。
  • また、今まで出したAPIコールの結果にも注目してください。エラーが返されていないことを確認します。

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

<uses-permission android:name="android.permission.VIBRATE"/>
AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypes.h:70
AKSOUNDENGINE_API AKRESULT RegisterGameObj(AkGameObjectID in_gameObjectID)
AkUInt32 AkDeviceID
I/O device ID
Definition: AkTypes.h:87
Platform-independent initialization settings of output devices.
Definition: AkSoundEngine.h:129
#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
Definition: AkTypes.h:59
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からはじめよう