State(状态)是全局影响所有游戏对象音频属性的变化。每个 State Group(状态组)只可有一个当前状态,由所有游戏对象共享。
例如,状态组可以是:
此状态组的不同状态可以是:
|
Note: 每个状态组都有称作“None”(无)的状态。“None”状态代表状态组的初始状态,不可移除。在“None”状态下,没有对参数做任何更改。 |
状态系统是一种强大的工具,有许多用途。您可以用它同时更改各种对象(声音、角色混音器、总线等)的多个参数。您可以做到用一个命令更改声音引擎中所有对象的行为。虽然状态用途很广,但并非在每种情况下都是最佳解决方案。例如,考虑需要对少量对象的一个参数进行迅速更新的情况。在此例中,使用 RTPC 可以减少资源使用,比使用状态更快。
通过 SDK 设置状态的方式无非就是调用如下函数:
AK::SoundEngine::SetState( L"Weather", L"Sunny" );
或者
AK::SoundEngine::SetState( AK::STATES::WEATHER::GROUP, AK::STATES::WEATHER::STATE::SUNNY );
使用 SDK 设置状态有两种方式:使用字符串(Unicode 或 Ansi),或使用 ID。
使用字符串可以提高代码的可读性,适合在开发期间或者通常使用字符串的环境中使用。使用 ID 后,Wwise 就无需在运行时散列名称了。
要使用 ID,需在 Wwise Generate SoundBanks 对话框中选择“Generate header file”选项。定义文件 Wwise_IDs.h 包含所有必要的 ID。每次生成 SoundBank 时都会更新此文件。
有关头文件的示例,请参阅 集成详情—— SoundBank 。
|
Caution: 如果使用了 ID,则要在生成新 SoundBank 时持续更新 .h 文件,这点很重要。否则,可能发生 ID 不匹配或编译错误。 |
有关使用 Wwise 生成 SoundBank 的更多信息,请参阅 Wwise 帮助。
有两种方式可用来驱动状态:SDK AK::SoundEngine::SetState() 函数和在 Wwise 中生成的动作“SetState”。然而,在同一状态中同时使用两种方式会出问题。例如,如果声音设计师在创建的事件中使用 SetState 动作,而音频程序员使用 SDK AK::SoundEngine::SetState() 函数来驱动状态,则状态可能会变得难以控制。我们强烈建议声音设计师和音频程序员一起决定如何驱动状态,不管是针对单个状态组还是针对整个工程。如果就如何更改状态达成了一致意见,则也可一次使用两种方式。例如,音频程序员可使用 SDK 的 SetState() 函数对状态初始化,而在游戏其它部分保持由事件来驱动状态。
|
Tip: 如果许多声音的状态行为是相同的,您可以为这些声音指定一个共同父对象(例如角色混音器),然后在共同父对象中设置状态,而无需为每个声音复制状态设置。这可以加快声音设计师编辑设置的速度。还会降低存储状态参数所需要的内存,因为状态数据存储在同一处而不是许多处。 |
当触发状态变换时,如果定义了过渡,则会开始从参数值 A 过渡到参数值 B。默认过渡时间应用于所有参数。过渡时间可在 Wwise 中设定。
如果过渡时间设置为 0(即无过渡时间),则无过渡,参数值会直接跳到目标值。如果有了过渡段,游戏声音却没有改善,则过渡应设为 0,以节省过渡资源。
如果在上一个状态仍在过渡时触发了第二个状态变换,则新参数将定义新目标,并且参数将使用新的过渡时间从当前值过渡到新的目标值。如果过渡被中断,则当前值将过渡到之前的值。例如,如果在状态 1 到状态 2 的过渡中,一个新来的状态变换要变到 State 1,造成当前的过渡中断,则值将使用新的过渡时间从当前设置切换回状态 1。
对于布尔型参数和由状态驱动的切换容器,将忽略状态过渡时间。切换容器有它们自己的选项来驱动当状态或切换开关变换时的行为。
有关集成状态的示例,请参阅 状态示例 。