Godot Engine/GDScript メモ

基本的に4.xの話です。

変数の定義と型指定

var paused = false
var paused :bool = false # 型を明示したい場合

三項演算子

GDScriptの三項演算子(Ternary Operator)の書き方に癖があったので(pythonとかあまり書かないので)、メモしておく。

C/C++とかでは下記のように書く

string text = (r==0) ? "Zero" : "NotZero"

GDScriptではこんな感じ

var text = "Zero" if r==0 else "NotZero"

enum

enumは特に癖もなく普通。

enum Named {THING_1, THING_2, ANOTHER_THING = -1}

ただ、複数のファイルから参照することはできない。下記リンク先を参考にしてAutoLoadしたオブジェクトを参照する形にする必要がある。

参考:https://www.yotsuyaku.com/blog/36

ボタンが押された後、なんか変(フォーカスが当たる)

ボタンをクリック後、フォーカスがそのボタンに行くことにより、思った表示にならないことがあります。不要なら、このボタンにフォーカスが当たらないようにすることで綺麗にできます。

インスペクター→Control→Focus→Modeを[None]にすると解決

コード(GDScript)の場合、

self.set_focus_mode(FocusMode.Focus_None)

複数ウィンドウ使用時にちらつく

プロパティのUnfocusableをオンにしたら解決した。

それで問題ないアプリならこれでよいと思う。

_process内で”delta”が未使用といわれる

_processメソッド内でdeltaが未使用の場合、The parameter “delta” is never used in the function “_process()”. If this is intended, prefix it with an underscore: “_delta”. という警告が出ます。

このメッセージの通り、下記のように引数を“_delta”と変えると警告が出なくなります。特にこれで問題ありません。

func _process(_delta):
    pass

strという引数名で警告が出る

メソッドの引数をstrと名付けると、The function parameter “str” has the same name as a built-in function. という警告が出ます。

strという引数名は避けましょう。

シリアル通信

シリアル通信をする仕組みですが、下記動画を参考にして、C#でSystem.IO.Portsライブラリを使うのが楽かなと思いました。

PowerShell(コマンドライン)でGodotプロジェクトがあるパスに移動して、下記コマンドを入力。

> dotnet add package System.IO.Ports --version 7.0.0

あとは、C#コードで下記のように使用する。(GDScriptとの接続は別途考える)

..
using System.IO.Ports;
..
SerialPort serialPort;
..
serialPort = new SerialPort();
serialPort.PortName = "COM5";
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.DataBits = 8;
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
serialPort.Open();
..
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e){
  string serialMessage = serialPort.ReadLine();
  GD.Print(serialMessage);
}

ルートのノードを参照する C#

// Find MainApp Node.
var nodeMainApp = GetNode("/root/MainApp");
if (nodeMainApp != null){
  GD.Print("Find MainApp");
}
else{
  GD.Print("Cannot find MainApp");
}

C#コードからGDScriptのノードの関数を呼び出す

NodeCS (C#)
|- NodeGS (GDScript)

という構造で、C#からGDScriptのメソッド my_function(10) を呼び出すコード

var nodeGS = GetNode("NodeGS");
var result = nodeGS.Call("my_function", 10);

SQLiteを使う

Godot Engine 4.3で使えることを確認しました。godot-sqliteをAssetLibからインストールするだけで使えるようになるの便利!

<おまけ>SQLiteのデータベースを見たりいじったりできるオープンソースアプリ

DB Browser for SQLite

DateTimeの文字列との変換

Timeで取得できる日付は文字列、もしくはdictionaryになる。

var test_datetime = Time.get_datetime_string_from_system() # 現在時刻を取得.
print(test_datetime)   # "2024-10-25T16:12:06"

var dict = Time.get_datetime_dict_from_datetime_string(test_datetime, false) # 文字列から変換.
print(dict)   # { "year": 2024, "month": 10, "day": 25, "hour": 16, "minute": 15, "second": 57 }

参考:https://docs.godotengine.org/ja/4.x/classes/class_time.html

Checkboxがチェックされているか調べる

Checkboxがチェックされているか調べるコードは次のような感じ

var CheckboxA : CheckBox
if( CheckboxA.pressed ):
    print("selected A")
タイトルとURLをコピーしました