基本的に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のデータベースを見たりいじったりできるオープンソースアプリ
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")