Unity からの移行先として Godot Engineを試してみた

# Unity 以外の選択肢

私はRPGツクール系もUnityも好きなので [RPG Maker Unite](https://rpgmakerunite.com/) に期待し待っているのですが、steamでの発売がなかなか始まらない。そんななかでUnityのライセンス料金の話(※)もあり、他の選択肢も検討してみようかな、と。

※ 見直され現在は落ち着いたようですが「過去に遡って条件を変更しようとした試み」は信頼を大きく損なってしまった、と思います

[「Unity」の移行先の候補になるゲームエンジンまとめ](https://gigazine.net/news/20230914-post-unity-game-engine/) 記事などを読んで、[Godot(ゴドー)](https://ja.wikipedia.org/wiki/Godot_(%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)) Engineがライセンス的にも良さげなので、ちょっと試してみます。

# Godot(ゴドー) Engineとは

[Wikipedia](https://ja.wikipedia.org/wiki/Godot_(%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)) および以下の入門コンテンツを読んでみました。

* [Godot入門](https://docs.godotengine.org/ja/stable/getting_started/introduction/introduction_to_godot.html) (量が多いので最初だけ)
* [今から始める『Godot Engine』](https://zenn.dev/saitos/articles/lets_start_godot_engine)
* [さくさく理解する Godot 入門（ただし2Dに限る）基礎編 シーズン１【第１回】](https://tech.pjin.jp/blog/developer/godot_basic01)
* [Godot(ゴドー)のスタートアップ方法。いろんな要素を見て覚える動画](https://www.youtube.com/watch?v=U3j0fC5A00I) (動画)
* [ひょがよめさんとGodotゲーム制作チュートリアル（1/2）](https://www.youtube.com/watch?v=fk4TOzo2YbQ) (動画)

以下は気になったポイントのメモ。

* クロスプラットフォームかつオープンソース(MITライセンス)の2D/3Dゲームエンジン
* 開発環境はWindows、macOS、Linux、BSD系OS、Haikuで動作
※ IDEもGodot Engine上で作られている
* 開発対象はWindows、macOS、Linux、FreeBSD、Android、iOS、BlackBerry10、HTML5
※ PlayStation 3、PlayStation Vita、ニンテンドー3DS も一応対応？
* 開発言語はGDScript(Python系の独自スクリプト言語)、C#(Mono)
※ GDNative 経由で C++ も呼び出せるっぽい
* 2Dと3D二つのグラフィックスエンジンを「ビューポートノード」を用いて併用・統合させて用いる
* 日本語対応で [steam版](https://store.steampowered.com/app/404790/Godot_Engine/) もある

# とりあえずインストール

[Godot 公式サイト](https://godotengine.org/) を見ると、現時点ではLTS (3.5.2)版とLatest (4.1.1)版があるみたい。とりあえずsteam版をインストールしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/881885b7-29a8-85e0-a3bb-f5d9544a6945.png)
サイズは1.21GB、公式サイトのダウンロード版よりかなり大きいです。ざっくり見てみると、エクスポート時に使用する各種環境用のファイルを含んでいるからっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/d80d77cc-4289-60d2-3579-114298a0ba3c.png)
このsteam版を起動してみると、Latest (4.1.1)版でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/e72a9f94-867b-81d1-6195-8d42499dde02.png)
steam 側の設定で「ベータ」タブからブランチ選択ができるので、LTS版が良ければ stable-3.5 を選べば良い？かもですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/60a2d49b-949e-a8b8-9308-f3f8854438e1.png)
バージョン使い分けが面倒そうなのでLatest以外はダウンロード版を使うのが良いかも、です。あとダウンロード版だとC#(Mono)用のファイルが分かれているので、steam版だとMono使えないかもしれない？

とりあえずsteamデフォルトのLatest版で進めてみます。

# 新規プロジェクトを作成

とりあえず新規プロジェクトを作成してみます。プロジェクト名は「godot-sample01」とし、レンダラーは最も開発対象が多い「互換性」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/28e23bfc-c406-233d-68a1-f78ba9644384.png)

自動的に生成されたファイルは以下でした。shader_cache 配下は省略しています。

```
.gitattributes
.gitignore
icon.svg
icon.svg.import
project.godot
.godot/.gdignore
.godot/global_script_class_cache.cfg
.godot/uid_cache.bin
.godot/editor/filesystem_cache8
.godot/editor/project_metadata.cfg
.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex
.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5
.godot/shader_cache/*
```

この状態のフォルダを GitHub の [yamachan/godot-sample01](https://github.com/yamachan/godot-sample01) リポジトリに [empty-project](https://github.com/yamachan/godot-sample01/tree/empty-project) ブランチとしてあげておきます。

[project.godot](https://github.com/yamachan/godot-sample01/blob/main/project.godot) がプロジェクト管理用ですね。作成時のレンダリング選択が記載されています。あとアイコン指定もありますね。`res://` がプロジェクト内リソース指定のようです。


## .godot フォルダ

.godot フォルダは管理用と思われますが、上記リポジトリには反映されないので、簡単に中身を見てみます。

`icon.svg` ファイルは以下ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/235969c3-fe5b-b08e-0228-eade53257005.png)
`.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex` はこのSVG形式ファイルを描画して画像化したデータのようです。ヘッダ部分に RIFF WEBPPV8 の文字列がありますので [WebP コンテナ仕様](https://developers.google.com/speed/webp/docs/riff_container?hl=ja) 形式かな。

あとはエディタ設定が以下のファイルにありますね。
```:.godot/editor/project_metadata.cfg
[editor_metadata]

executable_path="D:/SteamLibrary/steamapps/common/Godot Engine/godot.windows.opt.tools.64.exe"

[debug_options]

run_live_debug=true
run_reload_scripts=true
```
これら以外には、まだたいした情報は格納されていないです。まあ、初期化しただけですからね。

# チュートリアルを実行してみる

とりあえず簡単に動かしてみたいため、公式ドキュメントのステップ・バイ・ステップにある [初めてのスクリプト作成](https://docs.godotengine.org/ja/4.x/getting_started/step_by_step/scripting_first_script.html) を実施してみます。丁寧に説明されているので、それに従い実施するだけ。以下はメモです。

`Sprite2D` をルートノードとして追加して、`icon.svg` をテクスチャに指定して中央に移動させるところ。正確に中央に移動する方法が不明だったので、まずは設定メニューからデフォルトの画面サイズを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/5bb596ec-dd68-28ea-735d-8dca1023f263.png)
画像の中央が原点になっているようなので、上記の値の半分を、`Sprite2D` のインスペクタに指定すればok。ちなみに自分で計算しなくても `1152/2` と計算式を入力すると、計算結果が設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/50db11e9-625f-e21e-89d7-a04e5e1949f7.png)
定番の Hello World を表示するところ。ドキュメントには ` _init()` 関数とありますが、生成されたスクリプトにある `_ready()` 関数に記載してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/dac9db5c-8349-9fc1-c5a0-2ac711a2b075.png)
ここまでの操作でファイルが2つ作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/f1ac928c-b27c-be34-eeee-d4c360db4f29.png)
`README.md` はGit用に別途追加したもので、GODOTとは関係ないです。`.gdignore` ファイルなど用意してみたのですが消せなかったので、とりあえず表示したまま。。
変数を宣言するところでは、オマケで `@export` を付与しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/eb3b6c68-a372-bbb6-fade-795d1ee7945c.png)
するとインスペクタで値を変更できるようになって便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/675681d5-6088-2ac2-999b-7fbd2f3b8965.png)
さて、アイコンを回転させてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/89260ff2-5047-2fc0-91e3-3265c3eee1e1.png)
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/8ded15ea-b8f5-0b5f-8499-d7dd279c2bac.gif)
うん、良い感じで回転していますね。

`_process()` 関数は定期的に呼び出され、`delta` には前回からの時間差分(秒数)が渡されるみたい。`rotation` はラジアンで、`angular_speed` にはさきほどπ(3.142)をセットしました。なので画像は1秒間に180度周り、2秒間で1回転することになります。

試しにインスペクタで `angular_speed` に -6.284 を指定した結果がこちら。逆回転で、1秒で1回転しているのがわかります。![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/13ab1a04-284e-adc9-a375-96a105a7eead.gif)

さて残り2行を足してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/a8861b24-a7b2-f1a0-cb24-75bb6f0cd0ff.png)
![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/552edd07-716e-3718-5b9d-17eb9460da75.gif)
追加したのは1秒間に400ピクセルのスピードで前進させるコートですね。基本ベクトルをアイコンと同様に回転させ、それに速度(`speed * delta`)をかけたものを、アイコンの位置情報に加えています。

画面中央から開始したので、ちょっと右に寄っていますが、まあ良しとしましょう。

この状態を [script-sample1](https://github.com/yamachan/godot-sample01/tree/script-sample1) ブランチにしておきました。[差分](https://github.com/yamachan/godot-sample01/compare/empty-project...script-sample1) がわかりやすいとおもいます。

# というわけで

簡単なチュートリアルを実施してみたメモは以上です。

根っこの思想や、GDScript など言語環境は異なりますが、エディタ画面などが Unity に近く、馴染みやすく使いやすい開発環境であるな、という印象です。

Unity からの移行先として、もう少し触ってみようかとおもいます。それではまた！