对话目标选择如何运作
了解 Convai Unity SDK 如何根据视线方向评分来决定玩家正在与谁对话,以及为什么在切换之间该决定保持稳定。
对话指向是规则 ConvaiManager 每秒运行十五次,用来决定在一个有多个角色的房间里,玩家当前是在对谁说话。理解其背后的模型——角色如何被评分,以及为什么当更合适的候选者出现时目标不会立刻移动——就能解释为什么在训练模拟、交互体验以及玩家一次面对多个角色的游戏中,指向会表现成那样。
为什么指向逻辑放在管理器上,而不是组件上
一个只有一个角色可工作的场景,在加入第二个角色的那一刻也必须继续正常工作。只有在有人找到并添加一个指向组件后才生效的规则,不过是另一种说法的手动步骤,因此这项策略放在 ConvaiManager上,即每个可工作的场景本来就已有的组件。无需添加碰撞体,无需配置图层遮罩,也没有必须填写的字段——一个有两个激活 ConvaiCharacter 组件的房间已经具备了指向所需的一切。
只有一个角色的房间根本不会触发这些逻辑。这个角色独占对话,因此没有什么可决定的。
视线方向评分
在默认模式下,指向逻辑读取的是玩家的视线方向,而不是向场景中发射射线。射线需要每个角色都带有碰撞体,并且正确配置图层遮罩;只要其中任何一项缺失,或者有一个多余的碰撞体挡住视线,它就会静默失败。改为读取摄像机的前向方向,则意味着鼠标、手柄、触摸屏和头戴显示设备都会以同样方式驱动指向,因为它们都不会改变摄像机所指向的地方。
每个候选角色都会根据玩家视线方向与该角色之间的角度来评分,距离作为平局时的判定标准。得分最高的角色,就是系统判断玩家正在看的角色。
资格数值与切换数值
ConversationTargetingOptions 将其四个设置分成两组,用来回答不同的问题,因为它们是在不同时间、出于不同原因调校的。
MaxDistance 和 MaxAngle 决定谁是 有资格的 ——角色必须处于其中,玩家才会被算作正在对其说话的空间范围形状。 SwitchMargin 和 SwitchDelaySeconds 决定如何 自愿地 一个符合资格的挑战者接管对话,而它们的存在完全是为了防止目标闪烁。
没有第二组数值,两个站得很近的角色会在摄像机不到一度的微小移动下把对话来回切换,而把视角扫过整个房间会让对话依次交给它经过的每个人。这两种问题在实际游玩中都很明显,但在代码里却看不出来,因此用于防止它们的数值是与决定资格的数值分开调校的。请参见 会话定向参考 以了解具体字段和默认值。
防止它变得烦人的三条规则
除了这四个可调数值外,还有三条规则约束指向逻辑,而这些并不是场景可以关闭的设置。
一瞥不等于在对它说话。 一个角色必须在一段时间内明显更优,之后对话才会真正转向他——目光掠过某个角色而没有停住,并不会重定向对话。这就是 SwitchDelaySeconds 和 SwitchMargin 二者共同强制的结果:挑战者必须以配置的差值超过当前目标,并且在配置的延迟时间内保持领先,指向才会提交切换。
玩家自己说出的句子会钉住目标。 对话不能在玩家说话的过程中移动——一句话的后半部分落到不同角色身上,这不是后来的修正能补救的。不过,玩家说到一半时的那一眼并不会被丢弃:它会被记住,所以只要目光在整句话期间一直停留,对话就会在句子结束的那一刻移动,而不需要再看同一个角色第二次。
目标永远不会自行清空。 当当前没有任何人符合资格时,最近被对话提及的角色会继续保有对话,而不是让对话清空。清空目标意味着玩家说话却没有任何人回应,这看起来更像是场景坏掉了,而不是在对任何人说话。
一次只能有一个角色发言
Convai 服务的约定是同一时间只能有一个角色说话。移动对话会结束前一个角色的回合,即使是在句子中途。一个台词必须始终完整听到的场景——例如简报、脚本化片段——应该要么将指向设置为 手动 并有意地移动对话,要么在……期间避免移动目标 ConvaiCharacter.IsSpeaking 为 true 时。
相关概念
多角色会话工作原理选择目标模式最后更新于
这有帮助吗?