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

236      Глава 9. Подключение игры к Интернету

Возможно, вы помните, что этот сценарий срабатывает рядом с устройствами при нажатии клавиши Fire3 (она задается в настройках ввода проекта и в данном случае ей соответствует левая клавиша Command). Кроме того, создайте для устройства Billboard сценарий с именем WebLoadingBillboard, свяжите его с рекламным щитом и скопируйте в него код следующего листинга.

Листинг 9.15. Сценарий WebLoadingBillboard для устройства

using UnityEngine;

using System.Collections;

public class WebLoadingBillboard : MonoBehaviour { public void Operate() {

Managers.Images.GetWebImage(OnWebImage); ¬ Вызов метода в сценарии ImagesManager.

}

 

private void OnWebImage(Texture2D image) {

Скачанное изображение назначается

GetComponent<Renderer>().material.mainTexture = image;

¬ материалу во время обратного

}

вызова.

}

Этот код решает две основные задачи: в процессе эксплуатации устройства вызывает метод ImagesManager.GetWebImage() и применяет изображение из функции обратного вызова. Текстуры назначены материалам, так что вы можете менять их в материале рекламного щита. Вид щита во время игры показан на рис. 9.6.

СКАЧИВАНИЕ ДРУГИХ РЕСУРСОВ

Скачивание изображений с помощью объекта WWW является достаточно простой операцией, а как обстоят дела с остальными видами ресурсов, такими как сеточные объекты и шаблоны экземпляров? Объект WWW обладает свойствами, связанными с текстом и графикой, поэтому в случае других ресурсов ситуация несколько усложняется.

Впрочем, в Unity есть механизм AssetBundles, позволяющий скачивать что угодно. Коротко говоря, вы сначала упаковываете ресурсы в пакет (bundle), который затем скачивается, и Unity извлекает их из пакета. Подробное рассмотрение процесса создания и скачивания пакетов выходит за рамки темы данной книги; но при желании изучить эту тему вы можете начать с руководства, которое найдете по адресу http://docs.unity3d.com/ru/current/Manual/AssetBundlesIntro.html.

Потрясающе! Скачанное нами изображение появилось на рекламном щите. Но мы можем оптимизировать код, добавив в него возможность работы с несколькими щитами. Именно этим мы и займемся в следующем разделе.

9.3.3. Кэширование скачанного изображения

Как упоминалось в разделе 9.3.1, сценарий ImagesManager пока не сохраняет скачанное изображение. Поэтому для нескольких рекламных щитов изображение придется скачивать несколько раз. Это неэффективно, ведь мы каждый раз делаем уже выполненную работу. Чтобы решить проблему, заставим сценарий ImagesManager кэшировать скачанные изображения.

9.3. Добавление рекламного щита      237

ОПРЕДЕЛЕНИЕ  Кэшировать (cache) означает сохранить на локальной машине. Наиболее распространенный (но не единственный!) контекст касается изображений, скачанных из Интернета.

Ключом к решению этой задачи станет функция обратного вызова в сценарии Ima­ gesManager, сначала сохраняющая изображение, а затем выполняющая обратный вызов из сценария WebLoadingBillboard. Решение в данном случае является нетривиальным (в отличие от текущего кода, в котором фигурирует обратный вызов из сценария WebLoadingBillboard), потому что наш код заранее не знает, каким будет обратный вызов из сценария WebLoadingBillboard. Другими словами, мы не можем добавить в сценарий ImagesManager метод, вызывающий определенный метод в сценарии WebLoadingBillboard, так как коду неизвестно, что это за метод. Найти выход из положения нам поможет лямбда-функция.

ОПРЕДЕЛЕНИЕ  Лямбда-функцией (lambda function), или анонимной функцией, называется функция, не имеющая имени. Обычно лямбда-функции создаются «на лету» внутри других функций.

Лямбда-функции представляют собой нетривиальный инструмент кодирования, поддерживаемый рядом языков программирования, в том числе C#. Воспользовавшись лямбда-функцией для обратного вызова в сценарии ImagesManager, мы сможем создать функцию обратного вызова «на лету», взяв метод, переданный из сценария WebLoadingBillboard. Это избавит нас от необходимости заранее знать, какой из методов будет вызываться, ведь лямбда-функции изначально не существует! Следующий листинг демонстрирует, как это все выглядит на практике.

Листинг 9.16. Обратный вызов с помощью лямбда-функции в сценарии ImagesManager

...

using System;

...

public void GetWebImage(Action<Texture2D> callback) { if (_webImage == null) {

StartCoroutine(_network.DownloadImage((Texture2D image) => {

_webImage = image; ¬ Сохраняем скачанное изображение.

callback(_webImage); ¬ Обратный вызов используется в лямбда-функции, а не отправляется })); непосредственно в сценарий NetworkService.

}

else { callback(_webImage);

}

}

...

Основные изменения претерпела функция, передаваемая в метод NetworkService. DownloadImage(). Раньше код передавался через один и тот же метод обратного вызова из сценария WebLoadingBillboard. Но после редактирования отправляемый в сценарий NetworkService обратный вызов превратился в отдельную лямбда-функцию,