Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

在 Godot 中应用面向对象原则

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

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

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

脚本在引擎中的工作原理

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

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

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

  • 属性。

  • 方法。

  • 常量。

  • 信号。

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

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

备注

Even scripts that don't use the extends keyword implicitly inherit from the engine's base RefCounted class. As a result, you can instantiate scripts without the extends keyword from code. Since they extend RefCounted though, you cannot attach them to a Node.

场景

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

We often pair a scene with a scripted root node that makes use of the scene's nodes. As such, the script extends the scene by adding behavior through imperative code.

场景的内容有助于定义:

  • What nodes are available to the script.

  • How they are organized.

  • How they are initialized.

  • What signal connections they have with each other.

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

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

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