在 Godot 中应用面向对象原则

引擎提供了两种创建可重用对象的主要方式: 脚本和场景. 这两种方式在技术上都没有在引擎下定义类.

尽管如此, 使用Godot的许多最佳实践涉及到将面向对象的编程原则应用到组成你的游戏的脚本和场景中. 这就是为什么了解我们如何将它们视为类是很有用的.

本指南简要介绍了脚本和场景在引擎核心中的工作方式, 以帮助您了解它们在引擎中的工作方式.

脚本在引擎中的工作原理

引擎提供了内置的类, 如 Node . 你可以使用脚本扩展这些类来创建派生类型.

这些脚本在技术上不是类. 相反, 它们是告诉引擎在内置类中执行一系列初始化的资源.

Godot的内部类具有使用一个 ClassDB 注册一个类数据的方法. 该数据库提供对类信息的运行时访问. ClassDB 包含有关类的信息, 例如:

  • 属性。

  • 方法。

  • 常量。

  • 信号。

这个 ClassDB 是对象在执行访问属性或调用方法等操作时的检查对象. 它检查数据库的记录和对象的基本类型记录, 以确定对象是否支持该操作.

Script 附加到你的对象中, 可以扩展 ClassDB 中的方法, 属性和信号.

备注

脚本即使没有使用 extends 关键字,也会隐式地继承引擎的基础 Reference 类。因此,你可以从代码中实例化不使用 extends 关键字的脚本。不过由于扩展的是 Reference,你是无法把它们附加到 Node 上的。

场景

场景的行为与类有很多相似之处, 所以把场景看成一个类是有意义的. 场景是可重用, 可实例化, 可继承的节点组. 创建场景类似于有一个脚本, 创建节点并使用 add_child() 将其添加为子节点.

我们经常将场景与使用场景节点的脚本根节点配对. 因此, 场景通常是脚本声明性代码的扩展.

场景的内容有助于定义:

  • 脚本可使用哪些节点

  • 它们是如何组织的

  • 它们是如何初始化的

  • 它们彼此之间有什么信号连接

为什么这些对组织场景很重要?因为场景的实例都是对象。因此,许多适用于书面代码的面向对象原则也适用于场景:单一职责、封装等。

场景就是对附着在根节点上的脚本的扩展,所以你可以将其解释为类的一部分。

此系列最佳实践中所解释的大部分技术都建立在这一点上。