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.
Checking the stable version of the documentation...
在 Godot 中应用面向对象原则
Godot 引擎主要提供了两种创建可复用对象的方式:脚本和场景。严格来说,这两种方式都没有真的在底层定义类。
尽管如此,在许多使用 Godot 的最佳方法中,依然涉及将面向对象的编程原则应用到游戏的脚本和场景中。这就是为什么我们需要了解如何将它们视为类。
本指南简要介绍了脚本和场景在引擎核心中的工作方式,,以帮助你了解它们在底层是如何工作的。
脚本在引擎中的工作原理
引擎提供了内置的类,如 Node 。你可以使用脚本扩展这些类来创建派生类型。
这些脚本严格来说并不是类,而是一种资源,用来告知引擎在某一内置类的基础上执行一系列初始化。
Godot 的内部类可以将一个类的数据注册进一个名为 ClassDB 的数据库,该数据库让我们可以在运行时访问类的信息。ClassDB
包含有关类的信息,例如:
属性。
方法。
常量。
信号。
当对象在执行访问属性或调用方法等操作时,它就会检查 ClassDB
中对象和对象基类的记录,以确定对象是否支持该操作。
将 Script 附加到你的对象上,可以扩展 ClassDB
中该对象的方法、属性和信号。
备注
脚本即使没有使用 extends
关键字,也会隐式地继承引擎的基础 RefCounted 类。因此,你可以从代码中实例化不使用 extends
关键字的脚本。不过由于扩展的是 RefCounted
,你是无法把它们附加到 Node 上的。
场景
场景的行为与类有很多相似之处,所以把场景看成一个类也是合理的。场景是可复用、可实例化、可继承的节点组。创建场景就类似于,有一个脚本去创建一些节点,并使用 add_child()
将它们添加为子节点。
我们经常为场景搭配一个带有脚本的根节点,并在脚本中使用这个场景下的节点。在这种情况下,脚本是通过使用命令式代码为场景添加行为来扩展场景的。
场景的内容有助于定义:
脚本可使用哪些节点。
它们是如何组织的。
它们是如何初始化的。
它们彼此之间有什么信号连接。
为什么这些对组织场景很重要?因为场景的实例都是对象。因此,许多适用于书面代码的面向对象原则也适用于场景:单一职责、封装等。
场景就是对附着在根节点上的脚本的扩展,所以你可以将其解释为类的一部分。
此系列最佳实践中所解释的大部分技术都建立在这一点上。