UnityエンジニアがGodot Engineを触ってみた

[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos)の17日目の記事です。
昨日は@MilayYadokariさんの[ShaderGraphで画像をお手軽にスクロール](https://qiita.com/MilayYadokari/items/63cea55228cb6daae40e)でした。

# はじめに
僕は主にUnityで開発しているクライアントエンジニアですが、
2023年9月にUnity社から新しい料金システムの発表がありまして、世間的には代替エンジンを模索する動きが見られました。
その中で[Godot Engine](https://godotengine.org/)というものを耳にしたのですが、Godot Engineは触ったことがなかったので触ってみました。

Unityエンジニアは以下のページを一読するとGodot Engineというのがなんとなくわかるはずです。
- [From Unity to Godot Engine
](https://docs.godotengine.org/en/3.2/getting_started/editor/unity_to_godot.html)
- [Introduction to Godot development](https://docs.godotengine.org/en/3.2/development/cpp/introduction_to_godot_development.html)


# テスト環境
以下の環境やバージョンでテストしました。
- MacBook Pro (13インチ, 2020, Thunderbolt 3ポート x 4)
    - macOS Monterey (バージョン 12.5.1)
- Godot Engine 4.2
    - https://godotengine.org/download/macos/


# ダウンロード
早速ダウンロードからしますか！
- 今後、C#で書いていきたいので .NET バージョンにします。
（.NET バージョンはつい最近リリースした？）
![Godot Engine download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/639bb9ae-2139-1ae1-17e7-2302b9e9cddb.png)
- ダウンロードした「Godot_v4.2-stable_mono_macos.universal.zip」ファイルを解凍しましょう。するとすぐに使えます。
![Godot Engine App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/99f45c57-95e0-26d3-aaaa-51e39cd8227f.png)
（アイコンかわいい）



# プロジェクトの作成
Godot Engineを起動しましょう。
- プロジェクトがないため、新規に作成します。
![Godot Engine Project Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/9cee068a-8f1e-b400-ccf7-0c59cfe4c59a.png)
- 新規プロジェクトを作成
    - レンダラーのオプションがいくつかありますね。
    - Forward+はデスクトップ向けみたいです。
![Godot Engine Project Option 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/1bea24eb-8210-4c55-5a76-fd15bc04d1bd.png)
    - モバイルオプションがなければ、昨今のゲームエンジンとしては厳しいかなと
![Godot Engine Project Option 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/c4133fa5-c772-8d82-55cd-6d787857614b.png)
    - 互換性のためのオプション。
（現在開発中）という文言から頑張っている様子が伝わりますね〜
![Godot Engine Project Option 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/b3ca6d73-c655-493d-0411-212f5674243c.png)
- 今回はForward+オプションにして、作成！
![Godot Engine Scene.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/23bc20db-6642-4494-df9c-fdfbd4885596.png)
    - 画面インタフェースを見た感じ、Unityと似ているようです。

インストールからプロジェクトの作成までできました。



# シーンの作成
メインとなるシーンから作成する必要があります。
- シーンが空の状態なので、早速作成しましょうか。
- ノードっていうのはUnityのGameObjectだと思えばいいでしょう。 
![Godot Engine Node 2D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/f0f96892-6939-efd9-a27a-8f9ca044389b.png)
     - シーンウィンドウの＋ボタン押下で出てくるリストから作成しても良いですし、
     - ルートノードを生成のリストから作成しても良いでしょう。
     - 今回は2DシーンにNode2Dを作成します。
 - 適当に名付けて保存します。
 ![Godot Engine Node 2D Save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/5a18ab50-7bd2-b139-282a-d8a59c82b169.png)

これでメインとなるシーンが作成できました。



# スクリプトの作成
- シーンウィンドウの右側にあるボタンを押すと、ノードにスクリプトをアタッチできます。
![Godot Engine Create C# Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/03e5bcf6-ed6d-9b20-9793-ac7908f3253b.png)
     - 言語は：C#
     - 継承元は：Node2D
     - テンプレートはNode：Defaultに設定
         - UnityのMonoBehaviourを継承するイメージに近いでしょう。
     - パスの名前は main にして、作成！
- Godot EngineのScriptタブから表示されます。
![Godot Engine Attached C# Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/a1cd52d5-d31e-a0e5-2082-a7ed3bdaf58e.png)
    - mainクラスはNode2Dを継承しているのがわかります。
    - _Ready()をオーバーライドしていますが、UnityのStart()に近いメソッドでしょう。
    - _Process()メソッドは、UnityのUpdate()メソッドでしょうね。
        - 似たようなメソッドが多い気がする。（楽しみ）
    - 右側のインスペクターからアタッチしているスクリプトの情報がわかります。


# スクリプトを書く
とりあえず動かしてみたいので、簡単なスクリプトを書きます。
- Godot EngineもUnity EngineのようにいろんなAPIが提供されています。
- 例えばログを出力するAPIは以下となります。
```c#
Unity
UnityEngine.Debug.Log("Hello");

Godot
GD.Print("Hello");
```
- using static ディレクティブを使用すると便利な場合があります。
    - [C# API differences to GDScript¶
](https://docs.godotengine.org/ja/4.x/tutorials/scripting/c_sharp/c_sharp_differences.html#tips)
    - この機能でやってみます！
```c#
using static Godot.GD;

public class Test
{
    static Test()
    {
        Print("Hello"); // Instead of GD.Print("Hello");
    }
}
```
- mainクラスにコードの追加
![Godot Engine Play.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/22a1116a-b317-1a6f-d2c6-8b59db4e99ff.png)
    - スクリプトを書いたら、保存します。
- 右上の[▶︎]ボタンで実行します。
    - おお！動いている〜
![Godot Engine Play Result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156003/46a38130-8a09-8224-7b90-cb982ac47642.png)
    - Hello World (DEBUG)のアプリケーションが立ち上がり、
Hello World!のログが出力されました！

これが初Godot Engineのプロジェクトでしたね。

# 最後に
Godot Engineをインストールから触ってみたところ、Unity Engineより軽い感じでした。
（Unity Engineは機能が多すぎて重たいですよね…）
Unity Engineとインタフェースも似ていたので、戸惑うこともありませんでした。
またVisual Studio Codeと連携しなくてもスクリプトエディターで書けたのが便利。
次回は実際にゲームを作りながら深掘りしたいと思います！

次は @nisei275 さんの記事です！
お楽しみに！