Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

在 Godot 中应用面向对象原则

Godot 引擎主要提供了两种创建可复用对象的方式:脚本和场景。严格来说,这两种方式都没有真的在底层定义类。

尽管如此,在许多使用 Godot 的最佳方法中,依然涉及将面向对象的编程原则应用到游戏的脚本和场景中。这就是为什么我们需要了解如何将它们视为类。

本指南简要介绍了脚本和场景在引擎核心中的工作方式,,以帮助你了解它们在底层是如何工作的。

脚本在引擎中的工作原理

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

这些脚本严格来说并不是类,而是一种资源,用来告知引擎在某一内置类的基础上执行一系列初始化。

Godot 的内部类可以将一个类的数据注册进一个名为 ClassDB 的数据库,该数据库让我们可以在运行时访问类的信息。 ClassDB 包含有关类的信息,例如:

  • 属性。

  • 方法。

  • 常量。

  • 信号。

当对象在执行访问属性或调用方法等操作时,它就会检查 ClassDB 中对象和对象基类的记录,以确定对象是否支持该操作。

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

备注

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

场景

场景的行为与类有很多相似之处,所以把场景看成一个类也是合理的。场景是可复用、可实例化、可继承的节点组。创建场景就类似于,有一个脚本去创建一些节点,并使用 add_child() 将它们添加为子节点。

我们经常为场景搭配一个带有脚本的根节点,并在脚本中使用这个场景下的节点。在这种情况下,脚本是通过使用命令式代码为场景添加行为来扩展场景的。

场景的内容有助于定义:

  • 脚本可使用哪些节点。

  • 它们是如何组织的。

  • 它们是如何初始化的。

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

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

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

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