> For the complete documentation index, see [llms.txt](https://docs.convai.com/api-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.convai.com/api-docs/zh/cha-jian-yu-ji-cheng/convai-unreal-engine-plugin/features/character-movement/how-character-movement-works.md).

# 角色移动的工作原理

解释 Convai 如何解析移动目的地、选择移动点、在对象边界上回退，以及定义到达。

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

### 目标位置如何解析

每个 `目标` 传递给 `Convai 移动到` 或 `Convai 陪护` 是一个 `FConvaiObjectEntry`。其 `对象是` 字段（`ObjectReference`，类型为 `EConvaiObjectReference`）决定该条目的 `Ref` actor 所代表的内容：

* `整个 Actor` ——整个 actor 就是目标位置。若未编写任何移动点，角色会朝该 actor 走去，并在其边界处停止。
* `特定组件` ——一个命名的子组件（也可通过 `ComponentName` 和 `SocketOrBoneName`指定 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 和被护送角色都使用相同的解析和相同的到达测试——参见 [护送角色](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unreal-engine-plugin/features/character-movement/escort-a-character.md) 以了解它如何等待并恢复。

有关每个节点可报告的结果代码完整列表，请参见 [移动 Blueprint 参考](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unreal-engine-plugin/features/character-movement/movement-blueprint-reference.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.convai.com/api-docs/zh/cha-jian-yu-ji-cheng/convai-unreal-engine-plugin/features/character-movement/how-character-movement-works.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
