凝视目标与提供器
将场景对象标记为凝视候选项,添加高级提供器组件,并从代码中注册自定义凝视目标提供器。
将 GameObject 标记为凝视候选项,添加这 8 个高级提供器组件以获得更丰富的目标选择行为,并从代码中注册自定义提供器。在添加后使用此页面 ConvaiGazeController 到角色上,当你希望它以非默认方式注意特定场景对象、其他角色或玩家时。
前提条件
ConvaiGazeController已添加到角色(Convai/具身/凝视).要标记的场景对象,或提供其自身候选项的脚本。
将场景对象标记为凝视目标
添加 ConvaiGazeTarget (Convai/凝视/目标)到任何 GameObject,即可将其设为场景中每个 Convai 角色的凝视候选项。不需要场景元数据。
优先级
5
优先级层级。玩家锚点发布时为 10,因此默认的 5 在对话中会让给玩家。将其提高到高于 10 以超过玩家的优先级。
基础相关度
0.75
在……内部时的相关度 完全相关距离.
最大距离
10 (米)
超过该距离后,目标不再作为候选项。
完全相关距离
3 (米)
低于该距离时,相关度达到最大值。
瞄准偏移
(0, 0, 0)
从该 Transform 到眼睛实际瞄准点的本地空间偏移,例如画作顶部。
添加高级凝视提供器
高级提供器位于 Convai/凝视/高级/ ,可在 Add Component 菜单中找到。每个组件都是可选的——添加 ConvaiGazeController 会为角色赋予眼睛、头部、待机生命感、眨眼、身体转向和对话节奏,无需进一步设置;这些组件在此基础上添加更多能力。
角色目标——角色之间的相互凝视
CharacterGazeTargetProvider (Convai/凝视/高级/角色目标)使角色看向其他 Convai 角色,也能被其他 Convai 角色看向。每个参与角色添加一个组件;身份、对话状态以及视线点都来自该角色的具身上下文。
发布自身
是
将此角色注册为其他角色可注视的目标。
看向他人
是
为其他已注册角色生成凝视候选项。
优先级
7
介于玩家锚点(10)和世界对象(5)之间,因此在对话中玩家优先,但角色会胜过背景道具。
说话优先级
9
当此角色正在说话时使用的优先级层级——高于空闲 优先级 层级,这样已经将注意力放在说话者上的听者不会被拉向旁观者,同时仍低于玩家锚点(10).
最大距离
12 (米)
超过该距离后,其他角色不再作为候选项(0 = 无限)。
完全相关距离
4 (米)
低于该距离后,其他角色处于完全相关状态。
空闲瞥视相关度
0.35
非说话角色的相关度。说话中的角色始终是完全相关的,因此听者会转向当前发言者。
视线高度偏移
1.6 (米)
其他角色瞄准的视线高度,直到该角色的头骨从绑定中解析出来。
启用空闲瞥视
是
空闲时,与附近角色偶尔交换短暂眼神。
空闲瞥视间隔最小值 / 最大值
5 / 12 (秒)
空闲角色间瞥视之间的间隔范围。
空闲瞥视持续时间
1.4 (秒)
一次空闲角色瞥视的持续时间。
空闲瞥视投入度
0.5
空闲瞥视的投入程度。
眼瞳驱动器——瞳孔扩张
ConvaiEyePupilDriver (Convai/凝视/高级/眼瞳驱动器)使用凝视模块平滑后的唤醒信号扩张角色的瞳孔。它通过复用的 MaterialPropertyBlock 按每个渲染器写入,因此共享材质资源永远不会被修改。
渲染器
空
显式指定的渲染器目标。留空以自动发现所有 SkinnedMeshRenderer 该角色下其材质暴露了着色器属性的对象。
着色器属性名
_PupilScale
要驱动的着色器浮点属性。默认使用 Reallusion RL5 角膜着色器的瞳孔缩放属性。
最大扩张百分比
12 (范围 5–20)
在完全唤醒时的最大瞳孔扩张,表示为每个渲染器基础属性值的百分比。
反转符号
否
当某个绑定中属性值越大反而使瞳孔越小时,翻转扩张方向。
动态上下文桥接——注意力锚定
GazeDynamicContextBridge (Convai/凝视/高级/动态上下文桥接)将角色当前凝视对象镜像到 Convai 动态上下文键 current_attention_object,因此诸如“it”或“that”之类的代词引用会根据角色实际注视的对象来解析。
参与阈值
0.5
对象被发布前所需的最低凝视投入度。
联合注意——注意玩家在看什么
GazeJointAttention (Convai/凝视/高级/联合注意)注意玩家正在看的东西并也看向那里,然后再返回到凝视策略所规定的对象——“我看到吸引你注意力的东西”这一反应节拍。它完全建立在公开的 GlanceAt API 之上,因此无需更改凝视核心。
锥角度数
8
用于判断玩家视线射线是否指向候选对象的半锥角。
最大距离米数
12
候选对象可被注意到的最远玩家距离。
停留秒数
0.7
玩家必须持续注视某个对象多长时间后,角色才会注意到它。
瞥视持续秒数
1.4
看向被注意对象的瞥视持续时间。
反应延迟最小/最大秒数
0.2 / 0.5
从注意到到瞥视之间的延迟范围。
冷却秒数
10
同一对象再次被注意前的按对象冷却时间。
全局最小间隔秒数
4
任意两次联合注意瞥视之间的最小间隔。
评估间隔秒数
0.2
玩家视线评估之间的间隔(默认约 5 Hz)。
发布注意力上下文
否
将被注意对象的名称发布到 Convai 动态上下文。
空闲时激活 / 聆听时激活
是 / 是
联合注意处于激活状态的对话状态。
指代性瞥视——瞥一眼被提到的对象
GazeReferentialGlances (Convai/凝视/高级/指代性瞥视)当角色自己的语句提到某个已注册世界对象时,让角色瞥向它——“看看那幅画”。它基于角色的最终转写进行匹配,并完全建立在公开的 GlanceAt API。
瞥视持续时间
1.6 (秒)
看向被提到对象的瞥视持续时间。
冷却秒数
10
同一对象再次被瞥视前的按对象冷却时间。
最大提及词数
4
可匹配的对象名称最长词数。
最小/最大延迟秒数
0.3 / 0.8
提及与瞥视之间的延迟范围。
玩家锚点——覆盖角色查找“玩家”的方式
PlayerAnchorTargetProvider (Convai/凝视/高级/玩家锚点)是开箱即用的“看向玩家”提供器。 ConvaiGazeController 当角色没有其他提供器时,会在运行时自动配置一个。可手动添加以按角色覆盖锚点——用于分屏、多人或过场动画绑定。
优先级
10
在各提供器之间比较的静态优先级层级。
显式锚点
无
为空时,解析为 Camera.main,然后是第一个符合条件且启用的 Game 视图摄像机。
视线高度偏移
1.6 (米)
应用于显式非摄像机锚点的垂直抬升。
瞄准模式
自动
GazeAnchorAimMode ——凝视在锚点上的瞄准位置。
面部存在方式
自动
GazeAnchorFacePresence ——角色是否将锚点视为一张脸,并注视其周围(眼睛、嘴巴),而不是精确瞄准它。 自动 根据锚点决定:手动指定的会被视为脸,而 SDK 自行解析出的摄像机则被视为视点,并精确瞄准它。 脸 始终将锚点视为脸——在 VR 中是正确的,因为摄像机位于玩家双眼之间。 点 始终精确瞄准锚点。
本地瞄准偏移
(0, 0, 0)
由 本地偏移 模式。
最大距离
8 (米)
超过该距离后,玩家不再作为候选项。
完全相关距离
4 (米)
低于该距离时,相关度达到最大值。
检查视线
否
要求到玩家之间有无遮挡的直线。被遮挡时,相关度会衰减,重新出现时会播放正常的获取扫视。
遮挡层掩码
Physics.DefaultRaycastLayers
在视线测试中被视为视觉遮挡的层。
视线检查间隔
0.1 (秒)
视线射线检测之间的节流间隔。
视线起点高度
1.6 (米)
视觉射线从角色根节点之上的眼线高度开始。
玩家注意力传感器——知道玩家何时也在看回来
PlayerAttentionSensor (Convai/凝视/高级/玩家注意力传感器)告诉角色玩家是否正在看它。默认信号是主摄像机的前向射线;XR 眼动追踪通过 IPlayerGazeRaySource (见 为 XR 提供自定义玩家凝视射线)而无需任何 XR 包依赖。平滑后的信号会发布到 Convai 动态上下文键 player_attention (looking_at_me / 离开,边沿触发)。
检测间隔
0.1 (秒)
检测采样之间的间隔。
基础半角
6 (度)
会话距离下的基础接受锥半角。
最大半角
28 (度)
近距离下的最大接受锥半角。
角色角半径
0.35 (米)
角色头部/上半身的大致角半径。
头部高度
1.6 (米)
未解析出 Head 骨骼时使用的视线高度。
上升秒数 / 下降秒数
0.5 / 1.5
注意力信号建立与衰减的时间常数。
进入阈值 / 退出阈值
0.6 / 0.35
发布用滞后阈值 looking_at_me / 离开.
发布到上下文
是
将看向/离开状态发布到 Convai 动态上下文。
凝视射线源组件
无
实现……的可选组件 IPlayerGazeRaySource。留空则从玩家摄像机进行瞄准。
世界对象目标——标记已制作的世界对象
WorldObjectGazeTargetProvider (Convai/凝视/高级/世界对象目标)将一个已制作的 Convai 世界对象——即已经带有 ConvaiObjectMetadata (RequireComponent)——标记为环境凝视候选项。附近角色在空闲时会瞥向它,而当它赢得注意力时,动态上下文桥接会将其报告给 Convai。
优先级
5
优先级层级,保持低于玩家锚点(10)以便在对话中玩家获胜。
基础相关度
0.75
在……内部时的相关度 完全相关距离.
最大距离
10 (米)
超过该距离后,对象不再作为候选项。
完全相关距离
3 (米)
低于该距离时,相关度达到最大值。
从代码扩展目标选择
注册自定义目标提供器
实现 IGazeTargetProvider 并调用 ConvaiGazeController.RegisterTargetProvider 适用于不来自 MonoBehaviour 的角色层级中的候选项——例如系统级来源、通过网络代码同步的目标,或测试替身。
TryGetCandidate 每个认知 tick 都会运行,因此请保持实现开销低。返回 否 (或相关度为 0)会移除该帧的候选项;仲裁器会处理获取和释放的平滑。调用 UnregisterTargetProvider 当该提供器不再有效时。
为 XR 提供自定义玩家凝视射线
IPlayerGazeRaySource 提供玩家当前注视方向的世界空间射线,因此 PlayerAttentionSensor 和 GazeJointAttention 可以在没有 SDK 对 XR 包有硬依赖的情况下判断玩家是否在看某个东西。请基于 OpenXR 或厂商眼动追踪适配器实现,并按组件注册:
返回 否 当这一帧没有可用射线时——例如追踪丢失、头显关闭——这样消费者会回退到摄像机射线。该来源按组件实例注册,而不是进程级注册,因此一个场景的适配器不会悄悄驱动另一个场景中的角色。
目标运动如何被过滤
每个凝视目标的瞄准点都会先经过平滑处理,然后才会被头部运动检测器看到,因此一两厘米的普通移动——比如说话角色的头部轻微晃动、手持设备上的摄像机晃动——不会被识别为移动目标,也不会触发头部重新规划。真正的不连续变化,例如镜头切换或传送,会在原始跳变而不是平滑后的跳变上被检测到,因此眼睛仍会立即跳到新位置,而不是向其滑动。
验证目标已被找到
进入 Play 模式并打开 Convai > 凝视编辑器 在选中角色时。窗口的实时视图会列出当前激活的目标及其类型(玩家, 世界对象, 角色, 脚本, 环境,或 移动路径)。一个从未出现的目标通常意味着其提供器组件已禁用、超出 最大距离,或者低于另一个提供器的优先级层级。
故障排查
一个 ConvaiGazeTarget 从未被选中
症状: 该对象从未在凝视编辑器的实时视图中作为激活目标出现。
原因: 目标的 优先级 处于或低于另一候选项的层级,或者该角色位于 最大距离.
解决方法: 提高 优先级 到高于竞争层级,或增大 最大距离 / 完全相关距离.
验证: 重新打开凝视编辑器实时视图,并确认目标名称作为激活目标出现。
高级提供者什么也不做
症状: 没有控制台警告,但该行为始终不会触发。
原因: 大多数高级提供者需要 EmbodimentContext 和 ConvaiGazeController 在父级层级中;缺少它会记录警告并禁用该组件。
解决方法: 在控制台中检查是否有一个 组件处于不活动状态 指明缺失依赖项的警告,并确认该组件位于与……相同的角色层级下 ConvaiGazeController.
验证: 组件成功重新启用后,警告就不再出现。
下一步
脚本化凝视配置眼神接触凝视脚本参考最后更新于
这有帮助吗?