無料で軽快な 3D/2D のゲームエンジン「Godot Engine 4」で作成したプログラムを C# から GDScript へ変換した際の具体例を変換のパターンとして紹介します。
3 回目は、using ディレクティブや、イベントの処理を実装する Signal 属性 / 型、ノードへのアクセス、デバッグなどで用いる print 関数、enum, static, if, for について紹介します。
※紹介するプログラムに出てきた範囲での紹介です。他については「GDScript reference — Godot Engine (4.x)の日本語のドキュメント」をご覧ください。
※引用の英文の後の日本語は Google 翻訳の結果を挿入したものです。
C# → GDScript 変換パターン
要素ごとに分けて、プログラムを C# から GDScript への変換パターンを説明します。
簡素な変換パターン一覧表もあるので、そちらも参照してください。
using ディレクティブ
C# の using ディレクティブは、GDScript では不要です。
using Godot;
using System;
# GDScript では不要です。
signal 属性, signal 型
C# の Signal Attribute は、 GDScript ではビルトインの型 signal に変換します。
[Signal]
public delegate void HitEventHandler();
signal Hit
Signal is a built-in Variant type that represents a signal of an Object instance. Like all Variant types, it can be stored in variables and passed to functions. Signals allow all connected Callables (and by extension their respective objects) to listen and react to events, without directly referencing one another. This keeps the code flexible and easier to manage.
Signal は、Object インスタンスの信号を表す組み込みの Variant 型です。すべての Variant 型と同様に、変数に格納して関数に渡すことができます。シグナルを使用すると、接続されているすべての Callable (およびその拡張によってそれぞれのオブジェクト) が、相互に直接参照することなく、イベントをリッスンして反応することができます。これにより、コードが柔軟になり、管理が容易になります。
Signal — Godot Engine (stable) documentation in English
ノードの取得
Godot Engine のノードへアクセスする場合、 C# では型と名前を引数に渡した GetNode 関数の戻り値からアクセスしますが、GDScript では $ のあとに名前を指定するだけです。
GetNode("CollisionShape2D").Disabled = false;
$CollisionShape2D.disabled = false
列挙型
enum は C# と似ていて列挙型名のあとに要素を {} の中にカンマ区切りで設定します。
public enum GamePhase
{
Title, // タイトル画面
Play, // プレイ中
Gameover, // ゲームオーバー
Clear, // クリア
};
enum GamePhase
{
Title, # タイトル画面
Play, # プレイ中
Gameover, # ゲームオーバー
Clear, # クリア
}
static 変数 (クラス変数)
static キーワードは C# と GDScript で同様に使えます。
クラス変数としてオブジェクトがなくてもクラスを指定するだけでアクセスできます。
※下記の変数は前述の列挙型です。
static public GamePhase CurPhase = GamePhase.Title;
static var CurPhase = GamePhase.Title
static にすると、型を指定することでそれぞれアクセスすることができます。
※ main という型の中に static 変数 CurPhase があります。本当は Main と大文字から始めたほうが良いです。
if (main.CurPhase != main.GamePhase.Play)
{
return;
}
if main.CurPhase != main.GamePhase.Play:
return
print 関数
デバッグで値を手軽に表示できます。
GDScript では print と書くだけですが、 C# では GD.Print というように名前空間を指定します。
変数の値などを合わせて表示するフォーマットについては、「GDScriptフォーマット文字列 — Godot Engine (4.x)の日本語のドキュメント」をご覧ください。
GD.Print("test");
print("test")
if 文
if 文も GDScript は python とにています。 elif も使えます。
// 例 1 enum の値の比較
if (CurPhase == GamePhase.Clear)
{
ZombieEraseTime -= delta;
}
// 例 2 キャストを含む比較
if (((int)(NoDamageTime / NoDamageBlinkInterval)) % 2 == 0)
{
GetNode<AnimatedSprite2D>("AnimatedSprite2D").Modulate = new Color(1, 0, 0, 1);
}
else
{
GetNode<AnimatedSprite2D>("AnimatedSprite2D").Modulate = new Color(1, 1, 1, 1);
}
# 例 1 enum の値の比較
if CurPhase == GamePhase.Clear:
ZombieEraseTime -= _delta;
# 例 2 キャストを含む比較
if int(NoDamageTime / NoDamageBlinkInterval) % 2 == 0:
$AnimatedSprite2D.modulate = Color(1, 0, 0, 1);
else:
$AnimatedSprite2D.modulate = Color(1, 1, 1, 1);
参照:GDScript reference — Godot Engine (4.x)の日本語のドキュメント
for 文
for 文はプログラムで使わなかったのですが、サンプルコードを記載しておきます。
python の for 文と似ています。
他にも配列要素を1つずつ取り出して処理することもできます。
詳しくは「GDScript reference — Godot Engine (4.x)の日本語のドキュメント #for」を参照してください。
for (int i = 0; i < 3)
{
// i = 0, 1, 2 の 3 回のループ処理です。
}
for i in range(3):
# i = 0, 1, 2 の 3 回のループ処理です。
まとめ
無料で軽快な 3D/2D のゲームエンジン「Godot Engine 4」で作成したプログラムを C# から GDScript へ変換した際の具体例を変換のパターンとして紹介しました。
3 回目は、using ディレクティブや、イベントの処理を実装する Signal 属性 / 型、ノードへのアクセス、デバッグなどで用いる print 関数、enum, static, if, for について紹介しました。
これで、1つの作品のプログラムの変換については書きましたが、必要に応じて他の変換についても書きます。
参照サイト Thank You!
- Google 翻訳
- How to write multiline comments ? – Godot Engine – Q&A
- GDScript reference — Godot Engine (stable) documentation in English
- GDScriptフォーマット文字列 — Godot Engine (4.x)の日本語のドキュメント
- GDScript reference — Godot Engine (4.x)の日本語のドキュメント #for
記事一覧 → Compota-Soft-Press
TODO:C#プログラム解説の記事では、この参照をはって .NET ではないバージョンにも対応する。
TODO:記事を分割した場合は、全てのページに簡易の全パターンの変換表(この連載の最後のページの余白または別記事として作成)へのリンクを貼る。
コメント