(本文搬运自以前的文章)

每款游戏引擎都有不同定位、满足不同的需求。这不仅因为它们所提供的功能不同,更在于每款引擎独特的设计。这些引擎背后各自的设计哲学,会给游戏带来不同的开发流程和开发方式。

 

面向对象设计 

 

Godot奉行面向对象设计,并以之为核心,构建出了灵活的场景系统和节点层级机制。它尝试为你的游戏项目提供一种直观的结构组织方式,这种方式甚至背离了严格的编程模式。(注:有点Visual Basic的感觉)

 

举个例子,Godot支持场景的合成或叫聚合。就像嵌套式的Prefab:创建一个“信号灯”场景文件,以及一个引用了这个“信号光灯”的“破灯塔”场景文件;然后,创建一个由“破灯塔”填充的“城市”场景文件。如果修改了“信号灯”的颜色,保存这个“信号灯”场景文件,“城市”中的所有“破灯塔”效果也会实时更新。

 

Godot中的场景可以是游戏所需的任意资源:武器、角色、道具、门、关卡、关卡的部分等等…像纯代码方式中的“类”的概念,但在Godot中不仅可以通过纯代码方式进行设计,也可以自由的通过Godot编辑器进行设计,并且还可以混用。

 

除此之外,可以继承任意的场景资源。与其它3D引擎中的Prefab不同,在Godot中场景可以被继承和扩展(注:参考面向对象编程中的类继承概念)。比如,可以通过继承“角色”来创建一个“魔法师”。在编辑器中修改“角色”也会更新“魔法师”。这种机制有助于根据游戏的设定来定义合理的结构。

 

Godot提供了很多不同类型的对象-节点(Node),每个节点都有特定用途。节点是“树”上的一部分,且他们的父类都可以追溯到“Node”类。引擎中的碰撞检测图形组件则只是特例。

 

Sprite 的继承关系依次是 Node2D、 CanvasItem 及 Node,并拥有所有父类的属性和方法,如 变形 或 绘制自定义形状及用自定义着色器渲染。

整套解决方案

 

Godot 尽量内置多数常规需求的工具。比如现在有了专门的脚本工作区、动画编辑器、地图编辑器、着色器编辑器、调试器、性能分析器、本机热更及远程设备热更特性等。

 

Godot的目标是提供用于创建游戏的完整工具包和连贯的用户体验。同时,也可以与外部程序通过已有导入插件进行协作,或者自己创建相应导入插件。

 

这也是Godot提供自己的编程语言GDScript及VisualScript、以及支持C#语言的部分原因。这些语言被紧密整合在Godot引擎和编辑器中,用于满足游戏开发者和设计者的需求。

 

通过 GDscript 可以编写类似 Python 语法的简洁代码,它支持类型检测,并能达到类似静态类型语言的代码自动完成效果。同时,它也会通过内置的Vector和Color等数据类型优化游戏场景的代码。

通过 GDNative 环境,则可以用C、C++、Rust、CPython等编译型语言编写高性能代码,而且不需要重新编译整个引擎。

 

VisualScript 是编辑器中集成的一款基于节点的编程语言。可以通过拖拽节点或资源到场景图中创建出新的代码块。

 

3D工作区目前提供的工具不如2D工作区那么丰富,还需要使用外部程序或者插件来编辑地形、复杂角色等。Godot提供了完整的API用于扩展编辑器的功能。

 

(状态机编辑器插件,可视化的方式管理状态机)

开源

Godot基于MIT许可证开放所有代码,意味着相关所有技术都是免费的/自由的。

 

任何人都可以在自己的项目中编写所需的合适的插件,不需要和引擎一道发布,比如Google AdMob、FMOD。

 

另外,开放源代码意味着你可以学习Godot引擎并按你所需扩展。Godot会打印出包含引擎在内的带栈跟踪信息的错误,所以可以很简单的调试错误。

 

社区驱动

Godot 由社区创建、也是为社区及所有游戏创作者服务。通过用户需求及开放讨论来驱动Godot核心功能升级。核心开发者对于新特性的讨论经常也是集中在是否有利于多数用户上。

 

尽管有少量核心开发者是全职状态,但截止当前我们这个项目已有超过600名贡献者。这些善良的开发者开发的是他们自己可能需要的功能特性,所以在每个主版本中你都能看到引擎各方面的改进。

 

Godot编辑器本身就是一款”游戏”

Godot编辑器本身就是基于Godot游戏引擎运行。它使用了引擎自带的UI系统,并且能在测试项目时“热重载”代码及场景、在编辑器中直接运行游戏代码。这意味着在你自己的游戏中可以使用同样的代码和场景、或者构建插件来扩展Godot编辑器。

 

由此带来了可靠的、灵活的UI系统,因为它首先要驱动Godot编辑器自身。

 

 

RPG in a Box

 

在任意GDScript文件的头部加上 tool 关键字,它就会在编辑器中运行。这样就可以编写如自定义关卡编辑器之类的插件了,或者用同样的节点与API创建项目脚本。

 

分离的2D/3D引擎

 

Godot 分别提供了专门的2D和3D渲染引擎,2D场景的基本单位是像素。

 

尽管引擎是分离的,但可以在3D中渲染2D,也可以在2D中渲染3D,以及在3D世界中叠加2D的精灵和界面。

 

原文:https://docs.godotengine.org/en/stable/getting_started/introduction/godot_design_philosophy.html