肢体语言故障排查
诊断为什么 Convai 角色的 Body Language 控制器没有动作、与其他模块冲突,或显得过于含蓄/戏剧化。
诊断最常见的 Body Language 失败模式:完全没有动作、与另一个模块相冲突的动作、被拒绝的脚本手势、显得过于微弱或过于戏剧化的动作,以及随镜头距离变化而异常缩放的动作。
症状表
完全没有动作
骨骼绑定失败,或者没有 脊柱 骨骼已解析
确认角色具有 Humanoid Animator 并且脊柱链已映射
控制台没有显示 骨骼绑定没有 Spine 骨骼 错误,而且角色在静止时会呼吸并摆动
动作与脚本动画冲突
另一个模块正在占用该姿势——Body Animation 正在播放走路或全身动作,或者手势抑制正在生效
检查 Inspector 的 共享此身体 卡片,查看是哪个模块在减弱动作
运行时状态 显示 GesticulationSuppression 恢复到 无 在另一个模块结束后
某个 点头/摇头/倾斜 请求没有任何效果
HeadGestureHandle.Refusal 为 Busy 或 不可用
Busy:稍等片刻后重试。 不可用:修复下面的骨骼或配置文件设置
handle.IsActive 为 true 在下一次请求时,或者 handle.Refusal 为 无
动作显得过于微弱
表现力预设 为 含蓄,或者幅度字段设置得过低
提高 表现力预设 到 自然 或更高,或者提高相关配置文件的幅度字段
在正常 2 米的镜头距离下,角色的姿势脉冲和摆动会变得可见
动作显得过于戏剧化
表现力预设 为 戏剧化,或者幅度字段设置得过高
降低 表现力预设 到 自然,或者降低相关配置文件的幅度字段
在正常的对话距离下,手势不再显得夸张
动作随镜头距离变化而异常缩放
启用 Camera Distance Lod 已开启,且主摄像机已远离或靠近角色
确认此行为是有意为之(它不会影响呼吸、姿势或手势——只影响摆动和静止手部动作),或者关闭 启用 Camera Distance Lod 关闭
一旦关闭该开关,摆动和手部微动的幅度将保持不变,不受镜头距离影响
完全没有动作
当控制器无法解析某个 脊柱 骨骼时,它就会保持静默。此现象由两种不同的故障导致,每种都会通过 ConvaiLogger 在 LogCategory.BodyLanguage 仅记录一次——绝不是每帧:
完全没有骨骼绑定:
[ConvaiBodyLanguageController] 无法解析任何骨骼绑定。Body language 需要一个带有 StandardRigBinding 的 Humanoid 角色(该绑定会为 Humanoid Animator 自动添加)。模块将保持静默。(
ConvaiBodyLanguageController.cs:1863-1865)存在骨骼绑定,但没有
脊柱骨骼:[ConvaiBodyLanguageController] 骨骼绑定没有 Spine 骨骼。请检查 Animator avatar 是否为 Humanoid,并且脊柱链是否已映射;在存在 Spine 骨骼之前,模块将保持静默。(
ConvaiBodyLanguageController.cs:1874-1876)
在按下 Play 之前, ConvaiBodyLanguageController 检查器的 此角色 部分会执行相同的检查,并在 Inspector 文本中说明相同原因,无需进入 Play 会话:
没有
Animator在角色上:“这个角色没有 Animator——Body Language 是将动作叠加到已动画化的骨架上的,所以它没有可移动的对象”(BodyLanguageSetupService.cs:451-454).没有映射脊柱的 Humanoid avatar:“Humanoid avatar,但没有映射 Spine 骨骼——请检查 Avatar 的脊柱链”(
BodyLanguageSetupService.cs:459).非 Humanoid avatar:“该 avatar 不是 Humanoid,因此无法解析 Spine 骨骼”(
BodyLanguageSetupService.cs:460).
先修复 Animator 的 Humanoid avatar 映射,然后重新进入 Play 模式。骨架上的其他一切——胸部、肩膀、髋部、腿和手臂——都是可选的:缺少某个可选骨骼只会禁用依赖它的行为(例如,缺少肩膀会禁用肩部紧张,但姿势和呼吸仍然会运行)。 此角色 卡片会报告每个可选缺口,而不会把它视为故障。
动作与脚本动画冲突
Body Language 与 Body Animation 和 Gaze 共享脊柱、肩膀和头部。当 Body Animation 播放走路或全身动作时,它会在该持续时间内夺回身体控制权—— GesticulationSuppression 报告 UpperBody 或 FullBody 只要该动作持续运行,Body Language 自身的姿势和手势也会相应让位。这是有意的接管,不是故障。
GesticulationSuppression
效果
无
没有被抑制——姿势、呼吸和手势提示都可用。
UpperBody
语义手势片段会被拒绝,但姿势(在配置文件的 Upper Body Suppression Posture Weight)和呼吸仍保持有效。
FullBody
手势提示会被拒绝,程序化姿势/呼吸会衰减到零。
该 ConvaiBodyLanguageController 检查器的 共享此身体 卡片会在 Play 前列出共享角色身体的每个模块以及各自修改的内容。播放时, 运行时状态 会补充当前这一刻正在发生的事情: 共享身体的模块 说明当前是否有任何东西正在削弱动作,且 头部由以下内容移动 说明是 Gaze 还是 Body Language 自身在移动头部。
某个 点头/摇头/倾斜 请求没有任何效果
点头 从不返回 null 并且绝不会抛出异常——请检查 HeadGestureHandle.IsActive 和 HeadGestureHandle.Refusal 而不要假设手势已经播放:
Refusal == HeadGestureRefusal.Busy:角色已经在执行一个头部手势,后面还排着一个。该状态是暂时的——请在稍后再次重试同一请求。Refusal == HeadGestureRefusal.Unavailable:角色当前根本无法执行头部手势——没有可用的骨架、没有 Body Language 配置文件,或者组件已禁用或未运行。请修复底层骨架或配置文件问题,而不是重试。
参见 触发手势和反应 查看完整处理模式,包括随附的 ConvaiHeadResponseActionExecutor,它已经会重试一个 Busy 拒绝状态,最长 1.5 秒。
动作显得过于微弱或过于戏剧化
按顺序检查:
表现力预设在已分配的ConvaiBodyLanguageProfile—含蓄会完全移除可选行为(耸肩、手部微小生动感)并降低幅度;戏剧化会将其最大化。运行时
ConvaiBodyLanguageController.Expressiveness覆盖值——它会在下一次配置文件热切换之前压过配置文件,因此脚本可能已将其设置为与配置文件创作值不同的值。配置文件中的各个幅度字段——
最大张开角度,最大倾斜角度,姿势脉冲幅度以及列在 身体语言配置文件参考.
该 ConvaiBodyLanguageController 检查器的 姿势(目标 → 当前) 部分会显示实时的目标姿势值和当前姿势值。如果目标始终停留在接近零的位置,说明状态策略和情绪没有到达导演器——请检查配置文件的 状态策略 部分。如果目标在变化但当前值没有跟随,请检查 主权重: 0 表示模块尚未完成渐入,或者骨骼未绑定。
动作随镜头距离变化而异常缩放
启用 Camera Distance Lod 会根据主摄像机与角色的距离来缩放摆动幅度和静止手部动作权重——近景更细微,远景更明显,在正常对话距离下保持中性。它绝不会影响呼吸、姿势或手势。如果角色的摆动因镜头构图而看起来不同,那么这个开关就是按预期工作的;如果场景要求无论镜头距离如何都保持恒定幅度,请在配置文件中将其关闭。
下一步
触发手势和反应调整表现力肢体语言配置文件参考最后更新于
这有帮助吗?