無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ノードの持つすべての基本の型のプロパティの名前と値を文字列で出力する関数の例を紹介します。
この関数により、スクリプトの処理中に取得したノードの内容を下パネルの出力で確認して、内部で扱っているノードが適切かどうかを簡単に確認できます。
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
制限事項
タイトルや冒頭で述べた「基本の型」は、「GodotEngine4 がサポートする基本的な型」です。
具体的には Variant.Type で定義されている int, Vector2, Signal などの型を指します。
GodotEngine4.3 時点では 39 個の型が Variant.Type に 0 ~ 38 の値として定義されています。
また、それらの型の変数を変換した文字列は str 関数の結果なので、テキストのフォーマットは型に依存します。
スクリプト
以下が、渡したノード (object 派生クラス)の全てのプロパティを1行ずつ文字列として出力する関数群です。
※スクリプトは自己責任でご使用ください。
1番目の print_all_property_name_and_value 関数で出力を行います。
2番目と3番目はそれぞれ内部で呼び出される関数です。
Object.get_property_list() により、プロパティ群を Array[Dictionary] 型で取得して、その後、その配列の中身を文字列に変換して出力します。
Variant.Type の定義と比較して変数の型を判定しています。
詳細はスクリプトのコメント文を参照してください。
# object の持つプロパティの名前と値の文字列を1行ずつ出力します。
# 形式については get_all_property_name_and_value 関数を参照してください。
func print_all_property_name_and_value(object: Object) -> void:
# object のプロパティ1つずつを文字列として格納した配列を取得します。
var string_array: Array[String] = get_all_property_name_and_value(object)
# プロパティの文字列を1行ずつ(プラパティ1つずつ)出力します。
for string in string_array:
print(string)
return
# object の持つプロパティの名前と値を「名前: 値」の形式の文字列の配列として返します。
func get_all_property_name_and_value(object: Object) -> Array[String]:
# 戻り値の変数です。この配列にプロパティの文字列を1行ずつ追加します。
var properties: Array[String]
# object が持つすべてのプロパティの名前や値の辞書型変数を取得します。
var prop_list = object.get_property_list()
# プロパティの辞書型変数を1つずつ処理します。3つのプロパティがあれば3回繰り返します。
for prop in prop_list:
# プロパティの名前と値と型番号を取得します。
var prop_name = prop.name
var prop_value = object.get(prop_name)
var prop_type = prop.type
# 型に応じて値を文字列に変換します。
prop_value = to_string_from_property_value(prop_value, prop_type)
# 「名前: 値」の形式の文字列を配列に追加します。
properties.append(prop_name + ": " + prop_value)
return properties
# Variant.Type に対応する型に応じて、値を文字列に変換して返します。
# Variant.Type に定義されていない値の場合は 「Unknown type = 39」などのように prop_type の番号を最後に加えた文字列を返します。
func to_string_from_property_value(prop_value, prop_type: int) -> String:
# 型に応じて (Variant.Type) 値を文字列に変換します。
match prop_type:
TYPE_NIL:
prop_value = "null"
TYPE_BOOL:
prop_value = str(prop_value)
TYPE_INT:
prop_value = str(prop_value)
TYPE_FLOAT:
prop_value = str(prop_value)
TYPE_STRING:
prop_value = prop_value
TYPE_VECTOR2:
prop_value = str(prop_value)
TYPE_VECTOR2I:
prop_value = str(prop_value)
TYPE_RECT2:
prop_value = str(prop_value)
TYPE_RECT2I:
prop_value = str(prop_value)
TYPE_VECTOR3:
prop_value = str(prop_value)
TYPE_VECTOR3I:
prop_value = str(prop_value)
TYPE_TRANSFORM2D:
prop_value = str(prop_value)
TYPE_VECTOR4:
prop_value = str(prop_value)
TYPE_VECTOR4I:
prop_value = str(prop_value)
TYPE_PLANE:
prop_value = str(prop_value)
TYPE_QUATERNION:
prop_value = str(prop_value)
TYPE_AABB:
prop_value = str(prop_value)
TYPE_BASIS:
prop_value = str(prop_value)
TYPE_TRANSFORM3D:
prop_value = str(prop_value)
TYPE_PROJECTION:
prop_value = str(prop_value)
TYPE_COLOR:
prop_value = str(prop_value)
TYPE_STRING_NAME:
prop_value = str(prop_value)
TYPE_NODE_PATH:
prop_value = str(prop_value)
TYPE_RID:
prop_value = str(prop_value)
TYPE_OBJECT:
prop_value = str(prop_value)
TYPE_CALLABLE:
prop_value = str(prop_value)
TYPE_SIGNAL:
prop_value = str(prop_value)
TYPE_DICTIONARY:
prop_value = str(prop_value)
TYPE_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_BYTE_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_INT32_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_INT64_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_FLOAT32_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_FLOAT64_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_STRING_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_VECTOR2_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_VECTOR3_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_COLOR_ARRAY:
prop_value = str(prop_value)
TYPE_PACKED_VECTOR4_ARRAY:
prop_value = str(prop_value)
_:
# Variant.Type に該当しない prop_type の場合は、Unknown type = %prop_type% の形式の文字列を設定します。
prop_value = str("Unknown type = ", str(prop_type))
return prop_value
テスト
例として、操作キャラクターの実装で使っている CharacterBody2D クラスを継承した GodotSan クラスのノードのプロパティを出力します。
以下が出力するために使ったコードです。前述の関数群も同じスクリプト内に追加してください。
extends Node2D
# Called when the node enters the scene tree for the first time.
func _ready():
# シーンに配置した CharacterBody2D を継承したノード
# (class_name GodotSan) のプロパティの名前と値を出力します。
print_all_property_name_and_value($GodotSan)
# 前述の3つの関数群を追加してください。
F5 / F6 キーでそのスクリプトが含まれるシーンを実行した結果は以下です。
name は class_name で指定した GodotSan になっています。
また、基底クラスのプロパティである global_position などだけではなく、 GodotSan クラスで追加した SPEED などのプロパティも表示されています。
Node: null
_import_path:
name: GodotSan
unique_name_in_owner: false
scene_file_path: res://godot_san.tscn
owner: TilemapStage:<Node2D#27699184897>
multiplayer: <SceneMultiplayer#-9223372012695583494>
Process: null
process_mode: 0
process_priority: 0
process_physics_priority: 0
Thread Group: null
process_thread_group: 0
process_thread_group_order: 0
process_thread_messages: 0
Physics Interpolation: null
physics_interpolation_mode: 0
Auto Translate: null
auto_translate_mode: 0
Editor Description: null
editor_description:
CanvasItem: null
Visibility: null
visible: true
modulate: (1, 1, 1, 1)
self_modulate: (1, 1, 1, 1)
show_behind_parent: false
top_level: false
clip_children: 0
light_mask: 1
visibility_layer: 1
Ordering: null
z_index: 0
z_as_relative: true
y_sort_enabled: false
Texture: null
texture_filter: 0
texture_repeat: 0
Material: null
material: <Object#null>
use_parent_material: false
Node2D: null
Transform: null
position: (8, -16)
rotation: 0
rotation_degrees: 0
scale: (0.125, 0.125)
skew: 0
transform: [X: (0.125, 0), Y: (0, 0.125), O: (8, -16)]
global_position: (8, -16)
global_rotation: 0
global_rotation_degrees: 0
global_scale: (0.125, 0.125)
global_skew: 0
global_transform: [X: (0.125, 0), Y: (0, 0.125), O: (8, -16)]
CollisionObject2D: null
disable_mode: 0
Collision: null
collision_layer: 1
collision_mask: 1
collision_priority: 1
Input: null
input_pickable: false
PhysicsBody2D: null
CharacterBody2D: null
motion_mode: 0
up_direction: (0, -1)
velocity: (0, 0)
slide_on_ceiling: true
max_slides: 4
wall_min_slide_angle: 0.26179939508438
Floor: null
floor_stop_on_slope: true
floor_constant_speed: false
floor_block_on_wall: true
floor_max_angle: 0.78539818525314
floor_snap_length: 1
Moving Platform: null
platform_on_leave: 0
platform_floor_layers: 4294967295
platform_wall_layers: 0
Collision: null
safe_margin: 0.07999999821186
script: <GDScript#-9223372009726016131>
godot_san.gd: null
SPEED: 200
SPEED_REDUCE: 200
JUMP_VELOCITY: -400
platform_velocity: null
can_climb: false
is_climb: false
CharacterBody2D を継承した GodotSan ノードに設定しているメンバ変数の名前や値も一致していて、正しくプロパティの情報を出力しています。
まとめ
今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ノードの持つすべての基本の型のプロパティの名前と値を文字列で出力する関数の例を紹介しました。
この関数により、スクリプトの処理中に取得したノードの内容を下パネルの出力で確認して、内部で扱っているノードが適切かどうかを簡単に確認できます。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- Object — Godot Engine (4.x)の日本語のドキュメント
- @GlobalScope — Godot Engine (4.x)の日本語のドキュメント#enum-globalscope-variant-type
- CharacterBody2D — Godot Engine (4.x)の日本語のドキュメント
記事一覧 → Compota-Soft-Press
コメント