【Godot】HTTPで画像を取得してテクスチャとして使う

はじめに

ネット上の画像をゲーム内で使いたいみたいな状況があるかもしれません (?)

Unityだと簡単にできるんですが、Godotでは出来るか気になったので実験してみました。

今回はこの3つのクラスを使用します。

手順

ノードを組む

3Dノードを組みます。

四角形メッシュを配置してカメラで向くようにします。 ディレクショナルライトも忘れずに。

f:id:ueshita:20200923194917p:plain

次に、UIノードを組みます。

ボタンを押すとシグナルでスクリプトが呼び出されるようにします。

f:id:ueshita:20200923195132p:plain

スクリプトを書く

extends Spatial

# ueshitaのTwitterアイコンのURL
const url = "https://pbs.twimg.com/profile_images/461385142607429632/c6z5xZS3_400x400.png"

func _ready():
    $HTTPRequest.connect("request_completed", self, "_on_request_completed")

func _on_Button_pressed():
    $HTTPRequest.request(url)

func _on_request_completed(result: int, response_code: int, 
        headers: PoolStringArray, body: PoolByteArray):
    
    print("---- HTTP Response ---")
    print("result: %d" % result)
    print("response_code: %d" % response_code)
    print("headers: ", headers)

    # png画像をイメージにロードする
    var image = Image.new()
    image.load_png_from_buffer(body)
    
    # イメージからテクスチャを作成する
    var texture = ImageTexture.new()
    texture.create_from_image(image)
    
    # マテリアルにセットする (今回はSpatialMaterial)
    var material = $Quad.get_surface_material(0) as SpatialMaterial
    material.set_texture(SpatialMaterial.TEXTURE_ALBEDO, texture)

ボタンが押されると_on_Button_pressedが呼ばれ、HTTPリクエストが開始されます。

今回は自分のTwitterアイコンのURLを指定しています。

成功すると_on_request_completed が呼ばれ、画像ロードからテクスチャの設定が行われます。

実行結果

f:id:ueshita:20200923195007p:plain

やったね!

最後に

プロダクトとして作る場合はエラー処理をちゃんと書いたほうがいいですね。