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