Godot入門:HTTPRequestの使い方と活用法

はじめに

現代のゲーム開発では、ゲームがインターネット経由でサーバーと通信する場面が非常に多くなりました。オンラインランキングの取得、プレイヤーデータのクラウド保存、ゲーム内イベント情報の配信、外部サービスのAPI連携など、あらゆる場面でサーバー通信が必要です。Godot 4のHTTPRequestノードは、こうしたネットワーク通信を簡潔に実装するためのノードです。

複雑なネットワークプログラミングの知識がなくても、HTTPRequestを使えば安全で確実にサーバーとやり取りできます。ゲームをオンライン化する際の最初の一歩になるノードです。

HTTPRequestとは?

HTTPRequestは、インターネット経由でサーバーにデータを送受信するノードです。ブラウザのアドレスバーにURLを入力して、サーバーから情報を受け取るような「Webリクエスト係」と考えてください。ゲームからrequest()メソッドでURLを指定すると、バックグラウンドでサーバーに接続し、応答が返ってきたらrequest_completedシグナルで通知してくれます。

HTTPRequestの継承関係は以下の通りです。

HTTPRequest

Node

通常のNodeを継承しているため、シーンに追加して使用します。非同期で通信を行うため、ゲームがフリーズせずスムーズに動作します。




HTTPRequestの通信フロー
HTTPRequestはゲームを止めずにバックグラウンドでサーバー通信を行います

このノードを使うべき場面

  • オンラインランキング取得:サーバーに保存されたランキングをゲーム内に表示する
  • ゲームデータのクラウド保存:プレイヤーの進度やセーブデータをサーバーに保存・読込
  • Webhook通知:Discord、Slack、Twitterなどへのゲームイベント通知
  • 外部APIからデータ取得:天気情報、画像、テキストなど外部サービスのデータを利用

別のノードが適切な場面

ローカルファイルの読み書きはFileAccessを、大容量ファイルのダウンロードにはHTTPClientを、リアルタイム双方向通信が必要な場合はWebSocketClientを使う方が適切です。

主なプロパティと機能

プロパティ・メソッド 役割
request(url, headers, method, body) Error HTTPリクエストを送信。URL、ヘッダー、HTTPメソッド(GET/POST等)、ボディを指定
request_completed Signal サーバーから応答があったとき発火。結果コード、レスポンスボディなどの情報を受け取る
cancel_request() void 実行中のリクエストをキャンセル。ゲーム終了時や通信タイムアウト時に使用
set_use_threads(enable) void trueでスレッド使用(推奨)。GUIスレッドを阻害しない
timeout float 通信タイムアウト時間(秒)。サーバーが応答しない場合の待機時間上限

コード例1:オンラインランキング取得

extends Node

@onready var http_request = $HTTPRequest
@onready var ranking_label = $CanvasLayer/RankingLabel

func _ready() -> void:
    # request_completedシグナルに関数を接続
    http_request.request_completed.connect(_on_request_completed)

func fetch_ranking() -> void:
    print("ランキング取得中...")
    ranking_label.text = "ランキング取得中..."

    # ランキング取得APIにGETリクエストを送信
    var url = "https://api.example.com/ranking?limit=10"
    var error = http_request.request(url)

    if error != OK:
        print("リクエスト送信失敗: ", error)

func _on_request_completed(result: int, response_code: int,
                           headers: PackedStringArray, body: PackedByteArray) -> void:
    # result: 0=成功、それ以外は通信エラー
    if result != OK:
        print("通信エラー: ", result)
        ranking_label.text = "ランキング取得失敗"
        return

    # response_code: HTTPステータスコード(200=成功、404=見つからない等)
    if response_code != 200:
        print("サーバーエラー: ", response_code)
        ranking_label.text = "サーバーエラー"
        return

    # bodyはバイト配列なので文字列に変換
    var response_text = body.get_string_from_utf8()
    print("レスポンス: ", response_text)

    # JSON解析(実装はプロジェクトに応じて)
    var json = JSON.new()
    json.parse(response_text)
    var ranking_data = json.get_data()

    # ランキング表示
    var ranking_text = "=== オンラインランキング ===\n"
    for i in range(min(10, ranking_data.size())):
        var entry = ranking_data[i]
        ranking_text += "%d位: %s - %d点\n" % [i+1, entry["name"], entry["score"]]

    ranking_label.text = ranking_text

コード例2:POSTでプレイヤーデータ送信

extends Node

@onready var http_request = $HTTPRequest
var player_name = "Player1"
var player_score = 12345

func _ready() -> void:
    http_request.request_completed.connect(_on_save_completed)
    set_use_threads(true)  # スレッド使用を推奨
    http_request.timeout = 10.0  # 10秒でタイムアウト

func save_player_data() -> void:
    print("プレイヤーデータ保存中...")

    # POSTボディにJSON形式でデータを配置
    var data = {
        "name": player_name,
        "score": player_score,
        "timestamp": Time.get_ticks_msec()
    }

    var json_string = JSON.stringify(data)
    var body = json_string.to_utf8_buffer()

    # HTTPヘッダーを設定
    var headers = ["Content-Type: application/json"]

    # POSTリクエスト送信
    var url = "https://api.example.com/save"
    http_request.request(url, headers, HTTPClient.METHOD_POST, body)

func _on_save_completed(result: int, response_code: int,
                        headers: PackedStringArray, body: PackedByteArray) -> void:
    if result != OK:
        print("保存失敗(通信エラー)")
        return

    if response_code == 200:
        print("保存成功!")
    else:
        print("保存失敗(サーバーエラー): ", response_code)




HTTPRequest実装例
HTTPRequestを使ってオンラインランキングやデータ保存が実装できます

もっと使いこなす:カスタマイズできるパラメータ

パラメータ・テクニック 変えると何が起きるか
HTTPメソッドの選択(GET/POST/PUT/DELETE) GETはデータ取得、POSTは新規作成、PUTは更新、DELETEは削除。REST APIの設計に応じて使い分ける
カスタムヘッダー設定 Authorization(認証トークン)、Content-Type(データ形式)など。APIのセキュリティ要件に対応
timeout値の調整 低すぎるとネットワーク遅延で失敗、高すぎるとユーザー待機時間が長くなる。一般的に10〜30秒が目安
set_use_threads(true)の活用 スレッド使用でGUIがフリーズしない。大容量通信やGUIレスポンスが重要な場合は必須
リトライロジックの実装 通信失敗時に自動で再度リクエストする仕組み。一時的な接続失敗に対応
通信中の進捗表示 ローディング画面やプログレスバー表示。ユーザー体験を向上させる

まとめ

HTTPRequestはゲームの「外部世界との窓」です。オンラインランキング、クラウドセーブ、リアルタイム情報配信など、現代的なゲーム体験を実現する際に必要不可欠なノードです。セキュリティとエラーハンドリングを意識しながら使用することが重要です。

  • HTTPRequestは非同期でサーバーと通信し、ゲームをフリーズさせない
  • request()でリクエスト送信、request_completedシグナルで応答受け取り
  • response_codeやエラー処理を適切に実装して、安定した通信を実現する

次回は、2D描画の基本となるLine2Dノードについて解説します。敵の軌跡表示やレーザービームなど、線で表現する様々なビジュアル表現が可能になります。

シリーズ:Godot 4 ノード解説

この記事はGodot 4.xをもとに執筆しています。

コメント