Следующие два символа строки будут нести информацию о методе, который
необходимо вызвать для сущности или о действии, если тип строки является
событие. Пример второй части строки-взаимодействия представлен в табл.2.2.
Таблица 2.2 Пример второй части строки-взаимодействия
|
Кодировка сущности |
Кодировка метода/действия |
||
|
С |
6 |
9 |
В |
Так как одна строка может содержать в себе информацию о нескольких
сущностях, следовательно, количество параметризованных частей может меняться в
соответствии с количеством взаимодействий. Пример полной строки-взаимодействия
приведен в табл.2.3.
Таблица 2.3 Пример строки-взаимодействия
|
Тип взаимодействия |
Количество взаимодействий |
Кодировка первой сущности |
Кодировка метода |
Кодировка второй сущности |
Кодировка метода |
|||||
|
1 |
0 |
2 |
A |
4 |
0 |
2 |
D |
2 |
F |
D |
В приведенном примере строка передаст информацию о двух ресурсах и методах, которые необходимо применить к ним.
В работе игра разбита на две части, серверную часть, которая отвечает за
игровую логику и клиентскую, которая отвечает за визуальное представление игры.
За игровую логику будет отвечать модуль СКДИ, который представляет собой
веб-сервис, а за визуальное представление отвечает подсистема визуализации. На
рис.2.1 представлена архитектура взаимодействия двух служб между собой.

Для передачи информации между клиентом и сервером будем использовать запросы к сервису, и возвращать необходимую информацию обратно клиенту.
Веб-сервисом называется программная компонента, предоставляющая сервис удаленного вызова на основе стандартов WSI(Web Service Interoperability), основными из которых является протокол обмена сообщениями SOAP, язык описания интерфейса WSDL и HTTP как основной транспортный протокол.
На основе этих стандартов служба ASP.NET организует сервис удаленного вызова методов объектов. Веб-служба на основе интерфейса.NET обрабатывает приходящие от клиента сообщения. После чего веб-сервис вызывает методы объекта с извлеченными из сообщений параметрами, после чего возвращает сообщение с результатом выполнения метода. Описание функциональности веб-сервиса производится на C#.
Для того чтобы управлять элементами визуальной части согласно игровому сценарию и логике игры, которая установлена в СКДИ будут вызваны методы веб-сервиса. Методы, которые включает в себя веб-сервис, будут отвечать не только за передачу и получение сообщений от клиента, но и устанавливать параметры для сцен, ресурсов и событий для деловой игры.
Для того чтобы в игре, которую обозначили как клиент, реализовать взаимодействие с веб-сервисом и игровыми методами будем использовать запросы к веб-сервису. По запросам, которые подсистема визуализации будет отправлять, будет возвращаться ответ с результатами выполнения методов.
Для того чтобы получать и обрабатывать данные от веб-сервиса нам понадобится класс GameManager. С его помощью становится возможным реализовать управление игровыми объектами на основе информации переданной с веб-сервиса. Кроме этого нам понадобится создать вспомогательный класс, который назовем NetworkService. Он будет выполнять функцию посредника между клиентом и веб-сервисом. NetworkService необходим для того, чтобы обрабатывать данные подключения к веб-сервису и создавать запросы.
GameManager будет обращаться к NetworkServic, чтобы тот в свою очередь будет совершал запросы к сервису, и возвращал
от него ответы. Структура взаимодействия между GameManager и NetworkServic показана на рис.2.2.
Рисунок 2.2 Структура клиентской части
Для того чтобы обращаться к веб-сервису используется встроенный в Unity класс WWW. С его помощью возможно создавать запросы к сервису. Для этого будем вызывать объекты класса WWW, используя url-адрес сервиса, после чего будем посылать запрос по этому адресу.
Также в работе будет использоваться функция Coroutine, это позволит работать с классом WWW в фоновом режиме, для того чтобы
ожидать ответа от сервиса. Coroutine является специальной функцией, которая позволяет работать в фоновом
режиме программы или в цикле.
В рамках данной главы описаны этапы реализации веб-сервиса СКДИ, подсистемы визуализации при помощи игрового движка Unity3D. Также описано проектирование и разработка деловой игры «Проезд перекрестка».
Для работы ключевым требованием было реализовать возможность
взаимодействия игры на Unity
с WCF сервисом. Также необходимо чтобы
управление игрой было извне, на стороне сервиса. Для реализации WCF сервиса, с
которым будет связываться деловая игра, используется Visual Studio Community 2015. Для начала создаем проект WCF Service Application и назовем его CBGS (рис.3.1).
Рисунок 3.1 Создание проекта WCF сервиса
Для того чтобы реализовать связь с сервисом изменим файл IService как показано на рис.3.2. Также
создадим метод GameCall в файле Service1.
Рисунок 3.2 Связь с сервисом
В качестве переменных в метод будет посылаться строка-взаимодействия. Для
того чтобы сервис мог ее распознавать необходимо разделить ее на составные
части. Это позволит распознавать тип взаимодействия, который передается в
строке-взаимодействия, количество взаимодействий и сами сущности которые
закодированы в ней. Для этого создадим метод Parse, который будем использовать как в сервисе, так и в
подсистеме визуализации для разделения строки-взаимодействия на смысловые
части. Часть метода Parse представлена
на рис.3.3.
Рисунок 3.3 Метод Parse
В методе Parse на вход получаем строковую переменную и перебираем ее по символам. Символы в этой строке записываем в char массив для того чтобы потом выделить необходимые нам элементы строки: тип взаимодействия, количество и сущности.
После того как строка будет расшифрована необходимо чтобы сервис определил как реагировать на то что содержала в себе строка и на основе сценария игры сформировать ответ. Как было описано ранее в работе, строка-взаимодействия может быть трех типов: сцена, ресурс и событие. Основываясь на этом, в основном методе будет три случая, по которым будет формироваться ответ клиентской части игры.
Так как сценарий игры и порядок действий в СКДИ формируется при помощи языка ЛСА, то для того чтобы продвигаться по игровому сценарию в качестве ответа от клиентской части будет ожидаться состояния ресурсов, а в ответ будет возвращены сцены игры, которые необходимо отобразить игроку. В случае если тип строки-взаимодействия будет ресурс, то сервис сопоставит ресурсы и их состояния с тем, которые описаны в ЛСА.
Если запустить WCF-сервис
при помощи средства Test Client то можно увидеть, что клиенту
доступен метод GameCall, а сам
сервис расположен на localhost.
Рисунок 3.4 Test Client
Для выполнения работы было использовано Unity3D 5.6.0f3 personal edition. Создадим для игры 2D проект и назовем его Driving test.
Для того чтобы организовать взаимодействие между подсистемой визуализации и WCF сервисом прежде всего необходимо сгенерировать прокси-класс. Для этого используется инструмент svcutil. Для того чтобы его использовать необходимо открыть папку, в которой в которой установлен Unity и пройти по следующему пути: …Editor\Data\Mono\lib\mono\2.0. В этой папке должен быть расположен файл svcutil.exe. После чего необходимо запустить командную строку от имени администратора и ввести следующую команду: (путь в папку в которой установлен Unity) …\Editor\Data\Mono\lib\mono\2.0\svcutil -out:CBGSClient.cs #"896569.files/image008.jpg">
Рисунок 3.5 Создание проекта Unity
Рисунок 3.6 Генерация прокси класса
После этого будет сгенерирован файл «CBGSClient.cs» в папке, которая указана в командной строке. Этот файл и будет прокси-классом для Unity. Также необходимо настроить проект в Unity и изменить режим совместимости.
Для этого пройдем по следующему пути: (File → Build Settings → Player Setting), выберем «OtherSettings» и установим в поле «API Compatibility Level» на.NET 2.0 (рис.3.7).
Рисунок 3.7 Настройка совместимости проекта
Также в проекте необходимо создать папку «Plugin» и скопировать в нее файл «System.ServiceModel.dll», который расположен в папке: …Editor\Data\Mono\lib\mono\2.0. Также создадим папку «Scripts» и скопируем в нее файл «CBGSClient.cs» (рис.3.8).
Для вызова методов сервиса создадим скрипт «NetworkService», создадим пустой игровой объект и
прикрепим скрипт к нему и назовем. Назовем созданный нами игровой объект «GameManager». Часть скрипта представлено на
рис.3.9.
Рисунок 3.8 Иерархия проекта
Рисунок 3.9 NetworkService
Как видно выше, скрипт содержит в себе два метода. «Send2Service» необходим для того чтобы вызывать его из других скриптов и отправлять строку-взаимодействия на WCF-сервис. Для того чтобы избежать зависания программы, во время ожидания ответа от сервиса, используется Coroutine, которая вызывается из метода «Send2Service».
Для игры создали четыре основные игровые сцена: MainMenu, GameScene, GameWin и GameLose (рис.3.10).
Рисунок 3.10 Сцены проекта
Сцены GameWin и GameLose используются для того, чтобы отображать игроку, когда тот прошел игру либо наоборот проиграл, нарушив правила. Игровая сцена MainMenu необходима для того чтобы игрок мог запустить и начать играть. В сцене же GameScene и будет проходить вся игра.
Для того чтобы игру можно было запустить необходимо добавить все сцены в
сборку игры. Первой сценой, которую будет видеть игрок, сделаем игровую сцену MainMenu. Для этого расположим ее первой в
окне сборки игры.
Рисунок 3.11 Добавление сцен в сборку проекта
Создадим для игры скрипт «GameManager» и прикрепим его к одноименному игровому объекту. Этот скрипт необходим нам для того чтобы организовывать внутри игровое взаимодействие.
Двумя основными методами данного скрипта можно считать методы «Encrypt» и «Decrypt». Они позволят кодировать и декодировать
строку-взаимодействия для того чтобы общаться с WCF сервисом. Для того чтобы вызывать методы шифрования и
дешифрования из других скриптов сделаем их public. Также проинициализируем сам класс GameManager. Для этого напишем следующий код
(рис.3.12).
Рисунок 3.12 Инициализация класса GameManager
Теперь, когда проинициализировали класс «GameManager» можем вызывать его методы из других
скриптов. Пример такого вызова представлен на рис.3.13
Рисунок 3.13 Пример вызова метода
Для того чтобы формировать строку-взаимодействия в методе Encrypt создадим несколько переменных, которые будут хранить ID ресурсов, их состояние (выбран ресурс или не выбран) и тип сообщения который необходимо сформировать.
По ходу игры состояние переменных будет постоянно обновляться. Когда будем вызывать метод Encrypt, то в нем из этих переменных будет сформирована строка, которую и будем передавать в метод Send2Service в качестве свойства.
Метод Decrypt будем вызывать только из скрипта NetworkService, когда будем получать сообщение от
сервиса. Для того чтобы дешифровать сообщение, также как и в WCF сервисе будем использовать метод Parse. Также как и в методе GameCall в зависимости от типа сообщения и
свойств, которые в нем переданы игре будет необходимо совершить ряд действий
или присвоить состояния переменным. На рис.3.14 представлена часть метода. К
примеру, если тип переданного сообщения будет «сцена», а ID ресурса будет «00», то будет вызван
метод ShowScene, который отобразить игроку сцену с
соответствующим названием.
Рисунок 3.14 Дешифратор
Для данной работы взят бизнес-процесс «Проезд перекрестка». Целью данного процесса является проезд перекрестка со светофором на машине. Светофор на перекрестке может принимать два состояния, состояние, когда горит красный свет и состояние когда горит зеленый свет. Еще одним элементом игры является машина на перекрестке. Она также как и светофор может иметь два состояния: автомобиль стоит и автомобиль едет. Пользователем данного процесса является игрок, он управляет автомобилем.
Для того чтобы начать игровую сессию игроку необходимо запустить игру, после чего СКДИ сформирует игровой сценарий. После этого подсистема визуализации, согласно сценарию, отобразить сцену игроку. Взаимодействия пользователя с игрой начинается после того, как СКДИ посылает сценарий сцены игроку.
Для игры опишем основные элементы в сцене и состояния, которые они могут
принимать. В качестве игровых ресурсов, как было сказано выше у нас выступают
машина и светофор. В табл.3.1 представлены состояния, которые могут принимать
ресурсы.
Таблица 3.1 Возможные состояния ресурсов
|
Ресурс |
Состояние 1 |
Состояние 2 |
|
Светофор |
Горит зеленый свет |
|
|
Автомобиль |
Стоит на месте |
Едет через перекресток |
Опишем для сцены все возможные состояния, которые на ней могут принимать
ресурсы (табл.3.2).
Таблица 3.2 Возможные состояния сцены
|
Номер состояния сцены |
Состояние светофора |
Состояние машины |
|
1 |
Красный свет |
Стоит |
|
2 |
Красный свет |
Едет |
|
3 |
Зеленый свет |
Стоит |
|
4 |
Зеленый свет |
Едет |