通过 Wwise,您可以使用您用于管理游戏音频的相同功能集来管理 Motion(振动)。这意味着现在您可以使用相同的 API 对振动数据执行与音频数据相同的操作。目前,振动引擎中只支持主机游戏控制器。
|
Note: 振动功能目前不可用于 Mac®、iOS、tvOS 和 Android 平台。 |
在默认情况下,声音引擎不提供振动设备。游戏必须链接到各个设备的独立库。见下表:
Device | Library | ID | Callback |
Game Controller | AkRumble.lib | AKMOTIONDEVICEID_RUMBLE | AkCreateRumblePlugin |
Device | Library | ID | Callback |
Game Controller | AkRumble.lib Xinput.lib dinput8.lib |
AKMOTIONDEVICEID_RUMBLE | AkCreateRumblePlugin |
振动引擎支持多个玩家,也支持一个玩家使用多个设备。例如,一款带分屏的 Xbox One 游戏在同一个游戏机上可有最多 4 个玩家。游戏必须注册各个玩家,以使他们能够通过各个设备获得反馈。这是通过 AK::MotionEngine::AddPlayerMotionDevice 来实现的。
必须对当前连接的各个玩家和设备重复执行此操作。如果计算机上没有安装设备驱动程序,则此操作将返回错误。此操作不会检查设备是否真正通电。对于 Rumble,检查是否连接控制器应由游戏在输入设备初始化时来完成。
在游戏机上,游戏控制器既可因为硬件问题而断开,也可因为通讯问题而断开。除了浪费一些资源外,它不会对振动引擎产生任何不利影响。如果您认为设备断开了很长一段时间,您可以调用 AK::MotionEngine::RemovePlayerMotionDevice 来释放资源。
如果玩家断开他的控制器,并将它重新连接到游戏机的另一个端口,您必须先调用 RemovePlayerMotionDevice,然后使用新的玩家端口调用 AddPlayerMotionDevice。
由于多人游戏中的各个玩家不会同时做同一件事,因此收到的反馈也应该是不相同的。为了控制哪个玩家收到哪种振动效果,再次使用了在音频中用到的一些概念: Listener 和游戏对象。对于振动,游戏对象“发出”振动, Listener “接收”它们。
在支持振动的游戏中,各个玩家必须有其自己的 Listener (请参阅 集成 Listener )。游戏必须显式向玩家分配 Listener 。这是由 AK::MotionEngine::SetPlayerListener 来实现的。
注意,在默认情况下,所有玩家使用 Listener 0。这些 Listener 已经被修改为充当音频和振动数据的接收器。然而,在默认情况下 Listener 只能启用于接收音频。为了指定 Listener 将接收到数据类型,应调用 AK::SoundEngine::SetListenerPipeline。
在设置此后,游戏只需根据情况在各个游戏对象上激活正确的 Listener 位(bit)。操作方法与音频相同,使用的也是 AK::SoundEngine::SetActiveListeners。
然而,它与音频之间巨在一个重大的差别。在音频中,只有声音使用 3D 定位设置时, Listener 才是必要的。而振动则不是这样。对于 Motion,要在振动设备中感觉到任何反馈, Listener 和游戏对象设置是必需的。
Wwise 目前在出厂时提供以下振动源插件:
名称 | 库 | ID (AKSOURCEID_...) | 回调 | 设备 |
振动发生器 | AkMotionGenerator | _MOTIONGENERATOR | AkCreateMotionGenerator | 游戏控制器 |
要使用振动源插件,您只需使用 AK::SoundEngine::RegisterSource 像注册任何其他源插件一样注册它。
为振动设备编写源插件与编写音频插件非常类似。请参阅音频插件一节了解详情(音频插件 )。
音频插件和振动源插件之间存在两大差异。第一个差异是插件必须支持接口 AK::Wwise::IMotionSourcePlugin。它源自 AK::Wwise::IAudioPlugin,因此与音频插件相关的所有服务和限制均适用(请参阅 编写音频插件的 Wwise 设计工具部件 )。第二个差异是定义插件属性所需要的 XML 文件。虽然文件的大多数内容与普通音频源所需的内容相同(请参见 Wwise 插件 XML 描述文件 ),但是振动插件必须按照以下声明:
<FeedbackSourcePlugin Name="Wwise Motion Generator" CompanyID="0" PluginID="405" DataType="TypeSpeedSamples">
因此,为了使特定玩家能够接收到一个设备的振动,您必须:
AK::InitAkMotionGenerator
;对于乐音发生器,调用 AK::InitAkToneSource
,等等)。AK::MotionEngine::AddPlayerMotionDevice
,以告诉引擎此玩家使用指定的设备类型。AK::MotionEngine::SetPlayerListener
来告诉引擎哪个 Listener 代表玩家。AK::SoundEngine::SetListenerPipeline
来启用在选定 Listener 上接收振动数据。AK::SoundEngine::SetListeners
。在 Wwise 工程中:
如果 Wwise 中创建的振动未在特定振动设备上播放,您则可以使用 Profiler 来排查问题。在 Advanced Profiler 中捕获振动数据的方法如下:
现在您可以连接到游戏,对振动性能进行分析,以找出潜在问题。“Motion Devices”选项卡包含两个独立的列表:一个用于 Devices(设备),另一个用于 Game Object(游戏对象)。Devices 列表指示对各个玩家而言哪些振动设备已经在声音引擎中正确注册并进行了初始化。
为了排查问题,首先应查看振动设备是否已经正确初始化了,方法如下:
如果振动设备出现在列表中,则查看振动设备是否已与特定玩家相关联,方法是检查有没有一个复选标记将设备与相应玩家匹配起来。如果没有复选标记,则可能存在以下其中一种情况:
如果振动设备已经正确初始化,并且关联到了正确的玩家,那么您可以检查 Game Object 列表,验证游戏对象是否设置正确,能够将振动数据发送到具体玩家。如果特定的游戏对象/玩家组合上没有复选标记,那么您可以切换到 Advanced Profiler 的 Listeners 选项卡查看以下情况: