前言

由于Unity即将要收安装税,所以想着是否有什么替代品。正巧看到了开源的游戏引擎Godot,这就来看看到底能不能作为Unity的替代。

支持能力

  • Godot是使用C++编写的,没有使用STL、没有使用异常、没有使用RTTI
  • Godot 支持以下平台的Editor:Win、MacOS、Linux、Android、Web
    • 作为对比,Unity仅支持Win、MacOS、Linux,且无法支持ARM架构
  • 支持将游戏导出为以下平台:Win、MacOS、Linux、Android、iOS、Web
    • Unity还支持导出为主机平台
  • Godot支持GDScript(一种Godot自定义的脚本语言,类似Lua/Python)、C#。
    • 通过使用 GDExtension,可以运行其他编程语言(C/C++/Rust等)导出的共享库。
    • C# 暂时无法在Android、iOS、Web平台上运行
    • 2023/11/02 更新:Godot 4.2 的 C# 项目支持 Android 和 iOS 了
  • Godot使用的图形API是Vulkan/OpenGL
  • 官方的构建系统是Scons,支持禁用不需要的功能以降低打包大小
  • 面向数据的设计
  • 支持图形化编程:GDVisual(4.0移除,后续可能会加回来)
  • 缺少3D模型的编辑支持,但是支持从Blender导入场景素材

构建系统

官方将它们的构建称之为导出(Export),将当前工程导出后,会生成一个当前工程所有素材打好的素材包。默认情况下,导出得到的是一个PCK文件,当然也可以指定为ZIP文件。

导出的这些文件是经过优化和编译过的素材。例如,图片会转换为ctex格式,音频则是ogg格式,字体则是fontdata格式等。需要注意的是,GDScript不会被编译,它是以原样放置在导出包中的。导出包可以设置加密,这样就不用担心用户直接解包。

如果是构建C#项目,除了上面所述的PCK文件外,还会生成一个名为 data_[ProjectName]_[arch] 的文件夹,用于存放.net的运行时和编译后的C#脚本。

Godot的构建实际上就是将工程编译优化后打成一个素材包,然后附上Godot引擎本体(称为导出模板),最后用引擎调用这个素材包运行游戏。Windows下用于运行游戏的引擎(Runtime)大小约为67MB,是编辑器大小(117MB)的一半。不过如果你启用了C#,那么.Net的运行时还需要72MB。

基础架构与Unity的异同

  • 在Godot中,场景(Scene)是一棵多叉树,其中的每个子树都可以当作一个新的场景,并在其他场景中引用。Godot的场景其实就相当于Unity中的Prefab。
  • Unity中的场景是由物体(GameObject)组成的树,而在Godot中则是由节点(Node)组成的树
  • 在Unity中,一个物体能够添加多个组件(Component),而在Godot中,一个节点只能绑定一个脚本。
    • 如果在Godot中想要为一个节点绑定多个脚本,则要么为这个节点插入一个新的父节点,要么将这个节点拆分为多个子节点。
  • Unity会自动序列化所有公共字段,并且也能序列化指定导出字段;Godot则需要手动指定导出(export)字段序列化([Export] Attribute)
  • Godot使用了信号(Signal)的概念传递事件。
  • 渲染层级写死了只有20层,物理/导航层级有32层。但是好像也够用了。

编程ABI

  • 将一个脚本关联到某个节点上,实际上是新建了一个类并继承了原有节点的类,最后将这个类设为节点的类。
  • 关联的脚本的类名必须与文件名相同
  • 脚本修改由需要手动重新编译才能在Inspector里面找到
  • Godot的信号与Qt的信号非常类似,
    • 都是通过connect方法连接信号与方法(C#中可以使用 += 关键字连接事件)
    • 并使用emit方法触发对应信号。(C#中是EmitSignal,并且在自定义信号上需要添加[Signal]Attribute)

结论

当前(4.1)版本的Godot可以用于制作一些快速的2D小游戏。由于大部分游戏从业者都是使用C#作为主力编程语言,但是当前版本C#无法编译到非桌面平台,故暂时不推荐使用此引擎开发手游。

由于此引擎缺乏3D模型编辑能力,故需要与Blender配合使用。暂时不推荐大型3D游戏使用此引擎制作。

如果是从Unity转换到Godot,可能需要习惯Godot中的场景组织方式,并改变制作场景的思路。

参考文献

分类: 未分类

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注