当前位置: 首页 > article >正文

Yarn Spinner 核心组件解析:VirtualMachine 与 Dialogue 系统深度剖析

Yarn Spinner 核心组件解析VirtualMachine 与 Dialogue 系统深度剖析【免费下载链接】YarnSpinnerThe core compiler and engine-agnostic components for Yarn Spinner, the friendly dialogue tool.项目地址: https://gitcode.com/gh_mirrors/ya/YarnSpinnerYarn Spinner 是一款友好的对话工具其核心编译器和引擎无关组件为游戏开发者提供了强大的对话系统支持。本文将深入剖析 Yarn Spinner 中的 VirtualMachine 与 Dialogue 系统揭示它们如何协同工作以实现灵活高效的对话流程管理。一、VirtualMachine对话执行的核心引擎1.1 状态管理ExecutionState 的五种工作模式VirtualMachine 作为 Yarn Spinner 的核心执行引擎通过ExecutionState枚举精确控制对话流程Stopped初始状态未运行任何节点WaitingOnOptionSelection等待用户选择对话选项WaitingForContinue等待继续执行指令DeliveringContent正在向客户端传递内容Running正在执行代码指令这种状态管理机制确保了对话流程的可控性和灵活性使开发者能够轻松实现复杂的对话逻辑。1.2 指令处理RunInstruction 方法的工作原理VirtualMachine 通过RunInstruction方法处理各种指令类型包括跳转、运行行、运行命令、添加选项等。以处理选项为例case Instruction.InstructionTypeOneofCase.AddOption: { var lineID i.AddOption.LineID; var expressionCount i.AddOption.SubstitutionCount; var strings new string[expressionCount]; for (int expressionIndex expressionCount - 1; expressionIndex 0; expressionIndex--) { string substitution state.PopValue().ConvertTostring(); strings[expressionIndex] substitution; } var line new Line(lineID, strings); var lineConditionPassed true; var hasLineCondition i.AddOption.HasCondition; if (hasLineCondition) { lineConditionPassed state.PopValue().ConvertTobool(); } state.currentOptions.Add(new PendingOption { line line, destination i.AddOption.Destination, enabled lineConditionPassed, }); break; }这段代码展示了 VirtualMachine 如何处理添加选项的指令包括处理变量替换和条件判断最终将选项添加到当前状态中。1.3 变量管理栈操作与函数调用VirtualMachine 通过栈结构管理变量和函数调用提供了PushValue、PopValue等方法进行栈操作。在函数调用方面CallFunction方法负责解析函数参数并执行相应的函数public static void CallFunction(Instruction i, Library Library, StackValue stack) { var functionName i.CallFunc.FunctionName; var function Library.GetFunction(functionName); var parameterInfos function.Method.GetParameters(); // 参数处理逻辑... // 调用函数 try { IConvertible returnValue (IConvertible)function.DynamicInvoke(parametersToUse); if (function.Method.ReturnType ! typeof(void)) { if (Types.TypeMappings.TryGetValue(returnValue.GetType(), out var yarnType)) { Value yarnValue new Value(yarnType, returnValue); stack.Push(yarnValue); } } } catch (System.Reflection.TargetInvocationException ex) { throw ex.InnerException; } }二、Dialogue对话系统的协调者2.1 事件处理六大核心委托Dialogue 类通过一系列委托事件实现与游戏引擎的交互主要包括LineHandler处理对话行OptionsHandler处理选项集CommandHandler处理命令NodeStartHandler节点开始时触发NodeCompleteHandler节点完成时触发DialogueCompleteHandler对话结束时触发这些委托为开发者提供了灵活的扩展点使其能够根据游戏需求自定义对话表现。2.2 变量存储IVariableStorage 接口Dialogue 类通过IVariableStorage接口管理变量提供了TryGetValue和SetValue等方法进行变量操作。MemoryVariableStore是其默认实现使用字典在内存中存储变量值public class MemoryVariableStore : IVariableStorage { private readonly Dictionarystring, object variables new Dictionarystring, object(); public bool TryGetValueT(string variableName, out T result) { // 变量获取逻辑... } public void SetValue(string variableName, string stringValue) { this.variables[variableName] stringValue; } // 其他实现... }2.3 对话控制SetNode 与 Continue 方法Dialogue 类提供了SetNode和Continue方法控制对话流程。SetNode方法用于设置当前要执行的节点而Continue方法则用于继续执行对话public void Continue() { if (this.vm.CurrentExecutionState VirtualMachine.ExecutionState.Running) { return; } this.vm.Continue(); }三、VirtualMachine 与 Dialogue 的协同工作3.1 架构设计分层协作模式Yarn Spinner 采用分层设计Dialogue 类作为上层接口负责与游戏引擎交互而 VirtualMachine 作为下层执行引擎负责具体的指令执行。这种分层设计使得系统各部分职责明确便于维护和扩展。3.2 数据流转从指令到表现对话执行的数据流转过程如下Dialogue 接收游戏引擎的调用如SetNode、ContinueDialogue 将请求转发给 VirtualMachineVirtualMachine 执行相应指令处理变量和逻辑VirtualMachine 通过事件委托将结果如对话行、选项传递给 DialogueDialogue 将结果呈现给游戏引擎3.3 扩展能力自定义内容显著性策略Yarn Spinner 提供了IContentSaliencyStrategy接口允许开发者自定义内容选择策略。例如RandomBestLeastRecentlyViewedSaliencyStrategy实现了基于随机和最近最少使用的内容选择算法public class RandomBestLeastRecentlyViewedSaliencyStrategy : IContentSaliencyStrategy { // 实现内容选择逻辑... }四、实际应用与最佳实践4.1 基础使用流程初始化创建 Dialogue 实例并设置变量存储加载程序通过SetProgram方法加载编译好的 Yarn 程序设置节点使用SetNode方法设置起始节点处理事件注册事件处理函数以响应对话事件执行对话调用Continue方法开始执行对话4.2 高级技巧节点组与智能变量Yarn Spinner 支持节点组和智能变量允许开发者创建动态对话内容。通过GetSaliencyOptionsForNodeGroup方法可以获取节点组的显著性选项实现基于玩家状态的对话内容动态选择。4.3 性能优化预加载与资源管理为提高性能建议预加载常用对话节点合理使用PrepareForLinesHandler预加载资源及时清理不再需要的对话资源五、总结Yarn Spinner 的 VirtualMachine 和 Dialogue 系统构成了一个强大而灵活的对话引擎。VirtualMachine 负责底层指令执行和状态管理而 Dialogue 则提供了高层接口和事件机制使开发者能够轻松构建复杂的对话系统。通过深入理解这些核心组件开发者可以充分利用 Yarn Spinner 的潜力为游戏创建引人入胜的对话体验。无论是开发简单的对话树还是复杂的动态对话系统Yarn Spinner 都提供了必要的工具和灵活性帮助开发者实现创意愿景。通过本文的解析希望能为开发者更好地理解和使用 Yarn Spinner 提供帮助。【免费下载链接】YarnSpinnerThe core compiler and engine-agnostic components for Yarn Spinner, the friendly dialogue tool.项目地址: https://gitcode.com/gh_mirrors/ya/YarnSpinner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

Yarn Spinner 核心组件解析:VirtualMachine 与 Dialogue 系统深度剖析

Yarn Spinner 核心组件解析:VirtualMachine 与 Dialogue 系统深度剖析 【免费下载链接】YarnSpinner The core compiler and engine-agnostic components for Yarn Spinner, the friendly dialogue tool. 项目地址: https://gitcode.com/gh_mirrors/ya/YarnSpinne…...

【AI原生开发实战】1.2 传统开发 vs AI原生开发:思维转变与架构差异

学习目标 通过本章的学习,你将掌握以下核心知识点: 理解传统软件开发与AI原生开发的本质差异掌握两种开发范式在思维模式上的根本转变对比确定性编程与概率性编程的核心特征应用从"写规则"到"写Prompt"的思维转变方法实践通过具体代…...

ROS usb_cam像素格式终极指南:从YUV、MJPEG到源码修改,彻底告别警告和花屏

ROS usb_cam像素格式终极指南:从YUV、MJPEG到源码修改,彻底告别警告和花屏 当你在ROS中调用UVC摄像头时,是否遇到过图像花屏或终端不断弹出"deprecated pixel format"警告?这些问题往往源于对像素格式的误解或配置不当。…...

RK3568平台ES7210 Codec多路麦克风精准录音与驱动调试实战

1. 理解ES7210在多路麦克风阵列中的关键作用 在RK3568平台上集成ES7210音频编解码器时,首先要理解这颗芯片的独特架构。ES7210作为一款专业级音频ADC,其核心价值在于支持四路差分麦克风输入,每路都包含完整的PGA(可编程增益放大器…...

MongoDB实战:从社交到物流,5大高并发场景下的最佳实践

MongoDB高并发实战:社交、游戏与物流场景的架构设计精要 当应用面临每秒数千次请求时,传统关系型数据库的表结构设计往往成为性能瓶颈。MongoDB的文档模型天然适合处理这种高并发、低延迟的数据访问需求,但需要开发者彻底转变关系型数据库的思…...

CiteSpace实战:如何用WOS数据生成高质量文献知识图谱(含美化技巧)

CiteSpace进阶指南:从WOS数据到学术级知识图谱的实战优化 在科研工作中,一篇优秀的文献综述往往能成为领域研究的"地图",而知识图谱则是这张地图上最直观的路线标识。作为一款专业的文献计量工具,CiteSpace在学术界已有…...

MySQL8.4在华为欧拉openEuler24.03上的性能优化与安全配置实战

MySQL8.4在华为欧拉openEuler24.03上的性能优化与安全配置实战 在数据库管理的世界里,性能和安全就像一枚硬币的两面,缺一不可。特别是当MySQL8.4运行在华为欧拉openEuler24.03这样的企业级操作系统上时,如何充分发挥其潜力,同时…...

从躺平到高效:告别“一刀切”的系统性管理变革

管理实践中,“一刀切”式的制度调整屡见不鲜:效率不足便只抓计件,质量下滑就只管标准。结果往往是从一个极端摆向另一个极端,陷入“改了又改”却始终无效的困局。北京华恒智信分析员将在本文中,以一家加油站洗车工的四…...

Stimulsoft 报告和仪表盘2026.2即将推出,来看具体详情

Stimulsoft Reports & Dashboards 2026.2 版本即将发布。本次更新将围绕报表查看器、数据源能力、参数验证以及仪表盘设计等多个方向展开,进一步增强产品在报表开发与可视化分析场景中的灵活性与智能化水平。 从 React 报表查看器,到由人工智能驱动…...

幻想梦境风格 AI 绘画提示词合集|Midjourney 直用

今天给大家分享一组幻想梦境风格的提示词,使用工具为 Midjourney:https://www.midjourney.com/所有提示词均适配 Midjourney 生成,贴合幻想梦境、梦核怪核、超现实氛围感的核心风格,可直接复制使用。一、提示词 1 - 鱼眼小猪风格定…...

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程

从命令行程序切入:RTKLIB新手实战指南 1. 为什么从命令行程序开始学习RTKLIB? 当你第一次打开RTKLIB的源码目录,面对数十万行代码和复杂的界面程序,很容易陷入"从哪开始"的困惑。作为过来人,我强烈建议从命令…...

告别浏览器!用JavaFX WebView给你的桌面应用嵌入一个“活”网页(附完整代码)

JavaFX WebView深度实战:打造高性能嵌入式浏览器组件 当我们需要在JavaFX桌面应用中嵌入动态网页内容时,WebView组件往往是最优雅的解决方案。不同于简单调用系统浏览器,WebView提供了完全可控的渲染环境,让网页内容与应用界面无缝…...

Mac上通过Homebrew快速部署Miniconda:轻量级Python环境管理指南

1. 为什么选择Miniconda Homebrew组合? 在Mac上管理Python环境就像整理衣柜——你既需要足够的空间存放不同季节的衣服(各种Python版本和库),又不想让整个房间被衣柜塞满。这就是为什么我强烈推荐Miniconda和Homebrew这对黄金组合…...

高效AI教材生成工具,低查重率优势,轻松搞定教材编写!

编写教材难题与AI工具解决方案 编写教材,如何实现精准匹配多样化需求?不同学段学生的认知能力差异明显,内容深浅不宜失衡;课堂教学与自主学习等场景的需求各异,教材的呈现形式也需灵活调整;而各地区的教学…...

Unity Mod加载效率提升解决方案:MelonLoader从安装到精通的全方位指南

Unity Mod加载效率提升解决方案:MelonLoader从安装到精通的全方位指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader …...

CH9329串口转HID键鼠芯片:从选型到实战的避坑指南

1. CH9329芯片:串口转HID的"万能翻译官" 第一次接触CH9329时,我把它想象成一个"语言翻译官"——能把单片机说的"方言"(串口数据)翻译成电脑能听懂的"普通话"(USB HID协议&…...

AOSP 14 Launcher3 桌面改造:三步搞定谷歌搜索栏移除,附完整代码与避坑点

AOSP 14 Launcher3深度定制:彻底移除谷歌搜索栏的工程实践 当国内开发者拿到AOSP 14源码时,Launcher3默认集成的谷歌搜索栏往往成为首个需要处理的"不和谐元素"。这个占据首屏显著位置的组件不仅功能受限,更可能影响整体UI协调性。…...

机器人在未来,能否走进千家万户?

——作为淮南的一名少儿编程老师,每天和孩子们打交道。课堂上,孩子们最常问我的问题之一就是:“老师,以后我家能买一个机器人吗?”每当这时,我都会想起自己小时候看《哆啦A梦》时的憧憬——谁不想拥有一个能…...

基于SpringBoot + Vue的车辆尾气检测排放系统(双端 + 数据可视化大屏)

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...

基于SpringBoot + Vue的城市供水管网爆管预警系统(角色:用户、维护人员、管理员)

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...

【Linux开发】03Linux 线程同步:信号量(Semaphore)

一、问题:互斥量只能“锁”,不能“排队” 前面我们学习了互斥量,它可以解决多个线程同时访问共享资源的问题,保证同一时间只有一个线程进入临界区。但互斥量只能做到“互斥”,无法控制线程的执行顺序。 1.1 需要控制顺…...

从字典选择到结果分析:dirsearch高效扫描的完整工作流(含SecLists实战)

从字典选择到结果分析:dirsearch高效扫描的完整工作流(含SecLists实战) 在Web安全评估和渗透测试中,目录扫描是发现潜在攻击面的关键步骤。传统的手工探测方式效率低下,而盲目使用默认配置的扫描工具又会产生大量无效结…...

Claude 长文档处理怎么做分块与上下文组织

很多开发者都知道 Claude 适合处理长文档。 但真正落到工程里,效果好不好,往往不取决于模型本身,而取决于你怎么组织输入。 说得更直接一点,长文档处理最常见的误区不是模型不够强,而是团队把一大堆原始材料直接塞进去…...

Linux 线程:从虚拟地址空间到 POSIX 线程控制全解析

前言在 Linux 系统编程与操作系统原理中,线程是并发执行的核心单元,而虚拟地址空间与分页机制是线程共享资源、轻量化运行的底层基石。本文将从线程本质、内存管理原理、进程线程对比、POSIX 线程控制、地址空间布局到线程封装,层层拆解 Linu…...

个人创作者必看:靠谱知识付费平台实测,热门排行榜推荐

对于个人创作者来说,知识付费的核心的是“内容变现”,而选对靠谱的平台,就是打通变现路径的关键一步。不少创作者明明有优质内容,却因选错平台,要么被复杂操作劝退,要么无法沉淀私域用户,要么收…...

实战指南:构建坚不可摧的vCenter HA高可用集群

1. 为什么你的企业需要vCenter HA高可用集群 记得去年有个客户半夜给我打电话,说他们的vCenter突然宕机,整个虚拟化平台瘫痪了。当时正是业务高峰期,损失惨重。这就是典型的单点故障问题——vCenter作为整个vSphere环境的大脑,一旦…...

类型声明不再“形同虚设”:PHP 8.9运行时类型验证增强如何让CI失败率下降67%?

第一章:PHP 8.9类型系统增强的演进背景与核心价值PHP 类型系统自 PHP 7 引入标量类型声明和返回类型以来,持续向静态可分析、运行时安全、开发者友好的方向演进。PHP 8.9 并非官方已发布的版本(截至 2024 年,PHP 最新稳定版为 8.3…...

程序员必备!8个无广告在线小工具,调试效率直接翻倍

程序员必备!8个无广告在线小工具,调试效率直接翻倍 日常开发中,经常会遇到各种琐碎的数据处理需求:接口返回的JSON格式混乱、时间戳不知道怎么转日期、URL参数需要编码解码…… 网上找的工具要么弹窗广告满天飞,要么功…...

msgpack Golang查询功能揭秘:高效提取序列化数据的完整指南

msgpack Golang查询功能揭秘:高效提取序列化数据的完整指南 【免费下载链接】msgpack msgpack.org[Go] MessagePack encoding for Golang 项目地址: https://gitcode.com/gh_mirrors/msg/msgpack 想要在Golang项目中快速提取MessagePack序列化数据中的特定字…...

m4s-converter:B站缓存视频本地化工具 3步实现媒体文件自主管理

m4s-converter:B站缓存视频本地化工具 3步实现媒体文件自主管理 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 一、问题象限&#x…...