はじめに
Godotでは、基本的にGDScriptという独自言語を利用してプログラムを書きます。
このGDScriptは書きやすくていいのですが、Godotがサポートする機能の範囲を超えることができません。
他の(言語の)プログラムをGodotで使いたい場合には、現在2つの手段が用意されています。それはC#かC++でプログラムを記述する方法です。
しかし、Godot自体が日本でマイナーなゲームエンジンですから、その拡張方法であるC#とC++の使い方については、さらに日本語文献は少なくなります。
そこで、今回の記事ではGodotでC#を使う手順を紹介したいと思います。C#はUnityでも利用されている言語で、Unityからの移行時にも利用できると思います。
ちなみに、GodotでC#を使う利点は拡張性以外にもあります。
- C++で拡張するよりも実行環境の整備が楽
- 実行速度の向上
- 静的型付けによる開発のやりやすさ
また、GDScriptとの併用ももちろんできるので、必要に応じて使うことができます。
Godot for C#の注意点
PC用のゲームのエクスポートにはC#の制限がありませんが、他のプラットフォームへの出力には制限があります。現在(version 4.2.2)のC#を使うことの制限が次のとおりです。
- Web プラットフォーム : Godot4ではC#のサポートをしていません。Godot3を利用してください
- Android : .NET 7.0 以降をターゲットにする必要があります
- iOS : .NET 8.0 以降をターゲットにする必要があります。
詳細はこちらを参考にしてください(この記事の作成時点でのサポートですので、変更がある可能性があります)
Godot .NETのダウンロード
始めにGodotのC#対応バージョンをダウンロードします。通常のGodotはC#に対応していないので注意してください。とはいえ、Godotはダウンロードするだけで使えるので、面倒さは少ないですね。
公式ページからGodot Engine .NETをダウンロードします。
![](https://godotengine.org/assets/share-image.webp)
適当な場所に展開して、Godotを起動してください。
C#対応のGodot Engineのファイル名はGodot_v4.x.x-stable_mono_win64.exe
になっています。
.NET SDKのダウンロード
C#のビルド環境を入れていないと、プログラムのコンパイルができないので、.NET SDKをインストールします。
インストールは下記の公式サイトからインストーラーをダウンロードします。
![](https://dotnet.microsoft.com/blob-assets/images/dotnet-icons/square.png)
インストーラーをダウンロードしたら、インストールを開始します。
![](https://emoclework.jp/wp-content/uploads/2024/06/image-19.png)
問題なくインストールできたらOKです。Godot_v4.x.x-stable_mono_win64.exe
を起動して、適当なプロジェクトを作成してください。
外部エディタの設定
Godotに内蔵されているScriptエディタはGDScriptを書く分には問題ありませんが、C#の機能をサポートしているとは言い難いです。自動補完やデバック機能を利用したい場合には外部エディタを設定してください。
しかし、この記事では外部エディタの設定は行いません。使う方は、公式ページなどを参考に、外部エディタを設定してください。
C#で書いてみる
適当なノードを作って、プログラムをアタッチしてみます。
すると、言語をGDScript以外にC#を選択できるようになっています。
![](https://emoclework.jp/wp-content/uploads/2024/06/image-20.png)
C#を選択してプログラムを作成します。作成するとScriptエディタにてプログラムが編集できます。
![](https://emoclework.jp/wp-content/uploads/2024/06/image-21.png)
とりあえず、テストコードを書いてみます。
using Godot;
using System;
public partial class c_test_node : Node2D
{
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
GD.Print("Hello C#");
}
}
Godotのビルドイン関数にはGD名前空間でアクセスできます。
プログラムを書いたら、通常のGodotと同じ様に実行ボタンを押します(プログラムのビルドだけなら、ビルドボタンでもいいです)。
すると、プロジェクトのビルドが始まり、ゲームが実行されます。
![](https://emoclework.jp/wp-content/uploads/2024/06/image-22.png)
実行すると、Godotのログに先程の文章が流れ始めたら成功です。
![](https://emoclework.jp/wp-content/uploads/2024/06/image-23.png)
これでGodotでC#を利用することはできました。GodotでC++を使うよりも遥かに簡単に使えますね。
GDScriptからC#で書いたノードを呼び出す
とはいえ、すべてのプログラムをC#で書くことは、けっこう大変です。
GDScriptは、pythonのように書きやすさを重視しているのですから、簡単なコードであれば、GDScriptを使いたいという欲望も生まれてきます。
そんなときは、C#とGDScriptを併用すればいいのです。この節ではGDScriptからC#で書いたコード(ノード)を呼び出してみます。
まず、C#のコードを書きます。ここでは、make_strという呼ばれたstringを返す関数を実装したコードを書きました。
using Godot;
using System;
public partial class c_test_node : Node2D
{
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
public String make_str()
{
return "hello";
}
}
これをc_test_node.tscnというノードにアタッチします。ノードの型はNode2Dにしました。
次に、このc_test_node.tscnをスクリプト内で呼び出すノードを作ります。ノードの名前はcall_c_sharp_node.tscnとしました。
このノードに次のGDScriptをアタッチします。
extends Node2D
# Called when the node enters the scene tree for the first time.
var c_sharp_node := preload("res://c_test_node.tscn")
func _ready():
var test := c_sharp_node.instantiate()
var s :String = test.make_str()
print(s)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
C#のコードがアタッチされたノードをプレロードし(PackedScene)します。それを_readyにてインスタンス化して、make_strを呼び出してみました。
実行すると、次のログがGodotの出力にでます。
![](https://emoclework.jp/wp-content/uploads/2024/06/image-24.png)
ちゃんと、C#のコードが呼び出せていますね。また、返り値も正しく取得できています。
この様にするれば、必要な箇所のみをC#で書くことができますね。
まとめ
今回の記事では、GodotでC#を利用する手順をまとめました。
昔GodotでC++を利用したことがありますが、結構ビルドが大変でした。それに比べてC#のビルドは、かなり簡単だったので、おすすめです。
また、GDScriptからもC#で書いたコードを呼び出すことができることも確認しました。これからは必要な箇所のみをC#で書くこともできます。
また、GodotでC#を利用するメリットとして、拡張性、速度、保守性などの利点を上げました。しかし、今回利用してみて、デメリットも幾つか見えてきました。
- GDScriptの様に書けない文法・規則がある
- 実行にC#のビルド時間が加算される
- Godot内臓のエディタではC#のコードがとても書きづらい
これらのデメリットを許容できる方は、ぜひ利用してみてはいかがでしょうか
追記
C#で使えるLLMの実行パッケージLLamaSharpをGodotで使った話を書きました。