For the complete documentation index, see llms.txt. This page is also available as Markdown.

故障排查与诊断

最常见情感系统问题的逐步修复——从表情无法变化到 LipSync 冲突和正式构建中的坑。

诊断并解决情绪问题

大多数情绪问题可归为三类之一:完全没有可视输出、分数在更新但面部不动,或者事件和脚本回调未触发。本页先介绍内置 Inspector 检查界面,然后依次讲解结构化的第一线排查清单、快速参考表、按问题细分的详细说明、控制台日志参考,以及针对最常见故障路径的决策树。

检查实时状态

ConvaiEmotionController 在 Play Mode 下无需任何额外工具即可在 Inspector 中显示完整的流水线状态。

需要关注什么
在哪里找到它
它告诉你什么

当前 → 主导标签

ConvaiEmotionController Play Mode 中的 Inspector

当前哪种规范情绪处于主导地位。 "neutral" 表示没有有效信号。

当前 → 主导分数

ConvaiEmotionController Play Mode 中的 Inspector

主导情绪的平滑强度 [0–1]。大于 0 的值可确认流水线正在接收并处理服务器信号。

锁定情绪 复选框

ConvaiEmotionController Inspector(任意模式)

勾选后,服务器信号将被忽略。角色会保持锁定表情。

若要在不进入 Play Mode 的情况下预览 blendshape 槽映射,请启用 锁定情绪中,设置 锁定的情绪标签 到一个规范标签,并将 锁定强度1.0。因为 ConvaiEmotionController[ExecuteAlways],blendshape 会立即在 Scene 视图中更新——无需 Play Mode。

一线排查

请按顺序完成此清单,当情绪表现不符合预期时。大多数问题会在第 1 或第 2 步解决。

1

检查 Profile 字段

选择你的 NPC 根 GameObject。在 ConvaiEmotionController 组件上,确认 Profile 字段不为空。

  • → 拖入一个 ConvaiEmotionProfile 资源。快速测试可使用随附的 ConvaiSamplesShared_EmotionProfile 来自 Packages / Convai SDK for Unity / SamplesShared / Resources / Embodiment / Modules / Emotion。没有 profile,流水线不会运行。

  • 已分配 → 继续下一步。

2

在 Play Mode 中观察 DominantScore

播放,对角色说话,并观察 当前 → 主导分数ConvaiEmotionController 检视面板。

  • 分数升至 0 以上 → 流水线正在接收服务器信号。问题出在输出绑定上。跳到第 4 步。

  • 分数保持为 0 → 控制器没有接收到情绪信号。继续第 3 步。

3

检查 Lock Emotion 和组件位置

有两个常见原因会阻止信号到达累加器:

  1. 已勾选 Lock Emotion → 取消勾选。控制器在锁定时会丢弃所有服务器事件。

  2. 组件位于错误的 GameObject 上ConvaiEmotionController 必须位于 同一个根 GameObject 与 Embodiment 组件相同。若放在子对象上或另一个 NPC 上,它将无法接收到来自正确角色会话的情绪事件。

如果两者都不适用,请确认角色已实际连接——在情绪信号到来之前,它应当先能在 Console 中对语音做出响应。

4

检查输出槽是否已填充

打开 ConvaiEmotionProfile 资源。如果两者都 Blendshape 绑定 是位于 Animator 绑定 列表都为空,流水线会在内部运行,但没有写入目标—— DominantScore 会更新,但不会发生面部动作。

至少添加一个 EmotionSlotBinding 且具有有效的 emotionLabel 以及一个存在于角色上的 blendshape 名称或 Animator 参数。参见输出绑定。

5

验证 blendshape 名称和槽标签

如果 DominantScore 更新了,但脸仍然不动:

  1. 选择角色的网格 GameObject → Inspector → Skinned Mesh Renderer → 展开 BlendShapes.

  2. 将准确的 blendshape 名称复制到槽的 Blendshape Names 字段中。名称是 区分大小写的.

  3. 确认该槽的 Emotion Label 字段使用的是 规范的 分类标签(例如 "joy",而不是服务器别名 "快乐")。绑定匹配的是规范标签——别名永远不会解析成功。

常见问题

症状
可能原因
修复

脸完全不动;DominantScore 始终为 0

未分配 profile

将一个 ConvaiEmotionProfile 添加到 Profile 字段

脸完全不动;DominantScore 始终为 0

Lock Emotion 已启用

禁用 锁定情绪 on ConvaiEmotionController

脸完全不动;DominantScore 始终为 0

组件位于错误的 GameObject 上

移动 ConvaiEmotionController 到 NPC 的根 GameObject 上,与 Embodiment 组件放在一起

DominantScore 更新了,但脸没有变化

输出槽为空

在 profile 中至少添加一个包含有效情绪标签和 blendshape 名称的槽

DominantScore 更新了,但脸没有变化

blendshape 名称不匹配

从中复制准确名称 Skinned Mesh Renderer → BlendShapes;名称区分大小写

DominantScore 更新了,但脸没有变化

emotionLabel 使用的是服务器别名

使用规范标签("joy",而不是 "快乐")作为槽的 Emotion Label 字段

DominantScore 更新了,但脸没有变化

weightMultiplierfullBlendshapeWeight 为 0

将两者都设置为槽中的非零值

特定情绪从未出现;角色始终保持中立

服务器标签不在 taxonomy 中;静默回退为中立

在自定义 taxonomy 中,将服务器标签作为别名添加到最接近的规范条目

说话时 LipSync 停止工作

非口部 blendshape 被标记为 isMouthShape = true

设置 isMouthShape = false 用于眉毛、眼睛、脸颊和上脸部形状

角色在整个会话中保持同一个表情

lockEmotion 被序列化为 true 在场景或 prefab 中

禁用 锁定情绪;保存场景(Ctrl+S / Cmd+S)

生产构建中没有情绪响应

lockEmotion 在构建前保持启用

禁用 锁定情绪 在构建前;在 Inspector 中按 prefab 实例逐个验证

重新打开项目后 Profile 更改又恢复了

正在编辑随包提供的只读资源

复制该资源(Ctrl+D / Cmd+D),将副本移动到 Assets/,分配该副本

OnEmotionChanged on ConvaiCharacterEventRelay 从不触发

角色引用未解析

启用 自动解析角色,或者分配 ConvaiCharacter角色 字段

[EmotionTaxonomyAsset] 警告在 Console 中

自定义 taxonomy 没有中立条目,或者有多个中立条目

设置 IsNeutral = true 在且仅在一个 taxonomy 条目上

未知服务器标签——静默中立回退

症状: 服务器发送的某种情绪从未出现在角色上。面部会回到中立,就像没有收到信号一样。

原因: 当服务器发送的标签与当前 taxonomy 中任何规范标签或别名都不匹配时, TryResolve 返回 false,控制器会静默使用中立描述符。与 blendshape 槽中的名称不匹配不同,这种失败 不会产生任何控制台警告 ——流水线会正常继续,每帧写入中立分数。

如何检测:

  1. 在 Play Mode 中展开 当前 → 所有分数ConvaiEmotionController Inspector。如果你期望看到的情绪分数正好是 0.0,而对话内容明显应触发它,那么服务器标签很可能没有解析成功。

  2. 启用 lockEmotion 在 Inspector 中,将 锁定的情绪标签 设置为你期望的规范标签(例如 “anticipation”),并确认 blendshape 槽被激活。如果是这样,说明输出绑定是正确的——只是该标签下的信号根本没有从服务器传来。

修复: 打开你的自定义 taxonomy 资源(如果使用内置默认值则创建一个),并将服务器标签作为别名添加到语义最接近的匹配项。例如,如果服务器发送 “excited” 并且它应映射到视觉槽 “anticipation”,则添加 “excited” 添加到 Aliases 列表中的 anticipation 条目。有关如何创建并分配自定义 taxonomy,请参见 Emotion Taxonomy。

Blendshape 名称不匹配

症状: Current.DominantScore 在 Play Mode 中更新正确,但角色面部没有视觉变化。

原因: 其中的 blendshape 名称 EmotionSlotBinding 与上的名称不完全一致 SkinnedMeshRenderer.

修复:

  1. 在 Hierarchy 中选择角色的网格 GameObject。

  2. 在 Inspector 中,滚动到 Skinned Mesh Renderer 组件。

  3. 展开 BlendShapes 部分开始。

  4. 将其中的准确名称复制到槽的 Blendshape Names 字段中。名称区分大小写,必须完全一致——包括下划线、空格和大小写。

如果角色有多个 SkinnedMeshRenderer 组件(身体、头部和牙齿分别作为独立网格),blendshape 绑定会指向在 Embodiment compositor 中注册的网格。在复制名称之前,请确认 Embodiment 组件的 rig 绑定引用的是哪一个网格。

当情绪激活时 LipSync 失效

症状: 当角色说话时,由 LipSync 驱动的口型停止工作,或者情绪形状意外压制了音素形状。

原因: 一个或多个 blendshape 槽具有 isMouthShape = true 用于那些变形眉毛、眼睛或脸颊而不是嘴唇或下颌的形状。这些形状会被路由到口部 compositor 层——也就是 LipSync 在说话时写入的同一层——从而干扰音素输出。

修复: 打开 ConvaiEmotionProfile 资源。在每个 Blendshape 绑定 槽中,将 isMouthShape = true 用于变形嘴唇、下颌或下巴的形状。抬眉、眯眼、鼓脸和上脸部形状应当设置为 isMouthShape = false.

表情冻结——角色忽略对话

症状: NPC 在整个会话中保持单一表情,从不对 AI 情绪信号作出反应。

原因: lockEmotion 被序列化为 true 在场景或 prefab 中——这是 Inspector 预览留下的常见编辑遗留物。

修复:

  1. 选择 NPC 的根 GameObject。

  2. ConvaiEmotionController,禁用 锁定情绪.

  3. 保存场景(Ctrl+S / Cmd+S).

如果你有多个 NPC prefab,请逐个检查——除非显式覆盖,否则该字段会按每个 prefab 实例保留。

Profile 更改没有保存

症状: 你在 Emotion Profile 资源上修改设置,但在重新打开项目或返回 Inspector 时更改会恢复原状。

原因: 你正在编辑包内附带的只读资源。Unity 包内的资源无法修改。

修复:

  1. 选择 ConvaiSamplesShared_EmotionProfile 下方,位于项目窗口中。

  2. 复制它(Ctrl+D / Cmd+D).

  3. 将副本移动到你自己的 Assets/ 文件夹。

  4. ConvaiEmotionController,改为分配该副本而不是原始资源。

ConvaiCharacterEventRelay OnEmotionChanged 不触发

症状: 你将一个 Unity Event 连接到 On Emotion Changed on ConvaiCharacterEventRelay,但在 Play Mode 中它始终不触发。

清单:

  1. 角色引用: 任一 自动解析角色 已启用,并且有一个 ConvaiCharacter 位于同一个 GameObject 上,或者你已手动分配一个 ConvaiCharacter角色 字段。如果两者都不满足,relay 会记录一条配置警告并保持非活动状态。

  2. 组件已启用: 确认 ConvaiCharacterEventRelay 组件已启用(Inspector 标题栏中的复选框已勾选)。

  3. 订阅时机: relay 仅在 Convai 会话建立后才会触发。请在 OnEnable 中订阅这些事件,并在 OnDisable 中订阅,以便从组件激活的那一刻起捕获所有事件。在会话打开前到达的事件可能会丢失。

  4. 会话已激活: ConvaiCharacterEventRelay 在角色的 ConvaiCharacter 回调触发时触发。如果完全没有信号到达,请先确认角色能正常响应语音,再测试情绪回调。

情绪分数可见,但未写入任何输出绑定

症状: ConvaiEmotionController.Current.DominantScore 在 Play Mode 中更新正确,但 blendshape 和 Animator 参数都没有变化。

清单:

  1. 确认 Blendshape 绑定Animator 绑定 profile 中的列表不为空。

  2. 确认 emotionLabel 每个槽中的都与一个 规范的 taxonomy 标签匹配——请使用 "joy",而不是服务器别名 "快乐".

  3. 对于 Animator 绑定,请确认该参数名在 Animator Controller 中存在,且其类型为 Float 在 Animator Controller 中,并且 Animator 组件位于与 ConvaiEmotionController.

  4. 请确认 weightMultiplier 大于 0,且 fullBlendshapeWeight 每个槽中的都大于 0。

控制台日志参考

以下消息会从 Emotion 系统显示在 Unity Console 中。使用此表了解每条消息的含义以及下一步该做什么。

日志消息
组件
含义

[ConvaiEmotionController] 忽略了一个没有 character id 的情绪事件。按角色范围划分的情绪事件必须包含 character id,以避免不同角色之间的表情串扰。

ConvaiEmotionController

收到一个没有 character ID 的情绪事件。这在多 NPC 场景中很常见,因为事件会全局广播。确保每个 NPC 都有唯一的 角色 ID 在其 ConvaiCharacter 组件上设置。每个控制器生命周期仅记录一次。

[EmotionTaxonomyAsset] 没有条目标记为中立;已合成“neutral”回退。将且仅将一个条目标记为中立基线可抑制此警告。

EmotionTaxonomyAsset

自定义 taxonomy 资源没有任何条目带有 IsNeutral = true。系统会合成一个回退中立值以保证流水线运行。将 IsNeutral = true 设置到且仅设置在一个条目上可抑制该警告。

[EmotionTaxonomyAsset] 没有条目设置 IsNeutral。运行时将使用合成的“neutral”;请将一个条目标记为中立基线。

EmotionTaxonomyAsset

与上面相同——在 Inspector 中触发(OnValidate)当你在 Edit Mode 中保存 taxonomy 资源时触发。通过将一个条目标记为中立基线来修复。

[EmotionTaxonomyAsset] 有 N 个条目标记为 IsNeutral;只有第一个会被使用。请仅标记一个中立基线。

EmotionTaxonomyAsset

多个 taxonomy 条目具有 IsNeutral = true。只有第一个会被使用。移除 IsNeutral 标志,保留一个条目即可。

这里没有 控制台警告 当服务器发送无法识别的情绪标签时。 TryResolve 会静默回退到中立描述符。如果预期的情绪从未出现在角色上,请参见上面的“未知服务器标签——静默中立回退”。

表情无响应——决策树

结论

大多数 Emotion 问题可归结为四个根本原因之一:缺少 profile、输出槽为空或配置错误、意外序列化的 lockEmotion,或者 blendshape 名称不匹配。先观察 Current.DominantScore 在 Play Mode 中——如果它在更新,说明流水线是健康的,问题出在输出绑定;如果它一直为零,就倒查 profile、锁定状态和组件位置。使用“常见问题”表进行快速查找,使用“控制台日志参考”来解读警告消息;当原因不够明确时使用决策树。

最后更新于

这有帮助吗?