ソースから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の場合にこのようになると思います。
コメント