> 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-unity-sdk/embodiment/gaze/how-gaze-works.md).

# 视线工作原理

了解 Gaze 模块如何选择目标、在眼睛、头部和身体之间共享注视，并对对话的状态作出反应。

`ConvaiGazeController` 决定角色看向谁以及注视有多坚定，然后按固定顺序把这种注视传递到全身，确保眼睛、头部和躯干对目标始终一致。本页说明这个决策背后的流程：如何选择目标，如何角色的 [对话状态](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/core-concepts/dialogue-state.md) 如何改变其投入程度，以及为什么一次眼部移动和一次身体转身会像一个动作，而不是两个独立系统。

### 三阶段流程

每个认知 tick，Gaze 都按相同顺序运行这三个阶段。

| 阶段   | 问题          | 由什么决定                                               |
| ---- | ----------- | --------------------------------------------------- |
| 目标选择 | 角色应该看向谁或什么？ | 由目标提供者发布的候选项，加上任何脚本化的 `GazeAt` 请求，并按优先级解析。          |
| 策略   | 角色应该投入多大程度？ | 当前对话状态在配置文件状态策略表中的条目，并根据情绪和说话活动进行调整。                |
| 求解器  | 这种注视如何到达那里？ | 躯干，然后是颈部和头部，再然后是眼睛，最后是眼睑——每一层都叠加在角色的 Animator 姿势之上。 |

将目标选择与策略分开的原因在于，“看什么”和“投入多少”是因不同原因而变化：新的候选目标可以随时出现，但角色对其投入多深，应当跟随对话的走势，而不是候选项出现的那个瞬间。

### 如何选择目标

目标提供者每个 tick 都会发布候选项，仲裁器按优先级而不是按最先注册者来解析它们。

1. **一个脚本化的 `GazeAt()` 请求优先获胜** 当角色处于 `自然` 或 `社交`保真度注视——参见 [脚本化注视](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/scripted-gaze.md)。一个 `精确`-保真度注视会拒绝脚本请求，除非 `AllowScriptedOverridesDuringExactFocus` 已启用。
2. **其余一切由优先级层级决定。** 玩家锚点以优先级 10 发布，其他 Convai 角色以优先级 7 发布，世界对象以优先级 5 发布。更高层级总是会抢占更低层级。
3. **在同一层级内，当前目标具有粘性。** 只有当它对当前持有目标的兴趣耗尽或达到保持时长上限时，角色才会瞥向同优先级的其他目标。

因为玩家锚点以最高层级发布，只要当前对话状态的策略允许，玩家就是角色的主要目标。要把角色的注意力引到别处——过场镜头、分屏中的第二位玩家——可以在玩家目标提供者上设置显式锚点，或者注册你自己的 `IGazeTargetProvider` 以更高优先级。参见 [Gaze 目标与提供者](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/targets-and-providers.md).

### 对话状态如何改变投入程度

`ConvaiGazeController` 并不会以同样方式对待对话中的每一刻。它的配置文件状态策略表会将每个 [对话状态](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/core-concepts/dialogue-state.md) 与一个参与度级别、玩家是否算作有效目标，以及是否允许身体转身相对应：

| 对话状态          | 参与度       | 玩家是有效目标    | 允许身体转身 |
| ------------- | --------- | ---------- | ------ |
| `空闲`          | 最低        | 否——改为环境式环顾 | 否      |
| `关注中`         | 高         | 是          | 是      |
| `倾听中`         | 最高        | 是          | 是      |
| `思考中`         | 降低        | 是          | 否      |
| `说话中`         | 完全        | 是          | 是      |
| `反应中` / `被打断` | 完全 / 接近完全 | 是          | 是      |
| `平复中`         | 降低        | 是          | 否      |

配置文件表中未列出的状态会回退到 `空闲` 行。这就是为什么角色在 `空闲`，并在 `关注中`, `倾听中`以及 `说话中`，并在 `思考中` 和 `平复中` ——同一张表驱动所有状态转换，而不是每个状态各写一条手工规则。 [配置眼神接触](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/configure-eye-contact.md) 涵盖 `GazeEyeContactMode` 设置，它可以完全覆盖这张表，适用于必须始终注视玩家的角色。

### 注视如何在身体上移动

一旦设置了目标和投入程度，求解器阶段就会按固定顺序让角色朝向它：先躯干，然后颈部和头部，再然后眼睛，最后眼睑。眼睛会先对新目标做出投入，而头部会在稍后半拍跟上——这与真人使用的“先眼后头”顺序相同，而不是整个身体一下子转向新的方向。对于足够大的角度——例如玩家站在角色身后——身体本身会转动，把目标重新带回前方，具体是使用角色自己的原地转身动画，还是平滑的程序化旋转，取决于角色携带了哪些 embodiment 模块。

这种分层顺序也正是为什么注视与角色的 Animator 姿势从不冲突：每个求解器阶段都在 Animator 为该帧完成骨骼摆姿之后运行，因此由注视驱动的头部旋转是在调整动画姿势，而不是与之竞争。参见 [具身化的工作方式](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/how-embodiment-works.md) 了解每个 embodiment 模块运行所共享的 tick 顺序。

### 跟随对话

`ConvaiGazeController.AttendToSpeaker` (`GazeSpeakerAttention`）控制角色是否会转头看房间里当前正在说话的其他人，适用于有多个参与者的场景——即群体对话中“每个人都看向正在说话的人”这种行为。它只在角色轮到自己发言之外时生效，因此永远不会与角色自身的对话眼神接触竞争。

| 模式         | 行为                                         |
| ---------- | ------------------------------------------ |
| `关闭`       | 角色从不跟随任何人的发言轮次。                            |
| `玩家`       | 玩家说话时转向玩家；忽略其他角色的轮次。                       |
| `角色`       | 某个角色说话时转向另一位角色；从不转向玩家。                     |
| `任何人` （默认） | 转向当前持有发言权的人，无论是玩家还是角色。打断正在说话角色的玩家会立即接管发言权。 |

#### 注意力会衰减，而不会超时

每个听者都会追踪其他每位参与者当前占据了多少注意力。说话开始、被点名或被期待回答时会提高这个数值；其他任何事都不会，而且在这些事件之间它会持续衰减，而不是一直保持到某个固定截止点再一次性释放。听者会看向占据最高数值的人，因此，一段跨过停顿的对话会被读作逐渐回到空闲状态，而不是像灯一样突然熄灭。每个听者会针对给定事件抽取自己的反应延迟，并根据说话者与该听者的接近程度和中心性进行缩放，因此一群听者绝不会在同一帧同时转头——而房间还会额外强制任意两位听者对同一事件的反应之间保持最小间隔，所以原本可能重合的独立抽样会被拉开。这四个塑造这一过程的设置——典型反应延迟、该延迟的变化幅度、注意力衰减所需时间，以及听者之间的最小间隔——位于配置文件的 [对话注意力](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/profile-reference.md#conversation-attention) 组中。

当前正在被说话的人不受此系统影响：其自身的对话状态策略决定它的眼神接触，因此它会被理解为正在被交谈的对象，而不是又一位听者。眼神接触锁（`GazeEyeContactMode.ConversationLock` 或 `AlwaysLock`）会完全覆盖注意力——锁定意味着角色承诺始终看着玩家。

#### 它跟随发言权，而不是某个说话标志

正在说话的人持有发言权，而发言权是有记忆的：说话者会在自己的停顿中继续保有它，因此听者不会在他们刚一喘气时就立刻放开。要从持有者手中夺回发言权，需要持续的说话——咳嗽声、“mm-hmm”，或者语音检测的一次误报都足够短，仍会被读作插话而不是轮次切换，因此不会让房间里的每个人都转头。发言权是从玩家自己的麦克风本地检测到的，而不只是来自服务端往返确认，所以房间会在玩家说出第一个词时就开始转头，而不是等待一次网络往返。发送键入消息的玩家获得发言权，与说话者完全相同。

#### 小幅移动不会触发重新规划

在运动检测器评估之前，每个注视目标都会先被平滑处理，因此普通的对话摆动和摄像机抖动不会触发新的头部移动计划。大幅、突然的位移——比如镜头切换或传送——仍会触发立即重新获取，而不是拖拽式、不自然的跟随。

#### 个性配置会写入自己的数值

在 `ConvaiGazeProfile` — `默认`, `自信`, `温暖`, `专注`, `害羞`, `冷静` ——都会为“对话注意力”组写入自己的数值，连同所有其他承载感觉的字段一起。 `自信` 反应更慢，并且将注意力停留在说话者身上的时间比 `温暖` 更长，例如，这是让这两个预设在群体场景中呈现出不同感觉的一部分原因。

在 Play 模式下， `ConvaiGazeController` Inspector 的 Live 区域、Gaze 编辑器窗口，以及 `Convai.DiagnoseGaze` 助手工具都会各自报告一行，说明角色正在看谁，或者是哪一道门槛——距离、角度或视线遮挡——把说话者挡开了。

### 下一步

{% content-ref url="/pages/516efa6367dbd72ce53d95eaab31db343afd4757" %}
[Gaze 快速开始](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/quick-start.md)
{% endcontent-ref %}

{% content-ref url="/pages/3e45c80fb1153e604c743a1f3a0a835d39719b0e" %}
[配置眼神接触](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/configure-eye-contact.md)
{% endcontent-ref %}

{% content-ref url="/pages/864133eda5776302d8f8f9afeef2de62388e08bc" %}
[视线目标与提供器](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/embodiment/gaze/targets-and-providers.md)
{% endcontent-ref %}


---

# 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-unity-sdk/embodiment/gaze/how-gaze-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.
