For the complete documentation index, see llms.txt. This page is also available as Markdown.

叙事设计脚本化

叙事设计完整的 C# 接口——IConvaiNarrativeDesign 事件、InvokeTrigger、带 speak 标签的 InvokeSpeech、异步部分获取以及运行时触发器重新配置。

以程序化方式控制叙事设计

Inspector 工作流覆盖了大多数用例。本页记录了完整的 C# 接口,适用于你需要程序化控制的场景——动态角色切换、运行时异步数据获取、运行时生成的叙事流程,或与自有游戏系统的深度集成。

此处描述的所有功能都可通过 IConvaiNarrativeDesign访问,它暴露在每个 ConvaiCharacter 中,可通过 NarrativeDesign 属性访问。 ConvaiNarrativeDesignManager 是位于 ConvaiNarrativeDesignTrigger 这两者内部都委托给此接口,因此你在 Inspector 中配置的一切也都可以通过代码访问。

访问角色 API

每个 ConvaiCharacter 暴露了一个 NarrativeDesign 属性,它返回一个 IConvaiNarrativeDesign 实现:

ConvaiCharacter character = GetComponent<ConvaiCharacter>();
IConvaiNarrativeDesign narrative = character.NarrativeDesign;

属性

属性
类型
说明

TemplateKeys

IReadOnlyDictionary<string, string>

当前为该角色跟踪的所有模板键的快照。

CurrentSectionId

string

最近一次从后端接收到的章节 ID。如果尚未接收任何章节,则为空字符串。

CurrentSectionData

NarrativeSectionData

完整章节负载。包含 SectionId, BehaviorTreeCode,以及 BehaviorTreeConstants. null 直到收到第一次章节变更。

监听章节变化

请在 OnEnable 中订阅这些事件,并在 OnDisable 中取消订阅,以避免在组件被禁用或销毁后留下过期监听器。

private void OnEnable()
{
    character.NarrativeDesign.OnSectionChanged     += HandleSectionChanged;
    character.NarrativeDesign.OnSectionDataReceived += HandleSectionData;
}

private void OnDisable()
{
    character.NarrativeDesign.OnSectionChanged     -= HandleSectionChanged;
    character.NarrativeDesign.OnSectionDataReceived -= HandleSectionData;
}

private void HandleSectionChanged(string previousId, string newId)
{
    Debug.Log($"章节:{previousId}{newId}");
}

private void HandleSectionData(NarrativeSectionData data)
{
    Debug.Log($"章节 ID:{data.SectionId}");
    // 此处可用 data.BehaviorTreeCode 和 data.BehaviorTreeConstants
}

事件

事件
签名
说明

OnSectionChanged

Action<string, string>

在每次章节切换时触发。参数: previousId, newId.

OnSectionDataReceived

Action<NarrativeSectionData>

在每次章节切换时触发,并携带完整负载。

OnTriggerInvoked

Action<ConvaiNarrativeTriggerInvocation>

在触发器或语音请求被本地接受后触发(在后端确认之前)。

从代码中调用触发器

InvokeTrigger 返回 false 如果 triggerName 是位于 triggerMessage 都为空,或者触发器在内部被拒绝,则返回。否则它返回 true ;如果会话尚未打开,则将触发器排队。

控制角色说什么

InvokeSpeech 让你可以直接控制角色的下一句发言,而不会推进叙事图谱。根据你是否将消息包裹在 <speak> 标签中,它有两种不同模式。

上下文注入(纯文本)

传入纯字符串,可让角色 知晓 一条信息。角色会吸收上下文,并用自己的话作出回应——具体措辞由 AI 决定。

当你希望角色以自然、对话式的方式对游戏事件作出反应,而不是照本宣科时,请使用此方式。

逐字语音(speak 标签)

将消息包裹在 <speak> 标签中,可让角色逐字逐句说出该文本。

适用于公告、脚本台词、安全警报,或任何需要精确措辞的时刻。

比较

模式
角色的行为

InvokeSpeech("text")

知晓上下文,并用自己的话回应

InvokeSpeech("<speak>text</speak>")

逐字说出该精确文本

InvokeSpeech 无论你使用哪种模式,它都不会推进叙事图谱。若要在发送消息的同时推进图谱,请使用 InvokeTrigger 配合命名触发器。

监听触发器调用

ConvaiNarrativeTriggerInvocation 字段:

字段
类型
说明

TriggerName

string

发送的触发器名称(语音时为空)。

TriggerMessage

string

可选的消息负载。

Queued

bool

true 如果因为会话尚未打开而延迟了触发器。

通过代码使用模板键

如果会话已打开,这两种方法会立即发送;如果没有,则会排队到下一次连接。

角色级 API 和 ConvaiNarrativeDesignManager的各方法在内部汇聚到同一传输层。当你希望这些键在 Inspector 中可见且可编辑时,请使用 Manager 的方法;当你只需要纯代码驱动、无需 Inspector 可见性时,请使用角色 API。

以编程方式获取章节和触发器

通过角色 API

NarrativeSectionInfo 字段: SectionId, SectionName.

NarrativeTriggerInfo 字段: TriggerId, TriggerName, TriggerMessage, DestinationSection.

通过静态获取器

NarrativeDesignFetcher 提供相同的数据,而无需角色组件引用——这在编辑器工具或加载界面中很有用:

FetchResult<T> 字段:

字段
类型
说明

Success

bool

true 如果请求成功。

Data

T

获取到的数据。 默认 如果 Successfalse.

错误

string

错误消息。 null 如果 Successtrue.

重置状态

从代码重新配置 ConvaiNarrativeDesignTrigger

所有可在 Inspector 中配置的设置都有对应的 setter 方法:

架构概览

结论

IConvaiNarrativeDesign 在代码中暴露完整的 Narrative Design 功能——触发器调用、语音注入、模板键控制、异步数据获取以及实时章节变化事件——因此你可以将其集成到任何架构中,而不必受限于 Inspector 组件。有关将这些 API 组合到真实场景中的完整示例,请参见 使用示例。如需诊断问题,请参见故障排除与诊断。

最后更新于

这有帮助吗?