Godot 引擎的脚本系统使开发者能够通过脚本自定义游戏逻辑、创建交互式行为并扩展引擎功能。本文档概述了 Godot 脚本系统的架构和内部工作原理,特别侧重于 Godot 的内置脚本语言 GDScript。
有关在游戏中使用 GDScript 的信息,请参阅用户文档。本文档面向希望了解脚本系统如何在引擎内实现的开发者。
Godot 脚本系统设计为模块化和可扩展的,支持多种脚本语言,同时提供与引擎核心系统的深度集成。GDScript 是主要的内置语言,但该架构允许通过脚本模块支持其他语言。
来源
GDScript 代码经历从源代码到执行的几个阶段。流程包括解析、分析、编译和执行阶段。
来源
解析阶段将 GDScript 源代码转换为抽象语法树 (AST)。
GDScriptTokenizer 分解为标记。GDScriptParser 从标记流构建 AST。来源
分析阶段接收 AST 并用类型信息和语义验证来增强它。
GDScriptAnalyzer 遍历 AST 并为其添加类型信息,从而生成类型化 AST。
来源
编译阶段将类型化 AST 转换为可由 GDScript 虚拟机执行的字节码。
GDScriptCompiler 使用 GDScriptByteCodeGenerator 从 AST 生成字节码。
来源
GDScript 代码由虚拟机执行,虚拟机解释字节码。
GDScriptInstance。GDScriptFunction。来源
GDScript 系统由几个关键类组成,它们协同工作以提供脚本功能。
| 类 | 目的 |
|---|---|
GDScript | 表示已编译的脚本,继承自 Script。 |
GDScriptNativeClass | 表示 GDScript 可访问的原生引擎类。 |
GDScriptInstance | 附加到对象的脚本的运行时实例。 |
GDScriptFunction | 表示脚本中的函数。 |
GDScriptParser | 将源代码解析为 AST。 |
GDScriptAnalyzer | 分析和类型检查 AST。 |
GDScriptCompiler | 将 AST 编译为字节码。 |
GDScriptByteCodeGenerator | 生成字节码指令。 |
GDScriptFunctionState | 表示用于 yield 的协程状态。 |
来源
GDScript 支持渐进式类型系统,允许脚本是动态类型或静态类型。
类型系统由 GDScriptParser::DataType 和 GDScriptDataType 类表示。
来源
GDScript 支持显式类型注解和类型推断。
var x: int = 5 等注解指定类型。:= 运算符从赋值中推断类型。GDScriptAnalyzer 负责在分析阶段进行类型检查和推断。
来源
加载 GDScript 文件时,它会经历以下过程:
来源
脚本实例化时,会发生以下情况:
GDScriptInstance 并将其附加到对象上_init 方法)来源
脚本执行涉及:
来源
GDScript 支持脚本系统实现的各种语言特性
GDScript 具有基于类的面向对象系统,支持单重继承
来源
GDScript 支持使用 await 关键字的常规函数和协程
await 暂停执行并在之后恢复来源
GDScript 提供对 Godot 引擎类型和实用函数的访问
来源
GDScript 通过多种机制与 Godot 引擎集成
脚本可以附加到场景树中的节点
GDScriptInstance_ready() 和 _process() 会在脚本上调用来源
GDScript 与 Godot 的信号系统集成
signal 关键字定义信号来源
GDScript 系统与 Godot 编辑器集成
来源
Godot 引擎的脚本系统通过 GDScript 为游戏逻辑提供了一个强大的框架。该系统的模块化设计允许内置的 GDScript 语言和第三方语言绑定,并拥有一个完整的从解析到执行的管道,支持动态和静态类型范式。