如何将音效发音限制划分为单个对象

划分复调控制设置的影响范围

通常,自然会设计一个角色发出的台词等语音,以便同时最多只能播放一种声音。
criware_ue4_035_chr_voice_explanation.png
上图显示了正在播放的角色音频数据“VoiceA”和“VoiceB”。 “VoiceB”在“VoiceA”开始播放后开始播放。
然而,“语音A”和“语音B”的播放在虚线包围的区域中重叠。
一个角色同时发出多个声音是不自然的,因此能够控制“VoiceB”的播放,使其在播放“VoiceA”时无法播放会很有用。
在这种情况下,声音设计师必须使用 CRI Atom Craft 来配置复调控制设置。
CRI Atom Craft 允许您进行以下复调控制设置。
  • Cue限制
  • 类别限制
  • 语音限制
本文省略了每个设置的详细解释。详细信息请参阅单独的 ADX2工具手册。
在这里,我们将考虑同一场景中存在相同角色的情况,假设标题是格斗游戏。
另外,假设某种语音控制设置已应用于角色的语音Cue“VoiceA”。
目前,这些相同的字符中只有一个可以发音“VoiceA”。
由于游戏的设计,您希望这些相同的角色能够同时玩“VoiceA”。
criware_ue4_035_sound_object_purpose.png
实现这种设计的功能是“音效对象”。
本页介绍如何使用音效对象功能。

criware_ue4_sound_object_about什么是音效对象?

音效对象是一个允许您限制每个演员的发音数量的函数。
例如,我们考虑一个场景,游戏中有一个名为“John”的角色,并且不同颜色的“John A”和“John B”出现在同一场景中。
在 AtomCraft 中为“John”的音频数据创建两个名为“dialogue_Hello”和“dialogue_Bye”的Cue。
设置类别限制,以便同时只能播放这些音频数据中的一个音符。
对于这两个Cue,我们​​将分别准备一个供“John A”发言的 Atom组件和一个供“John B”发言的 Atom组件。
总共生成四个Atom组件,并为每个Atom组件设置Cue。
criware_ue4_035_set_sound_to_atomcomponent.png

如果您尝试同时重叠播放这四个 Atom组件,则其他 Atom组件将被限制播放,直到最先开始播放声音的 Atom组件结束。
然后,在同一场景中出现的“约翰 B”将无法说话,直到“约翰 A”说完为止。

criware_ue4_035_failed_case_for_playing_sound.png

因此,使用音效对象来限制每个演员的声音数量。
准备一个与“John A”对应的音效对象(SoundObject_A)和与“John B”对应的音效对象(SoundObject_B),并将它们设置为每个角色的Atom组件。

criware_ue4_035_set_soundobject_to_atomcomponent.png

然后,类别限制将仅应用于具有相同音效对象的 Atom组件。
由此,可以使相同的角色同时说话,并且可以防止一个角色同时说出不同的声音。

criware_ue4_035_success_case_for_playing_sound.png

以这种方式,音效对象使得可以通过进一步缩小可以限制声音数量的范围来限制每个演员的声音数量。

criware_ue4_how_to_apply_sound_object如何应用音效对象

为了设置音效对象并将其应用到 Atom组件,请在 actor(SkeletalMesh actor,如果有动画)下准备一个 Atom Parameter组件,并预先在其中准备一个音效对象。
然后,当Atom组件生成时,比如演员的动画开始时,音效对象会自动设置到Atom组件中。
criware_ue4_035_sound_object_specification1.png

同样,当Atom组件在没有动画等的情况下播放时,通过在Atom Parameter组件中拥有音效对象,音效对象将自动在Atom组件中设置。

criware_ue4_035_sound_object_specification2.png

补充事项

如果你想更灵活地使用音效对象而不是每个演员,你可以直接将音效对象设置到 Atom组件,而不使用 Atom Parameter组件。
在这种情况下,请使用 UAtomComponent::SetSoundObject 函数。指定一个音效对象作为参数。

criware_ue4_035_directly_set_soundobject_to_atomcomponent.png

设置过程

我们将解释创建音效音效并将其添加到 Atom Parameter组件的具体步骤。

创建音效对象有两种方法:“在程序内动态创建音效对象”和“在内容浏览器中预先创建音效对象”。

当大量相同的角色同时出现时,为每个单独的角色手动设置每个音效对象是非常繁琐的。在这种情况下,请使用前一种方法,以便为每个演员自动创建一个音效对象。
另一方面,如果许多相同的角色不同时出现(例如,boss角色),则后一种在内容浏览器上提前创建音效对象的方法速度更快。

我们将介绍两种方法。

(注:请提前在CRI AtomCraft中设置要使用的Atom Cue资源的复调控制,例如类别限制。)

在程序中动态创建音效对象的步骤

1.打开要控制音符数量的 Atom Cue 资源编辑器,并将 [Apply Atom Parameter] 设置为 ON。

criware_ue4_035_enable_apply_atom_parameter.jpg

2.选择 Actor 并从 [+ 添加 组件 ] 菜单中添加[Atom Parameter]。

criware_ue4_035_add_atom_parameter_component1.jpg

3.通过在 Blueprint 中编写如下所示,可以根据 Actor 生成动态生成音效对象,并在 Atom Parameter组件中进行设置。

criware_ue4_035_construct_sound_object.png
  1. [启用类别提示限制范围]检查字段和[启用语音限制范围]检查字段分别对应于AtomCraft中设置的“类别”和“语音限制组”。
SoundObject AtomCraft
Enable Category Cue Limit Scope 类别
Enable Voice Limit Scope 语音限制组


\attention 如果 [Enable Category Cue Limit Scope] 和 [Enable Voice Limit Scopt] 复选框均设置为 false,则将控制未应用音效对象的声音的复调。

如果要在类别中设置Cue限制,请将[启用类别提示限制范围]设置为ON,如果要设置语音限制组,请将[启用语音限制范围]设置为ON。

criware_ue4_035_explanation_of_soundobject_parameter.png

5.让我们编译并玩一下。
如果确认多个Actor可以同时发声,且发音次数仅限于一名Actor,则设置完成。

在内容浏览器中提前创建音效对象的过程

1.打开 Atom Cue 资源编辑器,在演员上播放Cue时要在其中应用音效对象,并将 [Apply Atom Parameter] 设置为 ON。
criware_ue4_035_enable_apply_atom_parameter.jpg

2.右键单击内容浏览器并选择[其他]→[数据资产]。

criware_ue4_035_create_dataasset_in_contents_brouser.jpg

3.选择 [AtomSoundObject] 类并为其指定资产名称。

criware_ue4_035_select_sound_object.jpg

打开4.3中创建的数据资产编辑器,根据AtomCraft的设置,开启【Config】中的【Enable Category Cue Limit Scope】和【Enable Void Limit Scope】。

criware_ue4_035_enable_soundobject_parameter.jpg

5.选择演员并从 [+ 添加 组件 ] 菜单中添加[Atom Parameter]。

criware_ue4_035_add_atom_parameter_component2.jpg

6.编辑已创建的[Atom Parameter]组件的属性并指定[Sound Object]。

criware_ue4_035_set_soundobject_asset.jpg

使用 cpp 控制 SoundObject 的示例

如果要将 SoundObject 从C++应用到 AtomComponent,请使用 UAtomComponent::SetSoundObject 函数。
指定一个音效对象作为参数。

动态创建和配置音效对象的示例

如果需要为不断生成的路人角色分别设置不同的声音对象时,必须配合路人角色的生成,动态创建声音对象。
下面介绍创建新C++类(继承Actor的路人角色类),使该类具有AtomComponent,在其中设置动态生成的声音对象的方法。
步骤如下。
  1. 包含 "CriWareApi.h", "AtomComponent.h", "AtomSoundObject.h"
  2. 将UAtomComponent*型变量作为成员变量
  3. 使用CreateDefaultSubobject或NewObject函数创建UAtomSoundObject对象
  4. 根据用途将创建的声音对象的成员变量EnableCategoryCueLimitScope和EnableVoiceLimitScope设置为true
  5. 使用UAtomComponent*型变量的SetSoundObject成员函数设置声音对象
源代码如下。
MyActor.h
#pragma once
// 1. 包含 "CriWareApi.h", "AtomComponent.h", "AtomSoundObject.h"
#include "CriWareApi.h"
#include "AtomComponent.h"
#include "AtomSoundObject.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class SO_PROJECTED_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
public:
// 2. 具有UAtomComponent*型变量作为成员变量
UAtomComponent * AtomExPlayer;
};
MyActor.cpp
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
AtomExPlayer = CreateDefaultSubobject<UAtomComponent>(TEXT("UAtomComponent1"));
AtomExPlayer->bEnableMultipleSoundPlayback = true;
AtomExPlayer->SetupAttachment(RootComponent);
// 3. 使用CreateDefaultSubobject或NewObject函数创建UAtomSoundObject对象
UAtomSoundObject * SoundObject = CreateDefaultSubobject<UAtomSoundObject>(TEXT("UAtomSoundObject"));
// 4. 根据用途,将已创建的声音对象的成员变量EnableCategoryCueLimitScope和EnableVoiceLimitScope设置为true
SoundObject->EnableCategoryCueLimitScope = true;
// 5. 使用UAtomComponent*型变量的SetSoundObject成员函数设置声音对象
AtomExPlayer->SetSoundObject(SoundObject);
}