[Godot4]画像利用時にハマった事

ソースからPNG画像をロードした場合に、ローカルでは表示されたが、AndroidStudioエミュレータでは表示されなくて、ハマってしまったので備忘録として残しておきます。

結論

FileAccess.file_exists()で画像ファイルの存在確認をすると、見つからないので、ResourceLoader.exists()を利用して、読み込みもResourceLoader.load()を利用しましょう。

func load_image(id) -> Texture2D:
  var _image_path = "res://images/" + id + ".png"

	if ResourceLoader.exists(_image_path):
    return ResourceLoader.load(_image_path) as Texture2D
  else:
    print("File does not exist: " + _image_path)

  return null
GDScript

事象

以下のようにファイルを読み込んで、TextureRectにはめ込むだけの処理を作成しました。

## 画像の読み込み
func load_image(id) -> Image:
  var _image_path = "res://images/" + id + ".png"

  if FileAccess.file_exists(_image_path):
    return Image.load_from_file(_image_path)
  else:
    print("File does not exist: " + _image_path)

  return null
  
  ## 読み込んだ画像を表示
  func setTexture(image: Image):
    $TextureRect.texture = ImageTexture.create_from_image(image)
GDScript

ローカルで実行した際には問題なく表示されていたのですが、Android用にAPKファイルを作成して確認したところ、画像が表示されませんでした。

ログを見ると、File does not exist: res://images/0000001.pngとあったので、ファイル自体の存在がないようです。

そこで、APKファイルは各種ファイルをzipで圧縮したもの(正確には違うのでしょうが)なので、APKファイルの拡張子をzipにして解凍して、当該のファイルの存在確認をしてみました。

% mv project.apk project.zip
% unzip project.zip
% cd project
project% ls assets/images
00000001.png.import	00000003.png.import	00000005.png.import
00000002.png.import	00000004.png.import	00000006.png.import
Bash

何やら.importとついたファイルのみが存在しているようでした。

ChatGPTやClaudeに聞いてみたところ、以下のような情報が返ってきました。

.import ファイルのみが存在し、実際の .png ファイルが見つからないということは、Godotのリソースインポートシステムに関連する問題である可能性が高いです。
Plaintext

冒頭の結論にある解決方法のソースソースも頂いたので、実際に実行してみると、問題なく実行されました。

また、ローカルで実行した際も問題ありませんでした。

まとめ

画像をソースからロードする際にはエミュレータなどで実行してみましょう。

恐らくですが、プロジェクト設定>レンダリング>テクスチャの設定にて、高度な設定にあるImport ETC2 ASTCのチェックがONの場合にこのようになると思います。

コメント

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