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),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2496411.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!