从 Attention 迁移
用 Convai Gaze 替换已弃用的 Attention 和旧版 Gaze 组件,并避免在保存时丢失场景引用。
SDK 4.5.0 已弃用 Attention 模块以及之前的 Convai Gaze 实现,并删除了介绍它们的七个文档页面且未设置重定向。如果你是通过书签或搜索结果来到这里,那么这页就是替代页面:它会将每个被移除的组件和资源映射到其对应的 Convai Gaze 版本,指出一个如果跳过就可能悄无声息地破坏场景的步骤,并说明即使你完全不改代码,外观上会有什么变化。
组件和资源替代项
ConvaiAttentionController, ConvaiGazeCoordinator, ConvaiHeadLookActuator, ConvaiEyeGazeActuator
ConvaiGazeController
添加组件 > Convai > 具身 > Gaze
ConvaiAttentionProfile, ConvaiGazeCoordinationProfile, ConvaiGazeEyeProfile, ConvaiGazeHeadProfile
ConvaiGazeProfile
资源 > 创建 > Convai > 具身 > 凝视配置文件
IFocusTargetProvider, IGazeIntentProvider
IGazeTargetProvider,已注册到 RegisterTargetProvider
实现该接口,调用 ConvaiGazeController.RegisterTargetProvider
ConvaiAttentionDynamicContextBridge
GazeDynamicContextBridge
添加组件 > Convai > 凝视 > 高级 > 动态上下文桥
ConvaiWorldObjectFocusProvider
ConvaiGazeTarget
添加组件 > Convai > 凝视 > 目标
DefaultFocusTargetProvider (Attention 自动创建的玩家提供器)
自动 — ConvaiGazeController 在……时创建自己的玩家锚点 自动创建玩家锚点 已启用
常见情况无需添加;仅在以下情况下添加 PlayerAnchorTargetProvider (Convai > 凝视 > 高级 > 玩家锚点) 仅用于分屏或多人装配
ConvaiGazeController 会直接从角色的骨架本身解析相同的头部和眼部骨骼,因此一旦它位于……上,就无需重新指向任何东西 GameObject 所携带的 ConvaiCharacter 和 EmbodimentContext.
在保存场景之前替换 ConvaiWorldObjectFocusProvider
ConvaiWorldObjectFocusProvider 曾是一个 MonoBehaviour 直接存在于你的场景中。由于该类型在 4.5.0 中已不存在,Unity 会在下次保存场景时静默移除该组件—— GameObject 它会不再是凝视目标,而且控制台中没有任何内容会解释原因。
打开每个受影响的场景并添加 ConvaiGazeTarget (添加组件 > Convai > 凝视 > 目标) 到每个曾携带旧组件的对象上 之前 然后再保存。 ConvaiGazeTarget 承担相同工作,并增加旧组件从未有过的控制项:一个优先级层级,可设为高于玩家自身的 10 级层级;一个基础相关性;目标被视为候选所需处于的距离范围;以及一个局部空间瞄准偏移,使眼睛对准精确点而不是对象枢轴点。
迁移脚本化焦点提供器
如果你实现了 IFocusTargetProvider 或 IGazeIntentProvider 用于向 Attention 或之前的 Gaze 实现提供数据,请实现 IGazeTargetProvider 来代替——其形式是相同的:系统会要求你在角色的 TryGetCandidate 调用中提供一个候选,而你则用一个目标点和一个相关性值来响应。
using Convai.Modules.Gaze.Components;
using Convai.Modules.Gaze.Providers;
using UnityEngine;
public sealed class DeskLampFocusProvider : MonoBehaviour, IGazeTargetProvider
{
[SerializeField] private ConvaiGazeController gaze;
private void OnEnable() => gaze.RegisterTargetProvider(this);
private void OnDisable() => gaze.UnregisterTargetProvider(this);
public bool TryGetCandidate(Transform characterRoot, out GazeTargetCandidate candidate)
{
candidate = new GazeTargetCandidate(
GazeTargetKind.WorldObject,
priority: 6,
relevance: 0.8f,
target: transform,
worldPoint: transform.position,
debugName: "Desk Lamp");
return true;
}
}使用 ConvaiGazeController.RegisterTargetProvider 而不是任何特定于 Attention 的注册调用,并在禁用时注销它,这样被销毁或对象池中的对象就不会继续发布候选项。如果你曾直接通过代码驱动旧的执行器,那么新的入口点是 GazeAt 和 GlanceAt:每个都会返回一个 GazeHandle 你可以 Release() 提前释放,或等待 Settled/完成 其完成,取代执行器上手写的权重。
重新调校你的配置文件——调校值不会沿用
删除你的 ConvaiAttentionProfile, ConvaiGazeCoordinationProfile, ConvaiGazeEyeProfile,以及 ConvaiGazeHeadProfile 资源,在迁移完成后——这些类型已经不存在,资源将无法反序列化。不要试图逐字段照搬它们的值: ConvaiGazeProfile 不会将 Attention 的兴趣预算模型拆分为单独的获取、释放、保持、衰减、恢复和打断阈值数值。它通过自己的……达到相同的“投入但不死盯”效果。 目标选择 和 头部与身体 部分。请从一个未分配配置文件的角色开始——随附默认值本身就已调校得看起来正确——并且只在你想创建一个 ConvaiGazeProfile 当你想塑造独特个性时。
在不改代码的情况下有哪些外观差异
即使一个项目除了替换组件之外什么都不做,看起来也会与已弃用的旧方案不同,因为 Gaze 重写了“看向某处”是如何生成的,而不仅仅是由什么触发。4.5.0 发行说明记录了这一领域大约二十项行为级修正;读者最可能注意到:
现在,目光会作为一个整体动作在身体各部位间协调传递——眼睛、头部、胸部,然后是脚——而不再是三个互不协调的阶段各自猜测彼此该承担多少,因此角色不会再出现眼睛斜着看你、但头却朝向别处的情况。
闲置角色的好奇瞥视不再会瞬间弹出:过去它会以反射速度执行转向的第一部分;现在它会采用配置文件实际指定的转向时间。
决定看向新的地方,以及继续跟踪或停留在某物上,被当作两种不同的运动处理,这两者都由 Gaze Profile 的 头部与身体 设置来计时,而不是由临时阈值决定。
头部和胸部的转向会以自然的级联方式展开——颈部先动,头部稍后到达并稳定下来,胸部又带动它们两者——而不是作为一个僵硬整体一起旋转。
当玩家锚点是骨架变换而不是主摄像机时,对玩家的一瞥会瞄准玩家的视线高度,而不是他们脚下的地面。
头部转动时眼睛会保持稳定,而不是以头部速度扫过整个房间并迫使额外的纠正性扫视。
行走中的角色默认不再每隔几秒就瞥一眼自己的目的地,抵达时也不再把头低向自己的脚。
除非重新调校 Gaze Profile,否则这些都无法配置回旧行为——这些修正会无条件生效。完整列表见 发行说明.
验证迁移
进入播放模式。
ConvaiGazeController检查器显示 Ready; 无法工作 仅当装配没有可解析的头部骨骼时才会出现,并会指出修复方法。确认任何已迁移的
IGazeTargetProvider实现会在……中注册OnEnable并在……中注销OnDisable,并且编译时不会引用IFocusTargetProvider或IGazeIntentProvider项目中的任何位置。打开 Convai > Gaze Editor,则 设置 选项卡,并确认装配报告显示了预期的头部和眼部骨骼以及预期的眼部后端。
仅在每个
ConvaiWorldObjectFocusProvider其中的内容已替换为之后,再保存受影响的场景。ConvaiGazeTarget.
下一步
Gaze 快速入门凝视如何工作凝视故障排查最后更新于
这有帮助吗?