菜单

脚本系统

相关源文件

Godot 引擎的脚本系统使开发者能够通过脚本自定义游戏逻辑、创建交互式行为并扩展引擎功能。本文档概述了 Godot 脚本系统的架构和内部工作原理,特别侧重于 Godot 的内置脚本语言 GDScript。

有关在游戏中使用 GDScript 的信息,请参阅用户文档。本文档面向希望了解脚本系统如何在引擎内实现的开发者。

架构概述

Godot 脚本系统设计为模块化和可扩展的,支持多种脚本语言,同时提供与引擎核心系统的深度集成。GDScript 是主要的内置语言,但该架构允许通过脚本模块支持其他语言。

脚本系统架构图

来源

脚本处理流程

GDScript 代码经历从源代码到执行的几个阶段。流程包括解析、分析、编译和执行阶段。

脚本处理流程

来源

解析

解析阶段将 GDScript 源代码转换为抽象语法树 (AST)。

  1. 分词:源代码被 GDScriptTokenizer 分解为标记。
  2. AST 构建GDScriptParser 从标记流构建 AST。
  3. 结构验证:在此阶段进行基本的语法和结构验证。

来源

分析

分析阶段接收 AST 并用类型信息和语义验证来增强它。

  1. 符号解析:将标识符解析到其各自的声明。
  2. 类型推断:为表达式和变量推断类型。
  3. 类型检查:验证赋值和表达式中的类型兼容性。
  4. 语义验证:检查无效访问修饰符等语义错误。

GDScriptAnalyzer 遍历 AST 并为其添加类型信息,从而生成类型化 AST。

来源

编译

编译阶段将类型化 AST 转换为可由 GDScript 虚拟机执行的字节码。

  1. 表达式编译:将表达式编译为字节码操作。
  2. 控制流编译:编译控制流结构(if、for、while 等)。
  3. 函数组装:使用适当的范围处理来组装函数字节码。
  4. 常量和元数据生成:收集执行所需的常量和其他元数据。

GDScriptCompiler 使用 GDScriptByteCodeGenerator 从 AST 生成字节码。

来源

执行

GDScript 代码由虚拟机执行,虚拟机解释字节码。

  1. 脚本实例创建:当脚本附加到节点时,会创建 GDScriptInstance
  2. 函数调用:函数调用被分派到相应的 GDScriptFunction
  3. VM 操作:虚拟机执行字节码操作以执行计算。
  4. 原生集成:对引擎功能的调用通过 VM 进行桥接。

来源

GDScript 类层次结构

GDScript 系统由几个关键类组成,它们协同工作以提供脚本功能。

目的
GDScript表示已编译的脚本,继承自 Script
GDScriptNativeClass表示 GDScript 可访问的原生引擎类。
GDScriptInstance附加到对象的脚本的运行时实例。
GDScriptFunction表示脚本中的函数。
GDScriptParser将源代码解析为 AST。
GDScriptAnalyzer分析和类型检查 AST。
GDScriptCompiler将 AST 编译为字节码。
GDScriptByteCodeGenerator生成字节码指令。
GDScriptFunctionState表示用于 yield 的协程状态。

来源

类型系统

GDScript 支持渐进式类型系统,允许脚本是动态类型或静态类型。

数据类型

类型系统由 GDScriptParser::DataTypeGDScriptDataType 类表示。

来源

类型检查与推断

GDScript 支持显式类型注解和类型推断。

  1. 显式类型注解:开发者可以使用 var x: int = 5 等注解指定类型。
  2. 类型推断:可以使用 := 运算符从赋值中推断类型。
  3. 运行时类型检查:类型兼容性在编译时和运行时都会进行检查。

GDScriptAnalyzer 负责在分析阶段进行类型检查和推断。

来源

脚本生命周期

脚本加载与解析

加载 GDScript 文件时,它会经历以下过程:

  1. 加载源文件:从磁盘加载脚本源文件。
  2. 解析:将源文件解析为 AST。
  3. 分析:分析 AST 以进行类型检查。
  4. 编译:将类型化 AST 编译为字节码。
  5. 缓存:缓存编译后的脚本以供将来使用。

来源

脚本实例化

脚本实例化时,会发生以下情况:

  1. 对象创建:创建一个基础对象(通常是 Node 或 Reference)
  2. 实例创建:创建一个 GDScriptInstance 并将其附加到对象上
  3. 成员初始化:初始化脚本成员
  4. 构造函数调用:调用脚本的构造函数(_init 方法)

来源

脚本执行

脚本执行涉及:

  1. 方法调用:在脚本实例上调用方法
  2. 字节码解释:GDScript 虚拟机解释字节码
  3. 信号处理:信号被分发给连接的回调
  4. 原生接口:通过接口调用原生引擎功能

来源

GDScript 语言特性

GDScript 支持脚本系统实现的各种语言特性

类和继承

GDScript 具有基于类的面向对象系统,支持单重继承

来源

函数和协程

GDScript 支持使用 await 关键字的常规函数和协程

  1. 常规函数:从头到尾执行,不暂停
  2. 协程:可以使用 await 暂停执行并在之后恢复

来源

内置类型和实用函数

GDScript 提供对 Godot 引擎类型和实用函数的访问

  1. 引擎类型:Vector2、Rect2、Transform2D 等
  2. 集合:Array、Dictionary 等
  3. 实用函数:print()、load()、preload() 等

来源

与 Godot 引擎的集成

GDScript 通过多种机制与 Godot 引擎集成

脚本附加到节点

脚本可以附加到场景树中的节点

  1. 节点创建:在场景树中创建一个节点
  2. 脚本赋值:将脚本赋值给节点
  3. 实例创建:为节点创建一个 GDScriptInstance
  4. 方法回调:引擎的回调,如 _ready()_process() 会在脚本上调用

来源

信号系统

GDScript 与 Godot 的信号系统集成

  1. 信号定义:脚本可以使用 signal 关键字定义信号
  2. 信号连接:可以将信号连接到回调
  3. 信号发射:脚本可以发射信号

来源

编辑器集成

GDScript 系统与 Godot 编辑器集成

  1. 语法高亮:GDScript 提供用于语法高亮的词法分析
  2. 代码补全:解析器和分析器提供代码补全所需的数据
  3. 文档:GDScript 暴露方法和类信息以供文档使用

来源

结论

Godot 引擎的脚本系统通过 GDScript 为游戏逻辑提供了一个强大的框架。该系统的模块化设计允许内置的 GDScript 语言和第三方语言绑定,并拥有一个完整的从解析到执行的管道,支持动态和静态类型范式。