【Unity】PokeAPIを使う

こんにちは。ぶんじゃくです。

師走に向けてご多忙のこと、そして寒さがますます厳しくなってきた今日この頃、皆様いかがお過ごしでしょうか。

さて、今回は「PokeAPI」についてと、Unityでの使用方法についてご紹介したいと思います。

PokeAPIとは

PokeAPIとは、非公式ですが有志がポケモンの各種データを取得するために用意したAPIです。

https://pokeapi.co/

上記サイトでどんなURLでどんなデータが取れるか確認できます。

レスポンスはJSON形式で返され、ここから必要なデータを取得するというわけですね。

それでは、今回はUnityでPokeAPIを使ってポケモン図鑑にあるようなデータ(高さ、重さ、等)を取得してみましょう。

前提としてUnityとJSONの相性は悪い

まず前提として、UnityはC#でコーディングしますが、このC#という言語とJSONの相性がとても悪いです。

このあたりについては私の過去の記事を読んでいただいたり、ちょっと調べていただければわかると思います。

ですので、単純にPokeAPIを使ってみたい、という方はわざわざUnity、C#を使う必要はないと思います。

その点ご了承ください。

ポケモンデータの取得のしかた

https://pokeapi.co/api/v2/pokemon/{ポケモン名かポケモンID}

で取得できます。

ポケモン名は英語名です。例えばピカチュウはpikachu、メタモンだとditto、になります。

ポケモンIDはぜんこく図鑑番号のことです。

ポケモンの英語名は日本人にはあまりなじみがないですので、今回はポケモンIDを使って取得します。

サンプルコード

using Newtonsoft.Json.Linq;

~中略~

no = 1;

UnityWebRequest req = UnityWebRequest.Get("https://pokeapi.co/api/v2/pokemon/" + no.ToString());
yield return req.SendWebRequest();
if (req.isHttpError || req.isNetworkError)
{
    yield break;
}

//! JObjectでJSONを扱う
//! ポケモンデータJSONの取得
JObject jObj = JObject.Parse(req.downloadHandler.text);

//! 高さ
float height = (float)jObj["height"] * 0.1f;

サンプルではJObject(Newtonsoft.Json)を使用しています。

C#は基本型が決まっていないクラスのJSONを取り扱うことが苦手なのですが、

JObjectにしてしまうことによって、直感的にわかりやすく使用できることが利点です。

ちなみに、名前等のデータはまた別のJSONにアクセスする必要があります。

サンプルコード2

~中略~

var speciesUrl = jObj["species"]["url"].ToString();

UnityWebRequest req2 = UnityWebRequest.Get(speciesUrl);
yield return req2.SendWebRequest();
if (req2.isHttpError || req2.isNetworkError)
{
    yield break;
}

//! 種族データJSONの取得
JObject jObj2 = JObject.Parse(req2.downloadHandler.text);

//! 名前
string nameJpn = string.empty;
foreach (var name in jObj2["names"])
{
    if (name["language"]["name"].ToString() == "ja")
    {
        nameJpn = name["name"].ToString();
        break;
    }
}

いかがだったでしょうか。

他にもいろいろなデータがあるので、ぜひ取得して遊んでみてください。

こんかいはこの辺で。さようなら。