はじめに
現代のゲーム開発では、ゲームがインターネット経由でサーバーと通信する場面が非常に多くなりました。オンラインランキングの取得、プレイヤーデータのクラウド保存、ゲーム内イベント情報の配信、外部サービスのAPI連携など、あらゆる場面でサーバー通信が必要です。Godot 4のHTTPRequestノードは、こうしたネットワーク通信を簡潔に実装するためのノードです。
複雑なネットワークプログラミングの知識がなくても、HTTPRequestを使えば安全で確実にサーバーとやり取りできます。ゲームをオンライン化する際の最初の一歩になるノードです。
HTTPRequestとは?
HTTPRequestは、インターネット経由でサーバーにデータを送受信するノードです。ブラウザのアドレスバーにURLを入力して、サーバーから情報を受け取るような「Webリクエスト係」と考えてください。ゲームからrequest()メソッドでURLを指定すると、バックグラウンドでサーバーに接続し、応答が返ってきたらrequest_completedシグナルで通知してくれます。
HTTPRequestの継承関係は以下の通りです。
HTTPRequest
↓
Node
通常のNodeを継承しているため、シーンに追加して使用します。非同期で通信を行うため、ゲームがフリーズせずスムーズに動作します。

このノードを使うべき場面
- オンラインランキング取得:サーバーに保存されたランキングをゲーム内に表示する
- ゲームデータのクラウド保存:プレイヤーの進度やセーブデータをサーバーに保存・読込
- 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)

もっと使いこなす:カスタマイズできるパラメータ
| パラメータ・テクニック | 変えると何が起きるか |
|---|---|
| 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 ノード解説
- 001〜035:各種ノード
- 036:PopupMenu
- 037:FileDialog
- 038〜080:その他のノード
- 081:Timer
- 082:Tween
- 083:HTTPRequest(この記事)
- 084:Line2D
- 085:Polygon2D
この記事はGodot 4.xをもとに執筆しています。


コメント