Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unity_в_действии_Джозеф_Хокинг_Рус.pdf
Скачиваний:
83
Добавлен:
21.06.2022
Размер:
26.33 Mб
Скачать

9.2. Скачивание сводки погоды из Интернета      231

Как видите, код для работы с данными в формате JSON напоминает код для работы с данными в формате XML. Основное отличие состоит в том, что парсер JSON-данных работает со стандартным словарем, а не с нестандартным XMLконтейнером. В коде встречается процедура десериализации, возможно, вы не знаете, что это такое.

ОПРЕДЕЛЕНИЕ  Десериализация (deserialization) представляет собой процесс, обратный сериализации. То есть данные преобразуются в форму, доступную для передачи и сохранения, например, в JSON-строку.

В сценарии изменился только синтаксис, а все операции остались неизменными. Извлекаем из фрагмента данных значение (по какой-то причине на этот раз оно содержится в переменной с именем all, но это странности API) и выполняем все то же несложное математическое преобразование к значению типа float в диапазоне от 0 до 1.

И вот теперь настало время применить полученное значение к нашей сцене.

9.2.4. Изменение вида сцены на базе данных о погоде

Независимо от того, каким именно способом отформатированы данные, как только из полученного ответа извлечено значение облачности, мы можем использовать его в методе SetOvercast() сценария WeatherController. Строка данных в формате XML или JSON в конечном итоге превратилась в набор слов и чисел. И одно из таких чисел метод SetOvercast() принимает в качестве параметра. В разделе 9.1.2 мы использовали число, увеличивавшееся в каждом кадре, но также легко мы можем вставить в код значение, которое нам вернул сервис с сайта прогнозов погоды.

Следующий листинг демонстрирует сценарий WeatherController после внесения в него изменений.

Листинг 9.11. Сценарий WeatherController, реагирующий на скачанные метеорологические данные

using UnityEngine;

using System.Collections;

public class WeatherController : MonoBehaviour { [SerializeField] private Material sky; [SerializeField] private Light sun;

private float _fullIntensity;

void Awake() { ¬ Добавляем/удаляем подписчиков на событие.

Messenger.AddListener(GameEvent.WEATHER_UPDATED, OnWeatherUpdated);

}

void OnDestroy() {

Messenger.RemoveListener(GameEvent.WEATHER_UPDATED, OnWeatherUpdated);

}

void Start() {

_fullIntensity = sun.intensity;

}

private void OnWeatherUpdated() {