💃

【Godot Engine】コードからSpriteFramesを生成する

2023/08/18に公開

はじめに

WOLF RPGエディターの歩行グラフィックをGodot Engineで使用する時に、同じようなSpriteFramesを量産する必要が出てきました。
毎回手動で作るのはつらいので、GDScriptを使って自動で生成できるようにします。

コード

Main.gd
func generate(target:CompressedTexture2D):
    # ファイルパスを指定
    var directory:String = target.resource_path.get_base_dir()
    var filename:String = target.resource_path.get_file().get_basename()
    var save_path:String = "{0}/{1}.tres".format([directory, filename])

    var size:Vector2 = target.get_size()
    var sprite_frames:SpriteFrames = SpriteFrames.new()

    # 画像をフレームに分割
    var flames:Array = []
    for i in range(4):
        for k in range(6):
            var texture:AtlasTexture = AtlasTexture.new()
            texture.atlas = target
            texture.region = Rect2(size.x / 6 * k, size.y / 4 * i, size.x/6, size.y/4)
            flames.append(texture)
    
    # フレームからアニメーションを作成
    const animation_names:Array = ["Down", "Down-Left", "Left", "Down-Right", "Right", "Up-Left", "Up", "Up-Right"]
    for n in range(len(animation_names)):
        var flames_index:int = n * 3
        sprite_frames.add_animation(animation_names[n])
        sprite_frames.add_frame(animation_names[n],flames[flames_index])
        sprite_frames.add_frame(animation_names[n],flames[flames_index + 1])
        sprite_frames.add_frame(animation_names[n],flames[flames_index + 2])
        sprite_frames.add_frame(animation_names[n],flames[flames_index + 1])    

    # SpriteFrames生成時についてくるdefaultは使わないので削除
    sprite_frames.remove_animation("default")
    
    # SpriteFramesをtresファイルとして保存
    ResourceSaver.save(sprite_frames, save_path)

このコードでは、下の画像のような歩行グラフィックを左上から右下に24分割し、
それぞれの向きのアニメーションを作成してtresファイルに保存しています。

アドオンとして呼び出せるようにしておくと便利なので、同じようなアニメーションを何度も使いまわしたい人にはおすすめです。

参考記事

https://docs.godotengine.org/en/latest/classes/class_spriteframes.html
https://docs.godotengine.org/ja/stable/classes/class_atlastexture.html
https://docs.godotengine.org/en/latest/classes/class_texture2d.html
https://docs.godotengine.org/en/stable/classes/class_resourcesaver.html

Discussion