ゲームエンジン「Godot 4.x」で画像を読み込むときにデバッグモードだと読み込めるのに、リリースモードで読み込めない問題

執筆日: 更新日:
この記事の目次
chevron_right 概要
chevron_right 解決方法

概要

Godot 4.xで、画像を動的に読み込む際、
拡張子が変わるので、拡張子でファイルを識別していると死ぬ。

具体的には、
デバッグモードなら1.jpgなどの画像なのに、
リリースモードにすると、1.jpg.importになる。

解決方法

Globalスクリプト(例:Global.dg)に判別用の関数を定義する

# デバッグモードかリリースモードかを判別する関数
# 拡張子の問題で、デバッグモードだと.jpgを見に行くが、リリースモードだとすべて.importになるので判別が必要
func is_debug_build():
    return OS.is_debug_build()

# デバッグモードとリリースモードで拡張子を変える
func get_image_file_extention():
    if (is_debug_build()):
        return ".jpg"
    else:
        return ".jpg.import"

組み込んだ例

# 環境によって読み込む拡張子の変更
var ext = Global.get_image_file_extention()

var dir = DirAccess.open("res://asset/image/")
if dir:
    # 指定ディレクトリのファイルを全部取得
    dir.list_dir_begin()
		
    # ファイル名の取得
    var file_name = dir.get_next()
    # ファイル名が取得できなくなるまで繰り返す
    while file_name != "":
        if file_name.ends_with(ext):
            # 何らかの処理。
            # 例えば、1.jpg, 2.jpg...みたいな感じなら1や2の数字の部分を抽出
            var file_num = file_name.trim_suffix(ext).to_int()

            # 画像を読み込むときは.importはつかないので、そのまま読み込む(これ、まじうぜぇ)
            var texture = load("res://asset/image/%s.jpg" % stage_num)

        file_name = dir.get_next()

以上です

[PR] おすすめの本
この記事を書いた人
Nな人(えぬなひと)。
Nは本名から取っています。
Laravelが大好きなPHPerで、WEBを作るときはLaravelを技術スタックに絶対推すマン。
PHP、Pythonと、昔はperlを書いていたP言語エンジニア。
最近はNimを書いたりしています。