🎃

Robloxで天気APIを叩きリアルな天気情報をワールドに反映させる方法

2024/08/18に公開

はじめに

Robloxで天気情報を取得し、ゲーム内に表示させる方法について解説します。今回は、OpenWeatherMapのAPIを利用して実装します。

公式Reference

https://create.roblox.com/docs/ja-jp/reference/engine/classes/HttpService

実装

Weather APIを登録

https://openweathermap.org/

アカウント登録

  • Sing inをクリック

  • Create an Accountをクリック

  • 必要情報を記入しCreate Accountをクリック

  • 登録したメールに確認メールが届くのでそれを開いて登録確定する。

  • APIKeyをコピーしておく

APIドキュメントの確認

API doc を開き、APIの使い方を詳しく確認します。

Current Weather Data: 現在の天気情報を取得するAPI
https://openweathermap.org/current

Geocoding API: 地名から緯度経度を取得するAPI
https://openweathermap.org/api/geocoding-api

地名の緯度経度取得

Geocoding API を利用して、目的の地域の緯度経度を取得します。

http://api.openweathermap.org/geo/1.0/direct?q=Tokyo&limit=5&appid={API key}

q=Tokyo の部分を調べたい地域名に置き換えてください。
上記のURLをブラウザで開くと、JSON形式で緯度経度などの情報が返ってきます。
必要なのは lat (緯度)lon (経度) の値です。

上記のURLで東京の緯度経度を取得します。

ブラウザでURL検索すると以下のような文字列が表示されます。

[
	{
		"name": "Tokyo",
		"local_names": {
			"hu": "Tokió",
			"lv": "Tokija",
			"zh": "东京都/東京都",
			"nl": "Tokio",
			"tr": "Tokyo",
			"la": "Tokium",
			"pl": "Tokio",
			"bg": "Токио",
			"eo": "Tokio",
			"ta": "டோக்கியோ",
			"ar": "طوكيو",
			"fa": "توکیو",
			"oc": "Tòquio",
			"sl": "Tokio",
			"pt": "Tóquio",
			"be": "Токіа",
			"ko": "도쿄도",
			"fr": "Tokyo",
			"kn": "ಟೋಕ್ಯೊ",
			"lt": "Tokijas",
			"io": "Tokyo",
			"fi": "Tokio",
			"is": "Tókýó",
			"el": "Τόκιο",
			"ca": "Tòquio",
			"cy": "Tokyo",
			"he": "טוקיו",
			"vi": "Tokyo",
			"sr": "Токио",
			"ja": "東京都",
			"sv": "Tokyo",
			"mr": "तोक्यो",
			"sk": "Tokio",
			"tg": "Токио",
			"da": "Tokyo",
			"en": "Tokyo",
			"it": "Tokyo",
			"th": "โตเกียว",
			"et": "Tōkyō",
			"de": "Tokio",
			"ru": "Токио",
			"lb": "Tokio",
			"mi": "Tōkio",
			"ia": "Tokyo",
			"hr": "Tokio",
			"uk": "Токіо",
			"es": "Tokio",
			"cs": "Tokio",
			"ku": "Tokyo"
		},
		"lat": 35.6828387, <- 緯度
		"lon": 139.7594549, <- 経度
		"country": "JP"
	},
	{
		"name": "Chofu",
		"local_names": {
			"gl": "Chōfu, Tōkyō",
			"it": "Chōfu",
			"tg": "Чōфу",
			"bg": "Чофу",
			"es": "Chofu",
			"zh": "調布市",
			"sv": "Chofu",
			"lt": "Čiofu",
			"de": "Chōfu",
			"pl": "Chōfu",
			"sr": "Чофу",
			"ms": "Chofu",
			"sh": "Čofu",
			"et": "Chōfu",
			"uk": "Тьофу",
			"en": "Chofu",
			"fr": "Chōfu",
			"ja": "調布市",
			"th": "โชฟุ",
			"pt": "Chofu",
			"ko": "조후시",
			"fi": "Chōfu",
			"fa": "چوفو، توکیو",
			"ar": "تشوفو، طوكيو",
			"nl": "Chofu",
			"ru": "Тёфу"
		},
		"lat": 35.660036,
		"lon": 139.554815,
		"country": "JP"
	},
	{
		"name": "Tama",
		"local_names": {
			"ko": "다마시",
			"tg": "Тама",
			"ar": "تاما، طوكيو",
			"it": "Tama",
			"en": "Tama",
			"uk": "Тама",
			"th": "ทามะ",
			"gl": "Tama, Tōkyō",
			"pt": "Tama",
			"fi": "Tama",
			"fr": "Tama",
			"ru": "Тама",
			"pl": "Tama",
			"nl": "Tama",
			"es": "Tama",
			"lt": "Tama",
			"zh": "多摩市",
			"sr": "Тама",
			"ja": "多摩市",
			"bg": "Тама",
			"ms": "Tama",
			"de": "Tama",
			"sh": "Tama",
			"fa": "تاما، توکیو"
		},
		"lat": 35.637188,
		"lon": 139.443503,
		"country": "JP"
	},
	{
		"name": "Kodaira",
		"local_names": {
			"ru": "Кодайра",
			"tl": "Kodaira, Tokyo",
			"gl": "Kodaira",
			"pt": "Kodaira",
			"zh": "小平市",
			"sr": "Кодаира",
			"ms": "Kodaira",
			"fa": "کودائیرا، توکیو",
			"fi": "Kodaira",
			"pl": "Kodaira",
			"ro": "Kodaira, Tokyo",
			"ar": "كودايرا، طوكيو",
			"eo": "Kodaira",
			"en": "Kodaira",
			"ja": "小平市",
			"fr": "Kodaira",
			"vi": "Kodaira, Tokyo",
			"de": "Kodaira",
			"tg": "Кодаира",
			"es": "Kodaira",
			"bg": "Кодайра",
			"lt": "Kodaira",
			"it": "Kodaira",
			"uk": "Кодайра",
			"th": "โคไดระ",
			"ko": "고다이라시",
			"sh": "Kodaira"
		},
		"lat": 35.72522,
		"lon": 139.476606,
		"country": "JP"
	},
	{
		"name": "Kokubunji",
		"local_names": {
			"pt": "Kokubunji",
			"uk": "Кокубундзі",
			"fa": "کوکوبونجی، توکیو",
			"fr": "Kokubunji",
			"it": "Kokubunji",
			"pl": "Kokubunji",
			"ko": "고쿠분지시",
			"ru": "Кокубундзи",
			"en": "Kokubunji",
			"fi": "Kokubunji",
			"ja": "国分寺市",
			"th": "โคกูบุนจิ",
			"de": "Kokubunji",
			"eo": "Kokubunĵi",
			"zh": "國分寺市",
			"es": "Kokubunji",
			"tg": "Кокубунҷи",
			"ms": "Kokubunji",
			"lt": "Kokubundžis",
			"sh": "Kokubunji",
			"ar": "كوكوبونجي، طوكيو",
			"sr": "Кокубунџи",
			"gl": "Kokubunji, Tōkyō"
		},
		"lat": 35.709674,
		"lon": 139.454224,
		"country": "JP"
	}
]

現在の天気情報取得

取得した緯度経度とAPI Keyを使って、Current Weather Data のAPIを呼び出します。

https://api.openweathermap.org/data/2.5/weather?lat=35.68&lon=139.75&appid=sample-api-key

{緯度}{経度} の部分に、先ほど取得した値を、{API key} の部分にコピーしたAPI Keyをそれぞれ入力します。

このURLをブラウザで開くと、JSON形式で現在の天気情報が返ってきます。

{
	"coord": {
		"lon": 139.75,
		"lat": 35.68
	},
	"weather": [
		{
			"id": 802,
			"main": "Clouds",
			"description": "scattered clouds",
			"icon": "03d"
		}
	],
	"base": "stations",
	"main": {
		"temp": 304.94,
		"feels_like": 311.94,
		"temp_min": 303.67,
		"temp_max": 305.88,
		"pressure": 1008,
		"humidity": 72,
		"sea_level": 1008,
		"grnd_level": 1006
	},
	"visibility": 10000,
	"wind": {
		"speed": 4.12,
		"deg": 160
	},
	"clouds": {
		"all": 40
	},
	"dt": 1723594938,
	"sys": {
		"type": 2,
		"id": 268395,
		"country": "JP",
		"sunrise": 1723579150,
		"sunset": 1723627946
	},
	"timezone": 32400,
	"id": 1861060,
	"name": "Japan",
	"cod": 200
}

これで現在の天気がしっかりと返ってくることが確認できましたね。

登録してすぐには使えないバグが結構あります

https://www.elektroda.pl/rtvforum/topic4066267.html

僕は登録してAPIKeyが発行されて30分後くらいからつかるようになりました。

Robloxのログに表示させる

local HttpService = game:GetService("HttpService")

local URL_ASTROS = "https://api.openweathermap.org/data/2.5/weather?lat=35.68&lon=139.75&appid=sample-api-key"

-- OpenWeatherMapのAPIにリクエストを送信し、JSON形式のデータを取得
local response = HttpService:GetAsync(URL_ASTROS)

-- 取得したJSONデータをLuaのテーブルに変換
local data = HttpService:JSONDecode(response)

-- 天気の種類を取得 (e.g., "Clouds", "Rain")
local weather = data.weather[1].main

-- 気温をケルビンで取得
local tempInKelvin = data.main.temp

-- ケルビンから摂氏に変換
local tempInCelsius = tempInKelvin - 273.15

-- 天気の種類を表示
print("現在の天気は", weather, "です。")

-- 気温を摂氏で表示 (小数点以下1桁まで表示)
print("現在の気温は", string.format("%.1f", tempInCelsius), "℃です。")
  • APIリクエスト: HttpService:GetAsync を使用してAPIにリクエストを送信し、JSON形式のレスポンスを取得します。
  • JSONデコード: HttpService:JSONDecode を使用して、JSON形式のデータをLuaのテーブルに変換します。
  • データ抽出: 変換したテーブルから、必要な天気情報 (天気の種類、気温など) を抽出します。
  • 単位変換: ケルビンで取得した気温を摂氏に変換します。

正直コードに直接APIKeyを書き込むのはセキュリティ的に良くないのでRobloxのシークレットキーマネージャー的な機能があればそれを使いたい、、あとで調べます。

実行

https://youtu.be/5BxXzB5Rl3Y

まとめ

本記事では、RobloxでOpenWeatherMapのAPIを利用し、天気情報を取得する方法について解説しました。この方法を応用することで、ゲーム内にリアルな天候と同期させるシステムを実装したり、天気予報機能を追加したりすることができます。

Landelテックブログ

Discussion