Несколько недель назад я узнал о SWAPI (Star Wars API) — REST API для получения информации о людях, планетах, кораблях, фильмах и видах, связанных со вселенной Звездных войн. В рамках проекта хакатона Meta AR, над которым я работал в эти выходные, я решил интегрировать SWAPI в Unity. Весь проект можно найти на GitHub здесь.

[идентификатор подписи = ”attachment_1339 align = ”aligncenter” ширина = ”660]

Стереоскопический рендеринг в Unity сферы GameObject, изображающей Hoth. Объекты MGui для Meta HMD отображают информацию, полученную из SWAPI, в режиме реального времени, когда в приложении осуществляется доступ к планете.[/caption]

Немного о SWAPI: я немного одержим Звездными войнами, поэтому, когда я познакомился с полным API для доступа к информации о вселенной Звездных войн, я понял, что должен включить его в один из своих проектов. SWAPI позволяет вам сделать запрос GET к базовому URL-адресу http://swapi.co/api/, к которому вы затем добавляете определенный суффикс, чтобы делать запросы для определенных вещей — мы сосредоточились на /planets в этом демонстрация. Каждую категорию можно запросить отдельно, что вернет объект JSON с массивом всех элементов (например, http://swapi.co/api/planets), или вы можете указать идентификатор, для какой конкретной планеты вам нужны данные for (например, http://swap.co/api/planets/1, который возвращает данные для Татуина).

Итак, приступим к реализации! Сначала я создал новый сценарий C# из Unity. В дополнение к стандартным функциям Start() и Update() вам потребуется добавить новую функцию, которая возвращает объект IEnumerator. Поскольку мы получали информацию об отдельных планетах на основе их тега в Unity, я назвал эту функцию DownloadPlanet(string s), которая принимала строковый параметр, указывающий, для какой планеты извлекать данные.

В скрипте, который я создал, я сохранил базовый URL-адрес в строковом объекте, и когда нужная планета была выбрана с помощью метода Meta onTouchDwell() (для интеграции в не-AR-проекте можно было использовать onclick), DownloadPlanet () будет добавлять переданную строку к корневому URL-адресу, и я использовал эту строку для выполнения запроса GET. Поиграв немного с этим, я понял, что на самом деле это намного проще, чем я думал сначала, и смог без проблем получить объект JSON всего за три строки кода.

IEnumerator DownloadPlanet(string s)
 {
 // Grab the tag and append it to the baseURL
 WWW w = new WWW(baseURL + s);
 yield return w;
 yield return new WaitForSeconds(1f);
 Debug.Log("Received planet");
 ExtractPlanetData(w.text);
 }

Я взял класс JSON для разбора результата из хранилища ресурсов, чтобы получить результаты в читаемом формате, который я использовал в новом методе ExtractPlanetData(String s). Этот метод принимает объект WWW в текстовом формате, который мы преобразуем в объект JSON в методе ExtractPlanetData. После этого нужно было просто разобрать JSON на основе их ключей, чтобы получить соответствующие данные. Мы знали заранее, какие поля мы хотели извлечь, но вы можете изменить функцию для перебора ключей, если вам нужно другое поведение для выбранного вами API.

void ExtractPlanetData(string json_planet)
    {
        JSONObject planet = new JSONObject(json_planet);
        nameText.text = planet.GetField("name").ToString().Trim('"');
        climateText.text = planet.GetField("climate").ToString().Trim('"');
        terrainText.text = planet.GetField("terrain").ToString().Trim('"');
        populationText.text = planet.GetField("population").ToString().Trim('"');
        gravityText.text = planet.GetField("gravity").ToString().Trim('"');
    }

Основная цель взлома заключалась в том, чтобы поиграть с Meta API и гарнитурой (подробнее об этом скоро), но я действительно хотел найти окончательный способ получения данных из API REST в Unity, и это было успешно!

Вы можете найти полную документацию по доступу к Star Wars API здесь: http://swapi.co/documentation