Godot4 Array[Dictionary] へのアクセス関数の例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、シグナルの情報を取得する Object クラスのメンバ関数 get_signal_list戻り値などで用いられる Array[Dictionary] 型のデータにアクセスする、指定したキーの値と、指定したキーと値を持つ Dictionary 要素を、全て取得する2つの関数とテストコードの例を紹介します。

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

シグナルの情報の取得などで利用される Array[Dictionary]

シグナルの情報を取得する Object クラスのメンバ関数 get_signal_list などは、Array[Dictionary] 型のデータを返します。
# C++ の構造体の配列のようなものや、 Perl の連想配列の配列のようなイメージを持ちました。

以下は、ゲームの2体のキャラクターのデータを、辞書の配列で表した例です。
最初に配列があり、その中にキャラクターごとの辞書(例では piyo と fuga という名前のキャラクターのデータ)が複数あります。

キャラクターごとに持っているスキルは skills というキーの値に設定されています。
この skills の値Array[Dictionary] 型になっています。
このように、辞書の要素の値の中に再び Array[Dictionary] 型が出てくることもあり、Array[Dictionary] 型はよく使われるデータ型と言えるかもしれません。

[
	{
		"name": "piyo",
		"level": 99
		"skills":
		[
			{
				"name": "Fire Magic",
				"type": "Attack"
				"value": 30
			},
			{
				"name": "Heal Magic",
				"type": "Heal"
				"value": 30
			}
		]
	},
	{
		"name": "fuga",
		"level": 39
		"skills":
		[
		]
	}
]

例えば、 get_signal_list の戻り値の Array の中に複数ある Dictionary は1つずつシグナルの情報を持ちます。

Array[Dictionaryget_signal_connection_list(signal: StringName) const 🔗

Returns an Array of connections for the given signal name. Each connection is represented as a Dictionary that contains three entries:

  • signal is a reference to the Signal;
  • callable is a reference to the connected Callable;
  • flags is a combination of ConnectFlags.

Array[Dictionaryget_signal_list() const 

Returns the list of existing signals as an Array of dictionaries.

Note: Due of the implementation, each Dictionary is formatted very similarly to the returned values of get_method_list.

Object — Godot Engine (4.x)の日本語のドキュメント #get_signal_list とその上に記述された get_signal_connection_list

Array[Dictionary] 型にアクセスする2つの自作関数

以下は、上記のような Array[Dictionary] 型のデータにアクセスする際に用いた以下の機能を関数にしたものです。

  • 配列の中で、各辞書の特定のキーの値全て得る関数
  • 配列の中で、指定したキーと値を持つ辞書全て得る関数
## 辞書型の要素を持つ配列 [param array_dictionary] から、指定したキーの値を抽出して、配列 [param dest_array] に追加します。
## 指定したキーがない場合は何もしません。
static func get_array_dictionary_specified_key_values(array_dictionary: Array[Dictionary], key: StringName, dest_array: Array) -> void:
	for dictionary: Dictionary in array_dictionary:
		if dictionary.has(key) == true:
			dest_array.append(dictionary.get(key))
	return

## 辞書型の要素を持つ配列 [param array_dictionary] で、指定したキーと値を持つ辞書を抽出して、配列 [param dest_array] に追加します。
static func get_array_dictionary_matched_dictionary(array_dictionary: Array[Dictionary], key: StringName, value, dest_array: Array):
	for dictionary in array_dictionary:
		if dictionary.has(key) == true:
			var _value = dictionary.get(key)
			if _value != null and _value == value:
				dest_array.append(dictionary)
	return

dictionary.has 関数は、辞書の中に指定したキーがあるかを確認します。
dictionary.get 関数は、指定したキーの値を辞書から取得します。
配列の append 関数は、第1引数を配列に追加します。

テストコード

以下は、その2つの関数のテストコードです。
Array[Dictionary] 型のサンプルを作り、関数が期待したデータ群を収集するかを確認しています。

func test_get_array_dictionary_specified_key_values_1():
	var array_dictionary: Array[Dictionary] = [{"name": "piyo", "level": 99}, {"name": "fuga", "level": 39}]
	var names: Array[String] = []
	ScUtil.get_array_dictionary_specified_key_values(array_dictionary, "name", names)
	assert_eq(names.size(), 2)
	assert_eq(names.has("piyo"), true)
	assert_eq(names.has("fuga"), true)
	assert_eq(names.has("hoge"), false)
	return

func test_get_array_dictionary_matched_dictionary_1():
	var array_dictionary: Array[Dictionary] = [{"name": "piyo", "level": 99}, {"name": "fuga", "level": 39}]
	var matched_dictionarys: Array[Dictionary] = []
	ScUtil.get_array_dictionary_matched_dictionary(array_dictionary, "name", "piyo", matched_dictionarys)
	assert_eq(matched_dictionarys.size(), 1)
	assert_eq(matched_dictionarys[0]["name"], "piyo")
	assert_eq(matched_dictionarys[0]["level"], 99)
	return

テスト

先ほど作った2つの単体テストの関数を含むスクリプトを GUT で実行し、自作関数が期待したとおりに動作するかテストを行います。

GUT による単体テストの実行方法については、以下の記事を参照してください。

GUT ボトムパネルを選択して、左上の Run All ボタンを押して、テストコードを全て実行します。

Godot4 Array[Dictionary] にアクセスする2関数の単体テスト1

結果として、作成したテスト関数も実行され、全てのテスト関数が合格しました。

Godot4 Array[Dictionary] にアクセスする2関数の単体テスト2

まとめ

今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、シグナルの情報を取得する Object クラスのメンバ関数 get_signal_list戻り値などで用いられる Array[Dictionary] 型のデータにアクセスする、指定したキーの値と、指定したキーと値を持つ Dictionary 要素を、全て取得する2つの関数とテストコードの例を紹介しました。

参照サイト 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をコピーしました