Godot4 メンバ変数にgetter,setterを付けアクセス時に処理追加

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、作成したクラスのメンバ変数の値の取得・設定を行う際に呼び出される getter, setter 関数を追加して、メンバ変数にアクセスする際独自の処理を追加するスクリプト例と、それをテストするためのシーンの作成手順、そのテスト結果を紹介します。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

テストシーンの作成

メンバ変数に getter, setter 関数を割り当てたスクリプトをテストするための、テスト用のシーンを作成します。

メニュー「シーン」→「新規シーン」を選択してから、シーンドックで「インターフェース」を選択して、 Control ルートノードを作成します。

ノードを選択した状態で F2 キーを押してノードの名前を StudySetterGetterSignal に変更してから、 Ctrl + Sシーンを study_setter_getter_signal.tscn で保存します。
※ノード名やシーン名は自由で構いませんが、後で紹介するスクリプトなどで名前を変更する必要があるかもしれません。

Godot4 StudyGetterSetterSignal のシーン作成5

ルートノードにスクリプトを作成して割り当てます。
シーンドックでルートノード選択してから、右上の+のついたアイコンの「スクリプトをアタッチする」ボタンを押します。

Godot4 StudyGetterSetterSignal のシーン作成6

言語が GDScript、継承元が Control (Node でも構いません) 、パスに適切なファイルパスが指定されていることを確認してから「作成」ボタンを押します。

Godot4 StudyGetterSetterSignal のシーン作成7

以上で、 Control クラスのルートノードに何も処理をしないスクリプトを割り当てたシーンが作成できたので Ctrl + Sシーンを上書き保存しましょう。

スクリプトの上書き

作成した gd スクリプトに以下のスクリプトを上書きします。
getter, setter をメンバ変数に設定して、シーン開始時にそのメンバ変数への値の設定と print 文で出力するために値の取得を行います。

extends Node
class_name StudySetterGetterSignal

## setter, getter のテストを行うためのメンバ変数です。
## set, get で setter, getter の関数を割り当てることで
## この変数の値を取得する際は getter, 設定する際は setter の関数が呼び出されます。
var int_value: int = 0: set = set_int_value, get = get_int_value
## [param int_value] の setter 関数です。
func set_int_value(value: int) -> void:
	print("set_int_value called. value = " + str(value))
	# 値が以前と同じ場合は何もしません。
	# getter に割り当てた関数が呼ばれ、その戻り値と value を比較します。
	if int_value == value:
		return
	int_value = value	# 値を設定
	return
## [param int_value] の getter 関数です。
func get_int_value() -> int:
	print("get_int_value called. int_value = " + str(int_value))
	return int_value

# Called when the node enters the scene tree for the first time.
## シーンに、このスクリプトを割り当てたノードが。配置された直後に呼び出されるイベント関数です。
func _ready():
	# 変数を値を設定します。
	# 変数の setter に割り当てた関数が呼び出されます。
	int_value = 3
	# 出力するために、変数の値を取得します。
	# 変数の getter に割り当てた関数が呼び出されます。
	print("int_value = " + str(int_value))
	return

7 行目で、メンバ変数を定義しています。
その行の後半の set = で値を代入するときに呼び出される setter 用の関数を、 get = で値を取得するときに呼び出される getter 用の関数を設定します。

9 行目では int_value メンバ変数に割り当てる setter 用の関数 set_int_value を定義して、引数の値をメンバ変数に代入します。
その関数内の 13 行目では、値が同じ場合は代入の処理をしない判定が行われていますが、ここで int_value メンバ変数自身を参照する段階で getter の関数が呼び出されます。

18 行目では、 int_value メンバ変数に割り当てる getter 用の関数 get_int_value を定義して、メンバ変数の値戻り値として返しています。

10, 19 行目では、getter, setter 用関数、それぞれ、呼ばれたことを出力ボトムパネルで確認するために print 文を処理の初めに記述しています。

24 行目の _ready 関数は、シーンを実行した直後に呼び出されるイベント関数です。
この中で、getter, setter が呼び出される処理の例として、メンバ変数に値を設定して、その値を取得して print 文で出力します。

テスト

F6 キーで現在のシーンを実行すると、出力ボトムパネルに setter, getter 関数や _ready イベント関数で記述した print 文の内容が出力されました。

Godot4 StudyGetterSetterSignal のシーン実行結果2

以下の出力では、 setter, getter, getter の順で関数が呼ばれ、その後、 _ready イベント関数でそのメンバ変数の値を print 文で出力していることが確認できます。

set_int_value called. value = 3
get_int_value called. int_value = 0
get_int_value called. int_value = 3
int_value = 3

出力 1 行目

_ready イベント関数で最初に行った int_value = 3 の代入処理のために、最初に setter 用の関数 set_int_value が呼ばれています。
引数は 3 です。

出力 2 行目

その setter 関数の中で、現在の値と引数が異なるかを判定するために getter 用の関数を呼び出して値を取得しています。
出力の2行目では、呼び出された getter 関数の print 文が表示され、戻り値は 0 であることが確認できます。

その結果、 setter では 0 == 3 の判定が行われ、異なるので代入の処理が行われます。

ここまでで、 int_value = 3 の処理が終わりました。

出力 3 行目

次に print(“int_value = ” + str(int_value)) で int_value メンバ変数の値を取得するために getter 用の関数が呼ばれ、ここでは 3 が戻り値で返されています。

出力 4 行目

_ready イベント関数内で代入処理の後のメンバ変数の print 文で、 3 が設定されていることが確認できました。

getter, setter の注意点

setter, getter は変数へアクセスがあった際に処理を追加できる便利な機能です。
しかし、 setter, getter の本来の機能を実装しないと、正しく値が設定・取得できない場合もあるので注意しましょう。

以下は、 setter 用の関数の「int_value = value # 値を設定」をコメントアウトして、代入処理を行わなかった際の実行結果です。
最初に setter 用の関数が呼ばれて、引数 3 が渡されていますが、代入処理を setter 用の関数で実装していないせいで、代入処理が正しく行われていません

set_int_value called. value = 3
get_int_value called. int_value = 0
get_int_value called. int_value = 0
int_value = 0

まとめ

今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、作成したクラスのメンバ変数の値の取得・設定を行う際に呼び出される getter, setter 関数を追加して、メンバ変数にアクセスする際独自の処理を追加するスクリプト例と、それをテストするためのシーンの作成手順、そのテスト結果を紹介します。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました