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

角色移动的工作方式

说明 Convai 如何解析移动目的地、选择移动点、回退到对象边界,并定义到达。

Convai 移动到Convai 陪护 两者都通过相同的方式解析其目标位置 FConvaiObjectEntry 插件其余部分对对象和角色所使用的方式。理解这种解析——什么算作目标、当有多个可用时哪个移动点胜出,以及当没有编写任何点时会发生什么——就能解释为什么角色会走到那里,以及为什么有些移动会立即完成。

目标位置如何解析

每个 目标 传递给 Convai 移动到Convai 陪护 是一个 FConvaiObjectEntry。其 对象是 字段(ObjectReference,类型为 EConvaiObjectReference)决定该条目的 Ref actor 所代表的内容:

  • 整个 Actor ——整个 actor 就是目标位置。若未编写任何移动点,角色会朝该 actor 走去,并在其边界处停止。

  • 特定组件 ——一个命名的子组件(也可通过 ComponentNameSocketOrBoneName指定 socket 或骨骼)就是目标位置。若未编写任何移动点,角色会走到该组件的位置。

该条目自身的 ResolveGoalLocation 函数会将其转换为目标位置、接受半径,以及——当提供了一个移动中的 actor 时——该 actor 是否已经在目标点(bOutAlreadyThere)以及导航网格路径是否可到达它(bOutReachable).

选择一个移动点

一个 Convai 对象组件 可以携带一个……列表 FConvaiMovementPoint 条目——由设计师编写的接入点,用来描述角色接近该对象时应站在哪里,例如门两侧各一个点。当某条目启用了移动点时,它们会完全接管目标解析:上面的对象引用仍然定义该对象是什么 ,但移动点定义 角色要站在何处 前往它的角色应站立的位置。

解析会选择可到达且步行路径最短的点。会检查每个已启用的点,移动角色到该点的导航网格路径最短者胜出;若完全相同,则保留列表中更靠前的那个点。某个点也可以被禁用(bEnabled = false)而不移除它,这样它会退出候选,但不会删除其放置位置。

如果所有移动点都不可到达,目标通常会报告不可到达,而不是悄悄选择一个被阻挡的点——两侧都被路障封死的门应显示为不可到达,而不是可行走。勾选 将对象作为回退 (bFallbackToObjectWhenPointsUnreachable)会改变这一点:当所有已编写的点都被阻挡时,解析会回退到对象本身,而不是失败。

回退到对象的边界

当某条目根本没有任何移动点时,解析会回退到对象引用本身:

  • 整个 Actor ——角色会朝该 actor 走去,并在其边界处停止,而不是停在该 actor 的精确原点。这对宽大的对象很重要:角色不必走到对象的枢轴点才算到达。

  • 特定组件 使用 ComponentName 已设置——角色会走到该组件(或命名 socket/骨骼)的位置。

  • 特定组件 使用 ComponentName 留空——角色会走到 actor 自身的位置,与 整个 Actor 相同,但不会进行边界停靠。

设计师通过将 移动点 在某个……上留空 Convai 对象组件 ——角色无需额外设置就能走到某个对象旁。

到达与已在原地

一个已完成的 Convai 移动到Convai 陪护 请求会报告两种成功结果之一,而它们的含义不同:

  • 已在目标点 ——在发起请求时,移动中的角色就已经位于解析后的目标处,因此根本没有执行移动。该结果会立即报告,不会创建移动任务: Convai 移动到 会解析目标位置,发现角色已经在范围内,并就地完成。

  • 已到达 ——确实执行了一次移动,并且角色到达了解析后的目标,无论目标在整个过程中是否静止,还是在角色朝它移动时发生了移动(移动目标的情况会在移动过程中重新解析)。

“已经在那里”是根据以下条件进行检查的: max(接受半径,150 厘米) 的移动点,或者 max(接受半径 × 2,150 厘米) (当未编写移动点时)对象包围盒占地范围,再加上对移动角色自身高度的检查。 Convai 陪护 对护送 actor 和被护送角色都使用相同的解析和相同的到达测试——参见 护送角色 以了解它如何等待并恢复。

有关每个节点可报告的结果代码完整列表,请参见 移动 Blueprint 参考.

最后更新于

这有帮助吗?