OSSゲームエンジン「Godot」の特徴とは〜Unity・Unrealとの比較〜


[![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/b4794894-1448-0901-fbf9-a01038046a80.png)](https://godotengine.org)

Godot Engine Logo Copyright (c) 2017 Andrea Calabró
This work is licensed under a [Creative Commons Attribution 4.0 International License (CC-BY-4.0 International)](https://creativecommons.org/licenses/by/4.0/)

# はじめに

ゲームエンジンといえば Unity
そう思っていた時期が私にもありました。

私は5年間ほど Unity を使っていましたが，最近オープンソースの「Godot」というゲームエンジンの存在を知りました．

- [Godot公式サイト](https://godotengine.org)
- [Godot Githubレポジトリ](https://github.com/godotengine/godot)

GodotのGithubは2020年12月時点でおよそ1300名のコントリビュータがいて，3万5千以上のスターが付けられています．
日本国内での知名度は低いようですがゲームコンペティションなどではそこそこ使われているようです．

GoogleTrendsでみると2014年のバージョン1.0リリース以降の検索数は増加傾向にあります．

![GoogleTrends.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/ac8064ef-3bdd-aa10-34fe-2b6ee3f93ee1.png)

本記事ではGodotの機能や，その他のゲームエンジンと比較してどのような特徴があるのかといった点を調査したいと思います．


# ゲームエンジンの比較

2大ゲームエンジン [Unity](https://unity.com) と [Unreal Engine](https://www.unrealengine.com/en-US/) と比較した表が以下になります．

|  | Godot | Unity | Unreal |
|:--|:-:|:-:|:-:|
| 名称 | Godot | Unity | Unreal Engine |
| 開発組織 | Godot Engine コミュニティ | Unity Technologies | Epic Game |
| 公式サイト | https://godotengine.org | https://unity.com | https://www.unrealengine.com/en-US/ |
| 価格 | 無料(MITライセンス) | Student:無料<br>Personal:無料<br>Plus:¥4400/mo/seat<br>Pro:¥16500/mo/seat<br>Enterprise:¥22000/mo/seat | Publishing:粗収入が100万ドルを超えたときに5%のロイヤリティ<br>Creators:無料<br>Enterprise:$1500/yr/seat<br>Custom:契約による |
| 最新バージョン | 3.2.3 | 20.2.0 | 4.26 |
| ソフトウェアサイズ※ | 75.2 MB | 5.98 GB | 28.6 GB |
| 開発言語 | GDScript<br>C#<br>Visual Scripting<br>C/C++<br>(D/Kotlin/Nim/Python/Rust) | C# | C++<br>Unreal Script |
| 対応プラットフォーム | Windows<br>Linux<br>macOS<br>BSD | Windows<br>Mac OSX<br>Ubuntu<br>CentOS | Windows<br>Linux<br>Mac OSX |
| 日本語対応 | ○ | ○ | ○ |
| サポートするバージョン管理サービス | Git<br>Subversion<br>Mercurial<br>PlasticSCM<br>Perforce | PlasticSCM<br>Perforce | Git<br>Subversion<br>PlasticSCM<br>Perforce |
| アセット | [Asset Library](https://godotengine.org/asset-library/asset) | [Asset Store](https://assetstore.unity.com/?locale=ja-JP) | [Market Place](https://www.unrealengine.com/marketplace/ja/store) |

※ソフトウェアサイズはMacbook上にアプリを展開した時のサイズとしています

GodotはMITライセンスのOSSなので，無料である点が嬉しいですが，個人利用の範囲ではUnityもUnreal Engineも無料で全機能使えるので大きなメリットにはならなさそうです(企業レベルで見ると非常に大きなメリットですが...)
ソフトウェアサイズは圧倒的にGodotが小さく，軽快に動作する点は嬉しいですね．USBメモリに入れたまま動作させることもできるようです．
後述しますが，開発言語の多さも優位な点でしょうか．GDScriptというのはPythonのような文法を持つGodot独自の言語となっています．また，Visual ScriptingはGUIベースのプログラミング言語でありプログラミング経験のない人でも開発ができるようになっています．

以下の表はデプロイできるプラットフォームの比較になります．
Godotではライセンスの関係からコンソール機へのデプロイは外部の会社へ依頼する必要があります．これはGodotがOSSなので仕方ないですね．諦めましょう．
デスクトップ・モバイル・ウェブに関してはどれも大きな違いはなさそうです．

AR/VRに関しては私自身あまり使ったことがないのですが，さすがUnityといったところですね．サポート対象が圧倒的に多いです．

|  | Godot | Unity | Unreal |
|:-:|:-:|:-:|:-:|
| デスクトップ | Windows<br>Linux<br>macOS<br>UWP<br>BSD | Windows<br>Linux<br>macOS<br>UWP | Windows<br>Linux<br>Mac OSX<br>Steam OS |
| モバイル | iOS<br>Android | iOS<br>Android | iOS<br>Android |
| ウェブ | HTML5&amp;WebAssembly | WebGL<br>Unity Web Player | HTML5 |
| コンソール※ | Nintendo Switch<br>PlayStation4<br>Xbox One | Nintendo Switch<br>PlayStation4<br>PlayStation5<br>Xbox One<br>Xbox Series X&#124;S | Nintendo Switch<br>PlayStation4<br>PlayStation5<br>Xbox One<br>Xbox Series X |
| VR/ARデバイス | HTC Vive<br>Valve Index<br>Oculus Rift,Go,Quest<br>Microsoft Headsets | Oculus Rift,Go<br>Windows Mixed Reality<br>Microsoft HoloLens<br>magic leap<br>Gear VR<br>Vive<br>Daydream | Oculus Quest,Rift,Rift S,Go<br>SteamVR<br>Windows Mixed Reality<br>Gear VR<br>Daydream |
| VR/AR SDK | OpenVR<br>OpenXR<br>Oculus SDKs | Open VR<br>Open XR<br>Google VR<br>Vuforia<br>Windows Mixed Reality<br>ARCore<br>Oculus SDKs (for Unity) | ARkit<br>ARCore<br>Google VR<br>Windows Mixed Reality |


※ Godotによるコンソール機へのデプロイは，ライセンスの関係から代理店へ依頼する必要があります


# Godotの特徴
ここではGodotの特徴を見ていきます．

## 独自言語 GDScript
GodotにはGDScriptと呼ばれる独自言語があり，Pythonライクな言語でプログラムを記述することができます．
Pythonライクな言語ではありますがGDScript自体はC++で実装されており，Pyhtonがベースとなっているわけではありません．

[GDScript reference](https://docs.godotengine.org/en/latest/tutorials/scripting/gdscript/gdscript_basics.html)
[GDScriptの実装(Github)](https://github.com/godotengine/godot/tree/master/modules/gdscript)

GDScriptには次のような特徴があります．

- オブジェクト指向
- インペラティブ（命令型）プログラミング
- 漸進的型付け(Gradual Typing)言語
- インデントベースのシンタックス

漸近的型付けというのは一つの言語の中で動的型付けと静的型付けが混在しているものになります．
これにより言語に柔軟性を持たせています．

GDScriptはPyhtonライクな文法を持ちつつも，Pythonではないので細かい点で違いはいろいろあります．Pythonに慣れている人からすると逆に面倒に感じるかもしれません．

例えばクラスは以下のように`宣言`することで作成できます．

```python:クラスの作成
# class definition:
class_name MyClass

# Inheritance:
extends BaseClass
```

変数には辞書型や配列，列挙型，ベクター型，型付き変数などを使うことができます．

```python:変数の宣言
# Member variables.
var a = 5
var s = "Hello"
var arr = [1, 2, 3]
var dict = {"key": "value", 2: 3}
var typed_var: int
var inferred_type := "String"

# Constants.
const ANSWER = 42
const THE_NAME = "Charly"

# Enums.
enum {UNIT_NEUTRAL, UNIT_ENEMY, UNIT_ALLY}
enum Named {THING_1, THING_2, ANOTHER_THING = -1}

# Built-in vector types.
var v2 = Vector2(1, 2)
var v3 = Vector3(1, 2, 3)
```

文法は似ていますが，関数の作成もPythonとは少し異なっていますね．
`func`というキーワードを使うようです．

```python:関数の作成
func max(param1, param2):
    if param1 < param2:
        return param2
    else:
        return param1
```

下図のようにGDScriptのエディタはGodotに内蔵されているので，わざわざウィンドウを切り替える必要がないというところもちょっと便利だったりしますね．

![スクリーンショット 2020-12-19 10.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/8498920a-ab67-4505-676d-2433043753b5.png)


## 言語バインディング GDNative
GodotではGDNativeと呼ばれる方法により様々な言語でプログラミングすることができます．
公式にはCとC++をサポートしていますがコミュニティのサードパーティ製ツールにより以下のような言語に対応しています．

- [C/C++](https://docs.godotengine.org/en/latest/tutorials/scripting/gdnative/gdnative_cpp_example.html#doc-gdnative-cpp-example)
- [D](https://github.com/godot-d/godot-d)
- [Kotlin](https://github.com/utopia-rise/godot-kotlin)
- [Nim](https://github.com/pragmagic/godot-nim)
- [Python](https://github.com/touilleMan/godot-python)
- [Rust](https://github.com/godot-rust/godot-rust)

GDNativeはGodotを再コンパイルする必要がないため，Asset Library等を通してアドオンとして容易に配布することができます．

## C++のカスタムモジュール
GodotではC/C++で記述された外部モジュールの追加と，モジュールの有効化/無効化ができるようになっています．
この機能は以下の用途で使用されます．
ちなみにGodot自体もC++で実装されています．

> - 外部ライブラリの追加
> - ゲームの部分的な最適化
> - 新機能の追加
> - 既存ゲームをGodotへ移植
> - C++によるゲームの実装<br>
> 参考：[Custom modules in C++](https://docs.godotengine.org/en/latest/development/cpp/custom_modules_in_cpp.html)

また，モジュールの追加方法も簡単で，以下の6つのファイルを用意し，Godotをコンパイルするだけです．

```
+ godot/modules/mymodule
  - hogehoge.h           // 自作モジュールのヘッダファイル
  - hogehoge.cpp         // 自作モジュールのソースファイル
  - register_types.h     // モジュールの登録に必要なファイル
  - register_types.cpp   // モジュールの登録に必要なファイル
  - config.py            // モジュールのconfigファイル(有効化無効化などを制御)
  - SCsub                // モジュールをビルドするためのSCons用ファイル
```

GDNativeとC++モジュールには以下のような違いがあります．

- C++モジュールはGodotのコンパイルが必要
- GDNativeはC/C++以外の言語も使用可能
- コンパイルしたGDNativeはエディタでもエクスポートしたプロジェクトでも使用可能

上記の違いを見る限り，GDNativeを使用した方が良さそうにも思えますがC++モジュールには以下のような利点があります．

- GDNativeではGodotで公開されているAPIしかアクセスできないが，C++モジュールはGodot全体のソースコードへアクセス可能
- C++モジュールはすべてのプラットフォームでサポートされるが，GDNativeはHTML5とUWPでサポートされない
- C++モジュールはGDNativeよりも高速に動作する


# Godotの機能

## RigidBodyとCollider

ゲームエンジンでは欠かせない物理演算と衝突に関わるコンポーネントであるRigidBodyとColliderですが，Godotでは2D・３Dそれぞれで以下のものが準備されています．

2Dの場合，物理演算と衝突判定に使えるクラスは以下の４つとなっています[(参考)](https://docs.godotengine.org/ja/stable/tutorials/physics/physics_introduction.html)

- Area2D          :オブジェクトの重なりを検知
- StaticBody2D    :静的オブジェクトの衝突検知
- RigidBody2D     :動的オブジェクトの物理演算と衝突検知
- KinematicBody2D :衝突判定のみ検知

2Dオブジェクトは，そのオブジェクトが所属するレイヤーを決めることができるため，特定のオブジェクトとの衝突判定は行わないといった設定も可能です．

3Dの場合は2Dの場合とは異なり，物理演算に使用されるクラスは RigidBody 1つになります．
衝突判定に関しては以下の4つのプリミティブ形状が用意されています．
複雑な形状のメッシュに関してはConvex形状のメッシュに変換すると衝突判定ができるようです．この点はUnityと同じですね．

- BoxShape
- SphereShape
- CapsuleShape
- CylinderShape

また，RigidBodyだけでなく`SoftBody`というクラスも用意されているようです．
SoftBodyは変形可能なオブジェクトの動きや，形状の変化などをシミュレートすることができ，例えば布などの動きをシミュレートすることができます．

下の画像は公式サイトのものですが，ここではマントにSoftBodyを使用した例が挙げられています．

![softbody_cloak_subdivide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/8a78fe62-b26d-34d2-8c3a-4d59c4fc776e.png)
出典:[SoftBody](https://docs.godotengine.org/ja/stable/tutorials/physics/soft_body.html)

## Raycast
GodotではRayまたはカスタム形状のオブジェクトを投影して，他のオブジェクトのヒット情報を得ることができます．
もちろんUnityなどにも備わっている機能ではあります．

Raycastには以下の２つのクラスが用意されており，2D・3Dの両方で使用することができます．

- RayCast
- RayCast2D


## NavigationMesh
経路探索等を自動で行ってくれるNavigationMeshの機能．
これもゲームエンジンでは欲しい機能ですが，Godotにもありました．

- Navigation
- Navigation2D

の2つがあるようで，それぞれ2D・3D空間における経路探索をしてくれるようです．
2Dでも使えるんだ！と思ったらUnityにも2Dの経路探索機能が1年ほど前に追加されていたのですね...


# ロードマップ
GodotのロードマップはGithub上に公開されており，今後どのような機能が追加される予定なのかということがわかります．

[Godot Roadmap](https://github.com/godotengine/godot-roadmap)

2021年にリリースが見込まれているGodot 4.0では以下のようなアップデートがされるようです．

- GDScriptのアップデート
- グラフィックスAPI「Vulkan」のサポート
- 新しいlightmapperの追加
- シェーダーの機能追加

Godot には改善要望を管理するGitレポジトリも存在しており，issueとして改善要望を出すことができます．
2020年12月時点でおよそ1400のissueがオープンとなっており，およそ600のisuueがクローズされています．
クローズされたほとんどのissueは要望が受け入れられ`Achieved`となっており，コミュニティの活性度の高さが窺えます．

[Godot Improvement Proposals](https://github.com/godotengine/godot-proposals)

また2020年12月に Facebook Reality Lab からサポートを受けることを発表しているのでAR/VR関連の機能や性能の向上は期待できそうです．

[Godot Engine receiving support funded by Facebook Reality Labs](https://godotengine.org/article/godot-engine-receiving-support-funded-facebook-reality-labs)

# おわりに

本記事では，OSSのゲームエンジン「Godot」の機能紹介と Unity および Unreal Engine との比較を行いました．
Unity や Unreal Engine と比べると軽量でポータブルな点や，比較的容易に機能拡張できるという点が魅力でしょうか．
また，Pythonライクな言語で実装できるということでプログラミング初心者などには比較的とっつきやすいゲームエンジンではないかと思います．
ライセンスの関係から，OSSであるGodotにコンソールゲームへのデプロイ機能は今後も追加されることはないでしょう．

Unity や Unreal Engine と比べると少し機能が物足りない気もしますが，VR/AR関連では今後ある程度は使われていきそうな予感がします．
今回調査をしてみて Unity から Godot へ変えよう！とは思いませんでしたが，今後の動向には注目しておきたいと思います．

# 参考資料

https://unity.com
https://www.unrealengine.com/ja/
https://godotengine.org/features