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

304      Глава 12. Развертывание игр на устройствах игроков

Для тестирования мы воспользовались определением платформы, воспринимающим все платформы на базе настольных компьютеров как одну, но, как можно прочитать

вдокументации, существуют отдельные определения платформ для Windows, Mac и Linux. Более того, отдельные определения существуют для всех поддерживаемых

вUnity платформ, и для каждой из них вы можете создать свой вариант кода. На этом мы перейдем к рассмотрению следующей важной платформы: Интернета.

12.2. Создание игр для Интернета

Хотя настольные компьютеры являются основной целевой платформой для создаваемых с помощью Unity игр, существуют и другие важные варианты развертывания, например развертывание в Интернете. Оно требуется играм, которые запускаются в веб-браузерх и, соответственно, доступны для игроков в Интернете.

12.2.1. Проигрыватель Unity и HTML5/WebGL

Раньше создаваемые в Unity варианты программ для Интернета воспроизводились с помощью специальных подключаемых модулей браузера. Это было связано с отсутствием встроенных в браузер средств отображения трехмерной графики. Но в последние годы начал развиваться стандарт WebGL. С технической точки зрения он отличается от HTML5, но эти термины связаны друг с другом и часто используются как синонимы.

В Unity 5 в список платформ в окне Build Settings был добавлен вариант WebGL, а в следующих версиях он может превратиться в основной вариант создания приложений для Интернета. Именно это направление развития было выбрано в компании. Оно обусловлено в числе прочего давлением со стороны производителей браузеров, которые в реализации интерактивных веб-приложений, в том числе игр, предпочитают отходить от дополнительных подключаемых модулей в пользу HTML5/WebGL.

Впрочем, независимо от формы итогового приложения, процесс его генерации для веб-проигрывателя и для WebGL практически идентичен. В следующих разделах вы найдете описание процедуры для веб-проигрывателя с упоминаниями, чем именно отличается код, предназначенный для WebGL.

12.2.2. Создание файла Unity и тестовой веб-страницы

Откройте какой-нибудь другой проект (чтобы убедиться, что работать можно с любым проектом) и вызовите окно Build Settings. Выделите строку Web Player и щелкните на кнопке Build. Появится окно выбора файла; введите для данного приложения имя WebTest и при необходимости выберите для него более безопасное место (вне проекта Unity).

На этот раз у вас появятся два файла: сама игра Unity с расширением .unity3d и пустая веб-страница для воспроизведения игры. Откройте эту страницу, и в центре вы увидите встроенную игру.

Никакими особыми характеристиками страница не обладает; это всего лишь пример для тестирования игры. На ней можно настроить код и даже предоставить собственную версию веб-страницы (поверх которой скопирован код Unity). Одним из

12.2. Создание игр для Интернета      305

наиболее важных вариантов адаптации является добавление возможности взаимодействия Unity с браузером. Давайте посмотрим, каким образом это делается.

12.2.3. Обмен данными с JavaScript в браузере

Созданная в Unity онлайновая игра может обмениваться данными с браузером (точнее, с запущенным в браузере сценарием JavaScript), причем обмен может идти в обоих направлениях — как от Unity к браузеру, так и от браузера к Unity. В первом случае все тривиально: в Unity есть пара специальных команд, напрямую запускающих код в браузере.

В обратной ситуации все несколько сложнее: код JavaScript в браузере идентифицирует объект по имени, после чего Unity передает этому именованному объекту сцены сообщение. То есть в сцене должен присутствовать объект, который будет получать данные от браузера.

Чтобы посмотреть, как все это выглядит на практике, создайте новый сценарий с именем WebTestObject. Кроме того, создайте в активной сцене пустой объект с именем Listener (ему следует присвоить именно это имя, потому что оно фигурирует в коде). Свяжите с этим объектом новый сценарий и скопируйте в него код из следующего листинга.

Листинг 12.2. Сценарий WebTestObject для тестирования механизма обмена данными с браузером

using UnityEngine;

using System.Collections;

public class WebTestObject : MonoBehaviour { private string _message;

void Start() {

_message = "No message yet"; ¬ Исходное значение для сообщения.

}

void Update() {

if (Input.GetMouseButtonDown(0)) { ¬ Щелчок мыши вызывает функцию в браузере.

Application.ExternalCall("ShowAlert", "Hello out there!");

}

}

 

void OnGUI() {

Отображаем сообщение в верхнем

GUI.Label(new Rect(10, 10, 200, 20), _message); ¬

}

левом углу экрана.

 

public void RespondToBrowser(string message) { ¬ Функция, вызываемая браузером. _message = message;

}

}

Теперь еще раз сгенерируйте приложение для Интернета, чтобы добавить в игру новый код. После этого останется только отредактировать веб-страницу. Нужно вставить пару функций в JavaScript-код и кнопку в HTML-код. Добавьте JavaScript-код

306      Глава 12. Развертывание игр на устройствах игроков

и HTML-тег в следующий листинг; JavaScript-функции вставляются перед закрывающим тегом <script>, а кнопка — перед закрывающим тегом <body>.

Листинг 12.3. Фрагменты JavaScript- и HTML-кода, поддерживающие обмен данными между браузером и Unity

...

function ShowAlert(arg) { alert(arg); ¬ Выводим окно оповещения.

}

function SendToUnity() { ¬ SendMessage() вызывает функцию внутри Unity. u.getUnity().SendMessage("Listener", "RespondToBrowser", "Hello from the

browser!");

}

--> </script>

...

<input type="button" value="Send to Unity" onclick="SendToUnity();" /> #C ¬ </body>

</html>

Кнопка,

вызывающая

функцию

JavaScript.

Чтобы посмотреть, как работает этот код, откройте веб-страницу. При пересылке данных от Unity в браузер при щелчке в редакторе Unity сценарий WebTestObject вызывает функцию в браузере; сделайте несколько щелчков, и вы увидите, как в браузере появляется окно оповещения. Метод Application.ExternalCall() запускает именованную функцию JavaScript. Кроме того, в Unity есть метод Application. ExternalEval(), отвечающий за отправку сообщений браузеру; в нашей ситуации вместо вызова конкретной функции запускаются произвольно выбранные фрагменты JavaScript-кода. В большинстве случаев лучше вызывать функции (чтобы JavaScript- и Unity-фрагменты оставались независимыми друг от друга), но иногда имеет смысл запуск произвольно выбранных фрагментов, таких как вот этот код перезагрузки страницы:

Application.ExternalEval("location.reload();");

Код JavaScript на веб-странице также может посылать сообщения в Unity; достаточно щелкнуть на кнопке, которую мы добавили на страницу, и в Unity появится измененное сообщение. HTML-код кнопки ссылается на функцию JavaScript, которая, в свою очередь, вызывает метод SendMessage() в экземпляре Unity, вызывающий именованную функцию у именованного объекта в Unity; первый параметр представляет собой имя объекта, второй — имя метода, третий — строку, которая передается в метод. Листинг 12.3 вызывает метод RespondToBrowser() из сценария WebTestObject.

ПРИМЕЧАНИЕ  WebGL-сборки также могут обмениваться данными с JavaScript-кодом вебстраниц. Код этого взаимодействия практически идентичен показанному. Точнее, в случае отправки сообщения из Unity он совпадает, а вот в обратном направлении — со страницы в Unity — метод SendMessage(), сохранив тот же самый набор параметров, более не требует префикса u.getUnity().

Итак, мы разобрались, как осуществляется взаимодействие с браузером в случае сборок для Интернета; осталось познакомиться с последней платформой (точнее, с набором платформ) — мобильными приложениями.