对话可用性如何运作
了解 Convai Unity SDK 如何判断某个角色是否能听到玩家,以及为什么仅仅连接到房间还不够。
在 Convai 尚未宣布玩家正在对话的角色之前,房间就可能先报告自己已连接。会话可用性回答的是比“房间是否已连接”更窄的问题——它问的是“此刻这个特定角色能否听到玩家说话”——而这正是 SDK 中每个输入入口在允许玩家说话或输入之前所检查的内容。
为什么“已连接”不等同于“可用”
房间报告已连接,并不表示服务已经确认了正在被对话的角色。在这段空档中输入的问候会被接受、发送,然后丢失——不会有任何日志记录,也不会有人告诉玩家为什么没人回应。 ConvaiManager.ConversationAvailability 它弥补了这一空档。将输入绑定到它,而不是绑定到房间是否已连接。
按生命周期顺序排列的状态
ConvaiManager.ConversationAvailability 返回一个 ConvaiConversationAvailability 值:
NoCharacter
当前没有正在被对话的角色,或者场景尚未设置。
Offline
没有房间。没有任何东西在监听。
Connecting
房间正在建立中。
Preparing
房间已连接,但服务还没有确认这个角色。此时发送的消息会丢失。
就绪
该角色能听到玩家。
Answering
该角色正在回答。输入仍然会被接受——在角色回答到一半时打断它属于正常对话,而不是被拒收的消息。
Unavailable
该角色启动失败,或已离开房间。不同于 Connecting 和 Preparing,这不会自行解决。
不要将这些值与 < 或 >. 就绪 和 Answering 是接受玩家输入的两个状态,而且它们在列表中并不相邻。
要问哪个问题
两个扩展方法回答了 UI 实际会关心的两个问题:
CanAcceptPlayerInput()— 现在发送的消息,无论是键入的还是说出的,是否会到达角色。仅当就绪和Answering.IsSettling()— 该状态是否会自行结束,而不需要告诉玩家做任何事。仅当Connecting和Preparing.
正在向谁提问
ConvaiManager.ConversationAvailability 回答的是 ConvaiManager.AddressedCharacter — 玩家当前正在与之交谈的任何角色,无论房间是否为多个角色保留名册。相同的答案也可在每个角色的 ConvaiCharacter.ConversationAvailability.
ConvaiCharacter.ConversationAvailability 位于 ConvaiCharacter.IsCharacterReady旁边,而这两者很容易混淆。 IsCharacterReady 由 Convai 的角色就绪信号设置一次,并且不会自行清除。 ConversationAvailability 还会考虑房间是否已连接、该角色是否仍在共享房间的名册中占有一席之地,以及该角色当前是否正在说话——因此,一个角色可以报告 IsCharacterReady == true 来自较早的一次连接,而 ConversationAvailability 会报告 Unavailable,因为它在当前房间中已经没有席位了。
在目标切换过程中
ConvaiManager.ConversationAvailabilityChanged 会在判断结果发生变化时触发——包括玩家开始转而对另一个角色说话,而该角色的可用性与他刚离开的那个不同的时候。当目标切换正在进行时,可用性会报告 Preparing 即使对于一个在 就绪 前一刻还是如此的角色也是这样,因此当对话实际上正在角色之间切换,而不是接受一条最终落不到任何一方的消息时,输入会在那一刻关闭。
相关概念
根据可用性控制 UI多角色会话工作原理最后更新于
这有帮助吗?