【Godot4.x】C#の開発環境を作る手順

まずは以下のリンクからGodotの公式ページに移動。

godotengine.org

このページにあるGodotのダウンロードリンクはクリックせずに、右上にある「ダウンロード」を選択。

私の環境は macOSなので以下の表示となります。ここから "Godot Engine - .NET" で ".NET"バージョンをダウンロード。

ダウンロードした実行ファイルをアプリケーションフォルダにドラッグ&ドロップして移動。Windowsの場合は Cドライブ直下に "Tools" フォルダなど作っておいて移動しておくのが良いかもしれません。

ただそのまま Godot_mono.app を実行しても ".NETランタイムがない" というエラーとなります。

Godot_mono.app をダウンロードしたページを下にスクロールすると、"Requirements" の項目があるのでそこから ".NET SDK" のリンクをクリック。

".NET SDKのダウンロード" をクリック。

ダウンロードしたパッケージファイルを実行して .NET SDKをインストール。

再び Godot_mono.app を実行してエラーなく実行できることを確認します。

プロジェクトの作成と実行

環境構築はここまでで完了ですが、実際にC#を使ったプロジェクトを作れるかどうか試してみます。 「+作成」をクリックして、プロジェクト名を入力。「参照」ボタンでフォルダを指定して、「作成」で作成実行。

プロジェクトが作成できたら、「2Dシーン」をクリックしてルートノードを作成。

ノードの名前を「Main」に変更。

[CTRL+S] (or [Cmd+S])で、現在のシーンを保存。

スクリプトアイコンをクリックして、現在のシーンにスクリプトをアタッチ。

言語を「GDScript」ではなく「C#」にして「作成」。

スクリプトは以下のように入力。

using Godot;
using System;

public partial class Main : Node2D
{
    public override void _Ready()
    {
        GD.Print("Hello!");
    }

    public override void _Process(double delta)
    {
    }
}

なお、Godotエンジンで C#スクリプトを扱う場合、Godotエディタ上でのコード補完の恩恵は得られないので、別途VSCodeなどを使うことになりそうです。

では右上の▶ボタンをクリックして実行。

メインシーンが定義されていないので「現在のものを選択」で実行。

特にエラーがなければ、以下が出力の表示され実行できました。

Godot Engine v4.5.1.stable.mono.official.f62fdbde1 - https://godotengine.org
Metal 3.2 - Forward+ - Using Device #0: Apple - Apple M1 (Apple7)

Hello!

C#でエラーになりやすいポイント

ファイル名とクラス名は一致している必要がある

例えばファイル名が "Main.cs" の場合、コード上のクラス名は "public partial class Main" というように名前が一致していないとエラーになるとのことです。

lef237.hatenablog.com

例えば先程のコードでクラス名が "Main" となっている部分を別の名前にすると、以下のエラーとなりました。

E 0:00:00:466 can_instantiate: Cannot instantiate C# script because the associated class could not be found. Script: 'res://Main.cs'. Make sure the script exists and contains a class definition with a name that matches the filename of the script exactly (it's case-sensitive).

<C++ エラー> Method/function failed. Returning: false <C++ ソース> modules/mono/csharp_script.cpp:2360 @ can_instantiate()

クラス名に気をつける

C#スクリプト名がそのままクラス名となるため、gdscriptよりも名前の付け方に注意する必要があります。 例えば "Godot" という名前は予約されているためスクリプト名(=クラス名) に "Godot" というクラス名は指定できません。

using Godot;
using System;

public partial class Godot : Node2D // ←エラーとなるクラス名.
{

オブジェクトの構造体プロパティには直接代入できない

gdscriptであれば position構造体プロパティに値を直接できましたが、C#の場合は以下の記述はできません。

   public override void _Process(double delta)
    {
        Position.X += 100 * delta;
    }

プロパティを書き換えるには一度ローカル変数にコピーしてから書き換える必要があります。またC#では floatとdoubleの違いも意識する必要があります。

   public override void _Process(double delta)
    {
        var pos = Position;
        pos.X += (float)(100 * delta);
        Position = pos;
    }

C#10から利用可能な with式を使うと少し短く記述することもできます。

   public override void _Process(double delta)
    {
        Position = Position with { X = Position.X + (float)(100 * delta) };
    }

おまけ:VSCodeと連携する

Godotエディタ側で「エディター設定」を開きます。macOSの場合は「Godot > エディター設定」です。

テキストエディター > 外部」から以下のように設定します。

  • 実行パス:VSCodeのパス (/Applications/Visual Studio Code.app など)
  • 実行フラグ:{project} --goto {file}:{line}:{col}
  • 外部エディタを使用:ON

これで Godotエディタで C#スクリプトを作成すると自動で VSCodeが開くようになります。