61
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-20

logo.png

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)

はじめに

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

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

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

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

GoogleTrends.png

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

ゲームエンジンの比較

2大ゲームエンジン UnityUnreal Engine と比較した表が以下になります.

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:無料
Personal:無料
Plus:¥4400/mo/seat
Pro:¥16500/mo/seat
Enterprise:¥22000/mo/seat
Publishing:粗収入が100万ドルを超えたときに5%のロイヤリティ
Creators:無料
Enterprise:$1500/yr/seat
Custom:契約による
最新バージョン 3.2.3 20.2.0 4.26
ソフトウェアサイズ※ 75.2 MB 5.98 GB 28.6 GB
開発言語 GDScript
C#
Visual Scripting
C/C++
(D/Kotlin/Nim/Python/Rust)
C# C++
Unreal Script
対応プラットフォーム Windows
Linux
macOS
BSD
Windows
Mac OSX
Ubuntu
CentOS
Windows
Linux
Mac OSX
日本語対応
サポートするバージョン管理サービス Git
Subversion
Mercurial
PlasticSCM
Perforce
PlasticSCM
Perforce
Git
Subversion
PlasticSCM
Perforce
アセット Asset Library Asset Store Market Place

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

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

Godotの特徴

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

独自言語 GDScript

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

GDScript reference
GDScriptの実装(Github)

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

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

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

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

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

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

# Inheritance:
extends BaseClass

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

変数の宣言
# 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というキーワードを使うようです.

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

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

スクリーンショット 2020-12-19 10.57.20.png

言語バインディング GDNative

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

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

C++のカスタムモジュール

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

  • 外部ライブラリの追加
  • ゲームの部分的な最適化
  • 新機能の追加
  • 既存ゲームをGodotへ移植
  • C++によるゲームの実装

    参考:Custom modules in C++

また,モジュールの追加方法も簡単で,以下の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・3Dそれぞれで以下のものが準備されています.

2Dの場合,物理演算と衝突判定に使えるクラスは以下の4つとなっています(参考)

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

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

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

  • BoxShape
  • SphereShape
  • CapsuleShape
  • CylinderShape

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

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

softbody_cloak_subdivide.png
出典:SoftBody

Raycast

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

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

  • RayCast
  • RayCast2D

NavigationMesh

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

  • Navigation
  • Navigation2D

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

ロードマップ

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

Godot Roadmap

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

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

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

Godot Improvement Proposals

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

Godot Engine receiving support funded by 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

61
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?