Unity3d 可视化脚本框架如何在幕后工作?

How does a Unity3d visual scripting framework work behind the scene?

我想知道在unity3d中使用可视化脚本工具时会发生什么。

假设我想制作一个 FSM:

第一种方法是当我不使用这样的工具时。在这种情况下,我应该在源代码 (C#) 中执行所有操作,这意味着创建所有必要的 类 并手动连接整个状态机。

第二种方法是当我使用 Bolt or NodeCanvas 这样的工具时。我仍然需要编写状态 类,但这次,通过基于节点的图形编辑器以可视方式将它们连接起来。

问题是,这些工具如何将该图转换成 Unity 可以使用的东西?他们是否使用像 T4 Templating Engine 这样的模板引擎基于图表生成 C# 代码?或者他们会做其他事情吗?

他们可以生成一些 C# 代码或将图形定义保存到文件中,向您的游戏添加运行时执行引擎并在游戏运行时解释这些引擎 运行。他们也可能采用混合方法或进行一些性能优化。所以任何一种方式都是可能的,你应该查阅工具的设计文档来确定。

至于Bolt, this post 在开发者官方博客上,暗示当前稳定版本没有 生成任何 C# 代码。但显然该团队正在积极开发支持代码生成的新版本。

We are currently actively working on Bolt 2, a major new version that includes massive overhauls and new features such as C# generation, classes, vertical flow, tweening, generics, a fresh new look, and a lot more.

至于 NodeCanvas,我不确定它是否生成任何 C# 代码,但从资产商店中的包内容来看,看起来它以类似的方式工作到博尔特。

您必须了解 lexer and parser 才能完全理解它。

当您以非图形方式编写内容时,计算机会将那段代码或代码转换为机器可读格式,因为计算机甚至无法区分 ab。它将它转换成binaryhexa(后来甚至变成binary)。

现在问题仍然存在可视化脚本是如何工作的?

好的,开发人员有自己的词法分析器和解析器,他们遍历这些可视组件并从中创建代码,然后根据语言对这些组件进行解释或编译。

如你所愿了解Unity,它是基于C#,将编译。

Unity 有 editor/playmode/runtime 模式。 在编辑器模式绘图中,您的设计保存在文件中。一些工具使用自定义格式二进制文件,json 或其他。例如 LogicForge,使用 Scriptable 对象完全兼容 Unity 依赖和序列化管理。 可以在编辑器 and/or 播放模式中设计图形。 Logic forge 两者都支持,因为在 playmode 中您可以立即看到您的设计在做什么。 节点可以表示原子功能或复杂组件。如果可视化工具让您有机会设计自己的节点,也可以可视化并自动创建设计中删除的任何 MonoBehaviour 脚本的节点,那就太好了。 节点可以是动态的或静态的,已经编码。动态节点使用反射创建函数playmode/runtime。它们使用缓存和 IL 创建的委托进行了优化。 更改图形时可以生成代码,但Unity重新编译需要等待很长时间,也可以按要求生成。工具可以选择 compact 设计创建代码和更复杂的设计节点。
图形资产可以附加到 GameObject 并随场景一起加载,或者可以作为资源运行时加载,然后 implement design.They 读取序列化数据并在游戏对象上创建组件。

有些工具集成了 FSM,因此您可以根据条件在不同的图形之间切换 designs/logics。 Logic Forge 有通用的基于事件的 FSM 和动画播放器 blender(你不需要使用 Mecanim)