📝

Godot 4.2.1でResourceに定義したプロパティが「Invalid get index」でアクセスできない

2024/04/13に公開

概要

Godot 4.2.1にて、Resourceを継承した独自クラスを定義しpreloadを使ってリソースにアクセスすると、プロパティの値を設定しているにもかかわらず、Invalid get index 'XXXXX'(on base: 'Resource').となってしまうエラーに遭遇してしまいました。その問題の解決に難航したため、事象の詳細と解決策について共有します。

具体的な構成

  1. custom_resource.gdファイルを用意してclass_nameCustomResourceとして定義し、@exportでプロパティを定義する。
  2. 1で用意したリソースクラスを利用してcustom_resource.tresファイルを作り、@exportしたプロパティに値を代入する。
  3. 別のGDScriptファイル内で、2で作成したcustom_resource.tresリソースファイルを preload で読み込む。
  4. 実行時に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