从Unity到Godot引擎

本指南从Unity用户的角度概述了Godot引擎,旨在帮助您将现有的Unity体验迁移到Godot世界。

注解

本文讨论旧版本的Unity。可嵌套预制件(“嵌套预制件”)添加到Unity 2018.3中。可嵌套的预制件类似于Godot的场景,允许更像Godot的场景组织方法。

差异

团结

Godot

许可

专有、封闭、免费的许可证,有收入上限和使用限制

麻省理工学院许可证,免费且完全开源,无任何限制

操作系统(编辑器)

Windows、MacOS、Linux(非官方和不支持)

Windows、MacOS、x11(Linux, * BSD)

OS(导出)

  • 桌面: Windows、MacOS、Linux

  • 移动电话: Android、iOS、Windows Phone、Tizen

  • Web: Webassembly或asm.js

  • 控制台: PS4、PS VITA、Xbox One、Xbox 360、WII U、任天堂3DS

  • VR: Oculus Rift、SteamVR、Google硬纸板、PlayStation VR、Gear VR、HoloLens

  • TV: 安卓电视、三星智能电视、TVOS

  • 桌面: Windows、MacOS、x11

  • 移动电话: 安卓,iOS

  • Web: WebAssembly

  • 慰问:Godot中的控制台支架

  • VR: 奥库卢斯裂谷,蒸汽

场景系统

  • 组件/场景(游戏对象>组件)

  • 前言

Scene tree and nodes ,允许嵌套和/或继承其他场景

第三方工具

Visual Studio或VS代码

显著优势

  • 庞大的社区

  • 大型资产存储

编辑

Godot引擎提供了一个功能丰富的编辑器,允许您构建游戏。下面的图片显示两个编辑器的默认布局,并带有彩色块以指示常见功能。

../../_images/unity-gui-overlay.png ../../_images/godot-gui-overlay.png

虽然两个编辑看起来都很相似,但表面之下有很多不同。两者都允许您使用文件系统来组织项目,但是Godot的方法更简单,只需一个配置文件、最少的文本格式,而且没有元数据。这使得Godot对VCS系统更加友好,如Git、Subversion或Mercurial。

Godot的场景面板类似于Unity的层次面板,但由于每个节点都有一个特定的功能,因此Godot使用的方法更具视觉描述性。一目了然地了解一个场景的作用更容易。

godot中的inspector是最小的,它只显示属性。因此,对象可以向用户公开更有用的参数,而不必隐藏语言API中的功能。另外,Godot还允许可视化地设置这些属性的动画。在不需要编写代码的情况下,可以实时更改颜色、纹理、枚举甚至资源链接。

屏幕顶部的工具栏在两个编辑器中都很相似,提供了对项目播放的控制。godot中的项目在单独的窗口中运行,而不是在编辑器中运行(但是树和对象仍然可以在调试器窗口中进行浏览)。

这种方法的缺点是,在Godot中,不能从不同的角度探索跑步游戏(尽管这在未来可能会得到支持,并且在跑步游戏中显示碰撞小装置已经是可能的),但作为交换,它有几个优点:

  • 运行项目并关闭它很快(Unity必须保存、运行项目、关闭项目,然后重新加载以前的状态)。

  • 实时编辑更有用,因为对编辑器所做的更改会在游戏中立即生效,并且在游戏关闭时不会丢失(也不必同步)。这允许出色的工作流,比如在播放时创建级别。

  • 编辑器更稳定,因为游戏运行在一个单独的过程中。

最后,Godot的顶部工具栏包含一个用于远程调试的菜单。这些选项允许部署到设备(通过HTML5连接的电话、平板电脑或浏览器),并允许在导出游戏后对其进行调试/实时编辑。

场景系统

这是Unity和Godot之间最重要的区别,也是大多数Godot用户最喜欢的功能。

在统一的“级别”上工作通常意味着将所有必需的资产嵌入到场景中,并将它们与组件和脚本链接在一起。

Godot的场景系统表面上类似于统一。“级别”由一组节点组成,每个节点都有自己的用途:sprite、mesh、light等。但是,在godot中,节点排列在树中。每个节点可以有多个子节点,使每个子节点成为主场景的子场景。这意味着您可以用存储在不同文件中的不同场景组成整个场景。

例如,考虑平台级别。您可以用多个元素组合它:

  • 硬币

  • 球员

  • 敌人

在Unity中,你将把所有的游戏对象放在场景中:玩家,多个敌人的实例,到处都是砖块以形成关卡的地面,然后在关卡上放置多个硬币的实例。然后,您将向每个元素添加不同的组件以链接它们并在级别中添加逻辑:例如,您将向场景的所有元素添加一个boxCollider2d,以便它们可以碰撞。这一原则在Godot是不同的。

在Godot中,您可以将整个场景分成三个单独的、较小的场景,并在主场景中进行实例说明。

  1. 一个只适合玩家的场景。

将播放器视为我们希望在不同父场景(例如“级别”场景)中使用的元素。在我们的例子中,player元素至少需要一个动画sprite节点。此节点包含各种动画(例如,行走动画)所需的sprite纹理。

  1. 敌人的一幕。

敌人也是我们想在几个场景中使用的元素。它几乎与播放器节点相同。唯一的区别是脚本(它需要“ai”例程来生成敌人的行为)和动画sprite节点使用的sprite纹理。

  1. 水平场景。

水平场景由砖块(用于平台)、硬币(用于玩家收集)和敌人场景的多个实例组成。每个实例都是级别场景树中的一个节点。这些实例是单独的敌人,最初它们具有在敌人场景中定义的共享行为和外观。您可以为每个敌人节点设置不同的属性(例如更改其颜色)。

4。 主要场景。 主场景将由一个根节点和两个子节点组成:一个播放器实例节点和一个级别实例节点。根节点可以是任何类型,通常是“根”类型,例如“节点”是最全局的类型,或者“节点2d”(所有二维相关节点的根类型)、“空间”(所有三维相关节点的根类型)或“控制”(所有GUI相关节点的根类型)。

如你所见,每一个场景都被组织成一棵树。节点的属性也一样:不 add 节点的碰撞组件,使其像Unity一样可碰撞。相反,将此节点设置为 小孩 具有冲突属性的新特定节点的。godot具有各种碰撞类型的节点,具体取决于使用情况(请参见 Physics introduction

  • 这个系统有什么优点?这个系统不会增加场景树的深度吗?Unity是否已经允许您将游戏对象放入空的游戏对象中来组织它们?

    • Godot的系统更接近于众所周知的面向对象范式:Godot提供了许多不清楚是“游戏对象”的节点,但它们为自己的孩子提供了自己的能力:这就是继承。

    • Godot允许提取场景的子树,使其成为自己的场景。因此,如果场景树太深,可以将其拆分为较小的子树。这对于可重用性更好,因为您可以将任何子树作为任何节点的子树。将多个游戏对象放入Unity中的空游戏对象并不能提供相同的功能。

项目组织

../../_images/unity-project-organization-example.png

没有完美的项目架构。任何建筑都可以在统一和Godot中工作。

但是,Unity项目的一个常见架构是在根目录中有一个包含各种文件夹的资产文件夹,每种资产类型一个:音频、图形、模型、材料、脚本、场景等等。

由于godot允许将场景拆分为更小的场景,每个场景和子场景都作为项目中的一个文件存在,因此我们建议您对项目进行稍微不同的组织。此wiki为此提供了一个网页: 项目组织 .

我的前言在哪里?

Unity提供的预制是场景的“模板”元素。它是可重用的,并且场景中存在的每个preab实例都有自己的存在,但所有这些实例都具有与preab定义的相同的属性。

Godot不提供这样的预制件,但其场景系统提供相同的功能:场景系统被组织为一棵树。godot允许您将场景的任何子树保存为场景文件。然后,可以将这个新场景作为任何节点的子级任意多次实例化。对这个新的独立场景所做的任何更改都将应用于其实例。但是,对实例所做的任何更改都不会对“模板”场景产生任何影响。

../../_images/save-branch-as-scene.png

准确地说,您可以在Inspector面板中修改实例的参数。组成此实例的节点最初被锁定。如果需要,可以通过右键单击场景树中的实例并在菜单中选择“可编辑子对象”来解除锁定。您不需要这样做来添加 new 此节点的子节点。记住,任何新的子项都将属于实例,而不是磁盘上的“模板”场景。如果要向“模板”场景的每个实例添加新的子对象,则应将它们添加到“模板”场景中。

../../_images/editable-children.png

术语表通信

  • 游戏对象->节点

  • 添加组件->继承

  • preab->可重用场景文件

脚本:GDScript、C#和可视化脚本

设计

Unity支持C#。C#得益于它与Visual Studio的集成,并具有理想的特性,如静态类型。

Godot提供了自己的脚本语言, GDScript 以及对 Visual ScriptC# . gdscript从python借用其语法,但与之无关。如果您对自定义脚本语言的推理感到疑惑,请阅读 gdscript基础常见问题 页。GDScript与Godot api紧密相连,学习时间不长:对于一个有经验的程序员来说,一个晚上,对于一个完全初学者来说,一个星期。

Unity允许您将任意多的脚本附加到游戏对象。每个脚本向游戏对象添加一个行为:例如,您可以附加一个脚本,以便它对玩家的控件做出反应,另一个脚本控制其特定的游戏逻辑。

在godot中,每个节点只能附加一个脚本。可以使用外部gdscript文件,也可以将脚本直接包含在节点中。如果需要将多个脚本附加到一个节点,则可以考虑两种解决方案,具体取决于场景和要实现的目标:

  • 在目标节点与其当前父节点之间添加新节点,然后向该新节点添加脚本。

  • 或者,您可以将目标节点拆分为多个子节点,并为每个子节点附加一个脚本。

如你所见,很容易把场景树弄得一团糟。考虑将任何复杂的场景拆分为多个较小的分支。

连接:组和信号

您可以通过脚本访问节点,并在节点上调用内置或用户定义的函数来控制节点。您还可以将节点放置在一个组中,并在该组中的所有节点上调用函数。更多信息请参见 scripting documentation .

节点可以在发生指定操作时发送信号。信号可以设置为调用任何函数。您可以定义自定义信号并指定何时触发它们。更多信息请参见 signals documentation .

脚本序列化

Unity可以通过两种方式处理脚本序列化:

  • 隐式:如果类型是可序列化类型,则类中的所有公共字段都将自动序列化。 (Dictionary 不可序列化)。

  • 显式:非公共字段可以使用 [SerializeField] 属性。

Godot也有一个内置的脚本序列化系统,但它只能显式工作。可以序列化任何可序列化类型 (built-in and various engine types 包括 数组词典 )使用 export 关键字。查看 exports documentation 有关详细信息。

Unity还具有一个名为 ScriptableObject 用于序列化自定义资产对象。它在godot中的等价物是所有资源的基类: 资源 . 创建继承的脚本 资源 将允许您创建自定义可序列化对象。可以找到有关资源的更多信息 here .

在C++中使用Godot

Godot允许您通过使用API直接在C++中开发项目,这是目前不可能的。举个例子,你可以将Godot引擎的编辑器视为使用GodotAPI编写的C++中的“游戏”。

如果您对在C++中使用Godot感兴趣,您可能希望开始阅读 Developing in C++ 页。