📝
Godot 4.2.1でResourceに定義したプロパティが「Invalid get index」でアクセスできない
概要
Godot 4.2.1にて、Resourceを継承した独自クラスを定義しpreloadを使ってリソースにアクセスすると、プロパティの値を設定しているにもかかわらず、Invalid get index 'XXXXX'(on base: 'Resource').
となってしまうエラーに遭遇してしまいました。その問題の解決に難航したため、事象の詳細と解決策について共有します。
具体的な構成
-
custom_resource.gd
ファイルを用意してclass_name
をCustomResource
として定義し、@export
でプロパティを定義する。 - 1で用意したリソースクラスを利用して
custom_resource.tres
ファイルを作り、@export
したプロパティに値を代入する。 - 別のGDScriptファイル内で、2で作成した
custom_resource.tres
リソースファイルを preload で読み込む。 - 実行時にpreloadしたリソースのプロパティにアクセスすると、
Invalid get index 'XXXXX'(on base: 'Resource').
という実行時エラーが起きる。
※これに加えて原因でもう1つ条件があります。
原因
「preloadの利用」と「preloadで読み込んでいるリソースクラスを同じファイル内で利用する」ことで本現象が発生してしまいます。
例えば以下のコードの(1)と(2)がそれにあたります。それらをGDScript内に記載すると発生しますが筆者としては特に書き方に問題はないと考えていて、Godotの潜在的な不具合である可能性が高いです。
# custom_resource.gd では @export var sample = 1 を定義
const CUSTOM_RESOURCE = preload("res://custom_resource.tres") # (1) preloadを利用する
~
func _ready():
print(CUSTOM_RESOURCE.sample) # 実行時エラーは発生「Invalid get index 'sample'(on base: 'Resource').」
func get_custom_resource() -> CustomResource: # (2) preloadで利用したクラスを型で利用する
return CUSTOM_RESOURCE
解決方法
解決にはいくつか方法があります。
- 型定義などのクラスの利用をやめる
- preloadを利用せずloadに置き換える
Godotはまだまだ日本語のコミュニティが少ないため、本情報が日本の開発者の役に立てればと思います。
Discussion