排查角色动作问题
修复 Convai Unreal Engine 插件中不触发的角色动作、移动失败、引用问题和队列卡住问题。
使用此页面来诊断角色动作未触发、在序列中途停止、移动到错误位置,或接收到空参数的情况。
打开 输出日志 在调试任何动作问题之前。 ConvaiChatbotComponentLog 报告会话、队列和派发消息,包括缺少处理器警告。 ConvaiSubsystemLog 报告动作配置解析和参数解析消息。 ConvaiDefinitionsLog 报告来自 Resolve Goal Location的目标解析和环境进入警告。要提高详细程度,请将以下内容添加到 DefaultEngine.ini:
[Core.Log]
ConvaiChatbotComponentLog=Verbose
ConvaiSubsystemLog=Verbose
ConvaiDefinitionsLog=Verbose动作未触发
角色会说话但在 Follow 或 Move To 中不移动
症状: Convai 已确认该指令,但 NPC 仍停留在原地。
原因 A: 未配置 Pawn 移动。
修复: 在 内容浏览器时,选择 Convai > Setup Convai Pawn Movement中右键单击角色蓝图,然后编译并保存。参见 角色动作快速入门.
验证: 该蓝图具有一个移动组件(浮动 Pawn 移动 或 角色移动)以及一个 AI Controller Class 已分配。
原因 B: NavMesh 未覆盖 NPC 或目标位置。
修复: 缩放 Nav Mesh Bounds Volume,重建路径(构建 > 构建路径),然后按 P 以确认绿色覆盖范围。
验证: 在 NPC 出生点和目标位置下方都出现绿色 NavMesh。
原因 C: 角色蓝图中缺少默认动作处理器。
修复: 从 内置动作处理器实现四个参考处理器,或使用 创建 Convai 动作处理器.
验证: A 打印字符串 为每个处理器顶部添加的节点,在你说出匹配的命令时会触发。
角色回应后没有调用任何动作处理器
症状: 角色会说话,但没有蓝图处理器函数运行。响应后动作队列似乎为空。
原因 A: bEnableActions 为 false 在聊天机器人的 环境 属性访问。
修复: 在 Convai 聊天机器人 组件的详情面板中,展开 环境 并勾选 启用操作.
验证: 检查会话日志中是否有 ActionConfig: 条目。如果没有发送动作配置,请确认 启用操作 已开启,并且 动作 数组在重新连接前不为空。
原因 B: 中的动作名称 动作 数组与蓝图函数名称不匹配。
修复: 确保 名称 字段在 FConvaiAction 模板中与 NPC Actor 蓝图里的自定义事件或函数名称完全一致,包括空格和标点。Unreal 会不区分大小写地解析处理器名称,但 "Stop Moving" 是位于 "StopMoving" 是不同的名称。例如,如果模板名称是 "Move To",那么蓝图事件必须命名为 Move To (带空格)。
验证: 添加一个 打印字符串 处理器顶部的节点。如果它没有触发,说明名称不匹配是原因。检查输出日志(ConvaiChatbotComponentLog)中是否有包含 TriggerNamedBlueprintAction: Could not find a valid function '<name>' on the owning actor or the component (self).
原因 C: 处理器函数签名错误。
修复: 该函数必须接受零个或一个类型为 FConvaiResultAction (Convai Result Action 的参数(在类型选择器中)。如果参数类型错误,插件会记录警告且不会调用处理器——队列会停滞,直到 HandleActionCompletion 或 AbortActionSequence 被调用。
验证: 检查输出日志(ConvaiChatbotComponentLog)中是否有包含 确保它接受 'FConvaiResultAction' 或者不带参数。
动作触发一次后队列停滞
症状: 序列中的第一个动作会运行,但后续动作永远不会触发。
原因: HandleActionCompletion 未被调用,或者调用时未使用 IsSuccessful = true.
修复: 确保处理器中的每条代码路径都调用 HandleActionCompletion。常见遗漏路径包括:
当守卫条件失败时过早返回(应改为调用
AbortActionSequence或HandleActionCompletion(false))。异步操作(委托回调、计时器)中,完成调用位于不可达分支。
动画蒙太奇,其中 On Interrupted 未连接到
Handle Action Completion以及 On Completed.
验证: 添加一个 打印字符串 在每次 HandleActionCompletion 调用之前立即放置一个节点。确认所有路径都能到达完成调用。
新的自定义动作在 Play 模式中不出现
症状: 你向 动作 数组添加了一个动作,但处理器从未运行。
原因: 编辑动作模板后,角色蓝图没有重新编译。
修复: 单击 编译 是位于 保存 在角色蓝图上,然后重启 Play 模式。
验证: 中的动作名称 Environment > Actions 与事件图中的自定义事件名称完全一致。
On Actions Received 触发但队列立即为空
症状: 该 On Actions Received 事件触发且 SequenceOfActions 包含条目,但 IsActionsQueueEmpty 返回 true 紧接着就为空。
原因: 一个处理器在你检查之前清空了队列。这可能是当前处理器,因为 On Actions Received 是在插件追加队列并调度首个动作派发之后广播的;也可能是之前调用了 HandleActionCompletion(false) 或 AbortActionSequence.
修复: 检查是否有任何处理器正在过早调用 HandleActionCompletion(false) 或 AbortActionSequence 。同时检查 ClearActionQueue 是否在不应出现的位置被调用。
验证: 添加一个 打印字符串 节点位于每次 HandleActionCompletion(false), AbortActionSequence,以及 ClearActionQueue 调用之前。确认在你检查队列之前没有任何一个先运行。
NavMesh 和移动失败
执行 Move To 动作后角色不移动
症状: 该 Move To 处理器触发了,但 NPC 仍停留在原地。
原因 A: NPC Actor 没有分配 AI Controller。
修复: 设置 AI Controller Class 在 NPC Actor 上将 AIController 子类。你可以使用 UE 内置的 AIController.
验证: 在 Play In Editor 中,使用 Get Controller → Is Valid 进行蓝图检查。结果应为 true.
原因 B: 该 Nav Mesh Bounds Volume 没有覆盖 NPC 的出生点或目标位置。
修复: 在编辑器中选择 Nav Mesh Bounds Volume 并扩展其边界以覆盖所有可行走区域。重建导航(构建 > 构建路径)。启用 P 视口中的(导航可视化)以确认在 NPC 和目标位置都存在 navmesh。
验证: 视口在 NPC 和已注册目标下方都显示绿色 NavMesh 覆盖。
原因 C: bOut Success 来自 Resolve Goal Location 为 false 但处理器仍调用了 AI 移动到 。
修复: 始终基于 bOut Success。当 false,则 Ref Actor 为空或已销毁时,AI Move To 会无操作(Actor 模式)或把 pawn 发送到过期位置(Vector 模式)。请改为调用 AbortActionSequence 并附带有信息量的消息。
验证: 打印 bOut Success 之前 AI 移动到。它必须在 true 移动节点运行之前。
原因 D: 该 接受半径 比 AI 在给定 navmesh 分辨率下实际能达到的范围更小。
修复: 增加 接受半径 在 FConvaiObjectEntry (默认是 150 厘米)。对于按钮或杠杆等小物体,请使用 将组件作为目标 模式来定位特定点,而不是整个 Actor 边界。
验证: 打印 AI 移动到 结果或完成回调。一旦半径可达,移动应成功完成。
角色走到错误的位置
症状: NPC 导航到一个接近但并非注册对象的位置。
原因: bOut Mode 来自 Resolve Goal Location 为 Vector (例如, bStepOntoBounds 已设置),但处理器连接了 OutGoalActor 到 AI Move To · Target Actor 而不是 OutGoalLocation 到 AI Move To · Destination.
修复: 始终基于 Out Mode。在 Actor 模式下,将 OutGoalActor 连接到 actor 引脚。在 Vector 模式下,将 OutGoalLocation 连接到 destination 引脚。
验证: 打印 Out Mode 并确认对应的 AI 移动到 引脚是该分支中唯一连接的目标引脚。
引用和参数解析
GetParamAsRef 返回空条目
症状: GetParamAsRef 会返回一个 FConvaiObjectEntry 带有空的 Ref 或空的 名称.
原因 A: 该对象不在 Objects 或 Characters 数组中。引用解析只会搜索已注册的环境。
修复: 将对象添加到 Objects 或 Characters 数组中(在详情面板里),或者调用 AddObject / AddCharacter 在需要目标的响应之前。使用一个简短的已注册名称,这样 Convai 才能准确返回。
验证: 打印返回的 FConvaiObjectEntry.Name 是位于 FConvaiObjectEntry.Ref 在 GetParamAsRef。该名称应与已注册条目相匹配,并且 Ref 应当有效。
原因 B: Convai 返回的名称与已注册对象或角色名称并不完全匹配。
修复: 将已注册条目的 名称 调整为 Convai 最可能返回的精确标签,并使用 说明 来指导选择。例如,优先使用 SafetyValve 而不是像句子一样很长的名称。
验证: 打印 GetParamAsString 获取同一参数并将其与已注册的 名称进行比较。它们应完全匹配。
Choices 参数解析为不受支持的值
症状: 玩家请求了一个不在 Choices 数组中的变体(例如 "ballet" 而只有 "groove", "disco",以及 "g-style" 被列出)。处理器运行 默认 分支,或者什么也不播放。
原因: Convai 返回了一个超出声明的 Choices 列表的值。解析器仍会将该字符串传下去,但你的处理器必须处理回退。
修复: 添加一个 Switch on String 默认分支调用 HandleActionCompletion 其带有 IsSuccessful = false, bAutoReport = true,以及 ShouldRespond = Always 以便 Convai 可以解释这一限制。参见 参数化动作.
验证: 请求一个受支持的选项(处理器播放蒙太奇)和一个不受支持的选项(角色响应但不播放动画)。
GetParamAsNumber 意外返回 0
症状: A Number类型参数解析为 0 ,尽管 Convai 本应提供一个值。
原因: Convai 返回了类似 "five seconds" 而不是 "5". NumberValue 是通过 Atof填充的,它会对非数字字符串返回 0 。
修复: 使用 GetParamAsString 来读取原始值并手动解析,或者改进参数描述以引导 Convai 输出数字:设置 说明 到 "A plain integer number of seconds, e.g. 3".
验证: 同时打印 GetParamAsString 是位于 GetParamAsNumber。当期望自动数字解析时,该字符串应以数值开头。
注意力和引用问题
SetObjectInAttention 没有效果
症状: 调用 SetObjectInAttention 似乎什么也没做——角色仍在引用其他对象。
原因: bEnableActions 为 false 在聊天机器人上。 SetObjectInAttention 在聊天机器人的 action_config 未在会话开始时发送。
修复: 启用 启用操作 并重新连接会话。
验证: 重新连接后,再次调用 SetObjectInAttention 并检查 CurrentAttentionObject 在聊天机器人的 环境 属性访问。
基于注视的注意力被忽略
症状: 玩家看着一个带有 UConvaiObjectComponent的 Actor,但 AttentionSource 保持 显式 且该槽位没有更新。
原因: 之前的 SetObjectInAttention 调用将槽位设置为 显式,这会阻止所有基于注视的更新。
修复: 调用 SetObjectInAttention 并使用一个默认构造的 FConvaiObjectEntry (空的 名称)清除显式锁定。清除后,槽位会恢复为 无 ,然后注视就可以再次接管。
验证: 读取 AttentionSource 在清除后。它应恢复为 无 ,然后再由注视更新为 凝视.
下一步
角色动作如何工作动作 Blueprint 参考最后更新于
这有帮助吗?