Godot を触ってみた

弊社では VR/AR アプリの開発には Unity を使っていますが、最近オープンソースのゲームエンジンである Godot というのが話題になっているので少し使ってみました。チュートリアルの 2D のサンプルプロジェクトを終えて 3D を少しだけ触ったので、Unity との比較や所感を述べます。

Godot エディタ

Unity と同様に、Godot は単なるライブラリとしてのゲームエンジンではなく、開発環境一式を備えています。 画面中心にゲームのプレビューとなる画面があり、左側にシーンの編集画面があります。Unity と同様に、階層構造でオブジェクトを配置していくことでシーンを構成します。

まず用語の違いがあります。Unity でいうところの Prefab はシーンと呼び、そしてシーンは Unity でいうところのシーンと同じように扱えます。この考え方は最初は少し違和感がありましたが、すぐ慣れます。

また右側にはインスペクタがあり、Unity と同様にここでオブジェクトの設定値を変更することができます。

ネイティブの UI を使っていないため、UI は独自のデザイン、挙動になっており、やや直感的ではない見た目と、OS との挙動の違いにすこしモヤっとする部分はありますが、すぐに慣れそうです。

Node

オブジェクトの作りにおいて Unity との一番の違いは、空の GameObject のようなものがなく、何かを継承したオブジェクトを作るという点です。

例えばサンプルプロジェクトにおける Player シーンは、Area2D (当たり判定のクラス) を継承したノードです。Unity のオブジェクトはすべて GameObject そのもので、アタッチされているコンポーネントの違いによって種類が異なるという作りになっています。例えばカメラのオブジェクトは、Camera コンポーネントがアタッチされた GameObject で、Cube のオブジェクトは、MeshRenderer と BoxCollider がアタッチされた GameObject です。それが Godot では、いわばカメラは Camera クラスで、Cube は MeshRenderer クラスになる、というようなことです。

この考え方は Unity に慣れていると少々柔軟性に欠けるように感じますが、スクリプトを中心に構築するものと思えばよさそうです。

GDScript

Godot は専用のスクリプト言語 GDScript を持ち、また C#, C++ が公式サポートされているほか、非公式のバインディングによって多くのプログラミング言語が使えるようになっています。C# を使えることはチーム開発に導入する点でかなりメリットがありますが、せっかくなので GDScript を使ってみました。

印象

Python 風の文法で、_ から始まるメソッド名が private 扱いになるといった書き方はやや好みではありませんが、class 宣言をしないで行頭から func _ready(): のように書けるのは非常にシンプルで、Arduino のようなフレンドリーさを感じます。新しい言語を学ばなければいけない、という感じではなく、ある程度プログラミングができる人ならあまり迷うことはなさそうです。

ノード間の連携

Unity では GetComponent<BoxCollider2D>().enabled のようにしてメソッドを使ってコンポーネントを取得するところを、Godot では $ をつけてまるで変数のように参照できる記法により、$CollisionShape2D.disabled などと記述することができます。他のコンポーネントの参照は頻出する表現なので、シンプルに書けるようになっているのは良いですね。

また、Unity では UnityEvent などを使ってコンポーネント同士を連携させますが、Godot には signal foo_event とイベントを変数のように宣言し、エディタ上で接続することができます。こちらも UnityEvent と比べてシンプルに書けますね。ただイベントの発行時には emit_signal "foo_event" のように文字列を使うので、そこはちょっと微妙な感じがします。

ベクトル演算

Vector2, Vector3 に基本的な normalizedcrossdot を備え、またスカラーとの四則演算も使え、lerp なども関数として用意してあるので、とくに不足なく自然に書きたいことが表現できそうです。

スクリプトエディタ

開発環境に組み込まれたエディタです。ブレークポイントやシンタックスハイライト、エラー表示といった必要最低限の機能は備えており、デフォルトのカラーリングもそこそこ見やすいです。

多くの開発環境が備える、変数やメソッドなどのシンボルを Cmd+クリック で宣言元にジャンプしたり、ドキュメントを表示したりという機能もあり、普通に開発することができそうです。ただ、選択やカーソル移動といった好みの分かれる操作についてはカスタマイズ性はあまり高くないようなので、本格的な開発時には外部のテキストエディタを利用したほうがよいかもしれません。

おわりに

今回は基本的な機能のみ使い、主に Unity との比較をしました。Unity はエディタそのものだけではなく、Asset Store の豊富さやユーザーの多さによるトラブルシューティングのしやすさもあって使っているので、今後は Godot のアセットライブラリを使ってみたり、AR/VR サポートについて試してみたりして、実際に業務に利用できるのか試していきたいと思います。