HTML-страница, которая содержит контент Unity Web Player может взаимодействовать с ним и наоборот. Есть два направления взаимодействия:
- Веб-страница вызывает функции внутри контента web-плеера Unity.
- Содержимое Unity веб-плеера вызывает функции на веб-странице.
Каждое из этих направлений взаимодействия будет описано более подробно ниже.
Вызов функций контента веб-плеера Unity с веб-страницы
Объект Unity Web Player имеет функцию, SendMessage() , что можно назвать с веб-страницы, чтобы вызвать функции в контенте веб-плеера Unity. Это функция очень похожа на функцию GameObject.SendMessage в Unity. При вызове с веб-страницы вы передаете имя объекта, имя функции и ещё один аргумент, а SendMessage() будет вызывать данную функцию на указанном игровом объекте.
Чтобы вызывать функции в Unity Web Player с помощью SendMessage() , необходимо сначала получить ссылку на объект веб-плеера Unity. Вы можете использовать функцию GetUnity() , которая по умолчанию генерируется Unity в HTML для получения ссылки на объект. Вот пример функции JavaScript, которая будет выполнять функцию SendMessage() ; в свою очередь SendMessage() будет вызывать в игре на объекте с именем MyObject функцию MyFunction() , передавая строку данных в качестве аргумента:
Unity Web Player как пользоваться
В игре у Вас на игровом объекте ( GameObject ) с именем MyObject должен быть скрипт, который должен содержать функцию с именем MyFunction :
function MyFunction(param : String)
Примечание: имейте в виду, что если функция не имеет аргументов, то в качестве аргумента необходимо передать пустую строку («»).
Строка, float или целое число должно быть передано при использовании SendMessage() , этот параметр является обязательным. Если вам это не нужно просто предайте нулевое значение или другие значения по умолчанию и игнорируйте его в Unity. Кроме того, указанное имя игрового объекта может быть предоставлено в виде пути. Например, /MyObject/SomeChild где SomeChild должен быть дочерним элементом MyObject , а MyObject должен быть на корневом уровне, т.к. перед его именем стоит ‘/’.
Примечание: u.getUnity() может возвращать значение null, если игра ещё не полностью загружена, так что можно проверить, если это значение не равно null перед использованием SendMessage(). Или ждать полной загрузки вашей игры, прежде чем пытаться взаимодействовать с ней.
Вызов функций веб-страницы из веб-плеера Unity
Для того, чтобы вызвать функцию веб-страницы из содержимого веб-плеера Unity, следует использовать функцию Application.ExternalCall() . С помощью этой функции можно вызывать любую функцию JavaScript, определенную на веб-странице, передавая ей любое количество параметров. Вот пример Unity скрипта, который использует функцию Application.ExternalCall() для вызова функции с именем SayHello() на веб-странице, передавая часть строковых данных в качестве аргумента:
Application.ExternalCall( «SayHello», «The game says hello!» );
На веб-странице необходимо определить функцию SayHello() , например:
Что такое Unity. Как сделать игру
Выполнение произвольного кода браузера из содержимого веб-плеера Unity
Вам даже не придется определять функции на веб-странице, вместо этого вы можете использовать функцию Application.ExternalEval() , которая выполнит произвольный код браузера из веб-плеера.
В следующем примере проверяется, чтобы страница, на которую встроено содержимое веб-плеера, находилась в определённом домене (unity3d.com), если это не так, то он будет перенаправлять на другой адрес. Эта техника может быть использована для предотвращения диплинкинга (вложенных ссылок) на ваш контент:
Application.ExternalEval( «if(document.domain != ‘unity3d.com’) < document.location=’http://unity3d.com’; >» );
Источник: docs.unity3d.com
Unity web player: в чём назначение и можно её удалить
Ни для кого не станет секретом, что при работе с операционной системой Windows и со всеми благами, которые она предлагает использовать, каждый пользователь сталкивается с определённым программным обеспечением. Порой, данное ПО находится на видном месте, и его установку инициировал сам оператор компьютера, а порой, программа есть, а вот откуда она взялась, пользователю просто неизвестно.
Подобное скрытное функционирование далеко не редкость, так как подавляющее количество процессов работают лишь при определённом сценарии, который и инициирует их запуск. Например, каждый, кто хоть раз запускал игру в какой-либо социальной сети или на каком-либо сетевом ресурсе, сталкивался с тем, что при начале загрузки игры в браузере предлагается включить некий «Unity web player».
Достаточно лишь санкционировать включение, и игра волшебным образом запускается. Но что это за «чудотворная» программа? Не является ли она вирусом? В чём её функционал, а главное – можно ли её удалить? Об ответах на эти и другие вопросы и пойдёт речь в рамках настоящей статьи.
Назначение программы Unity web player.
Что это
По сути, достаточно лишь более детально изучить само название рассматриваемого программного обеспечения для того, чтобы определить его функционал. Всё просто, «Unity» – это игровой движок, который активно используется разработчиками различных относительно «простеньких» игр.
А «Web Player», как несложно догадаться, – это технология, которая позволяет запускать проект внутри интернет-обозревателя (браузера). Отсюда вывод напрашивается сам собой. «Unity web player» – это приложение, которое обеспечивает фактическую работу какого-либо игрового продукта в рамках её использования в структуре браузера без установки на компьютер. Грубо говоря, это сетевой проигрыватель для игр. Первая ассоциация среди схожих приложений – это всем известный и многими нелюбимый «Adobe Flash Player». Поэтому, если вы активны в рамках времяпрепровождения, например, за игрой в какую-либо трёхмерную ферму, то подобное программное обеспечение станет обязательным элементом дальнейшей успешной игры.
Как скачать и стоит ли
Необходимо отметить, что разработчики браузеров, например компания «Google», уже давно стали отказываться от подобного рода программ, деактивировав поддержку «NPAPI-плагинов», что и позволяло запускать «Unity» на компьютере. Эта информация легко подтверждает тем, что на официальном сайте разработчиков (https://unity3d.com/webplayer), где можно скачать рассматриваемое ПО вручную, в списках поддерживаемых обозревателей числится только многими забытый «Internet Explorer 11». Подобное положение дел постепенно привело к тому, что разработчики игровых продуктов данной категории просто отказались от использования подобного движка в своих проектах, что в итоге и привело к снижению его популярности и актуальности, что раньше виделось далеко не всем.
Итак, вопрос: «Нужно ли в 2019 году устанавливать Unity web player?». Ответ напрашивается сам собой: «Нет, в этом нет абсолютно никакой необходимости». Пока ещё работающий «Adobe Flash Player» с лихвой покрывает пользовательский интерес. Но если вы продолжаете активно использовать «IE» и сетевые ресурсы, где «Unity» всё ещё в моде, то бесплатно скачать данное программное обеспечение можно с сайта разработчиков, ссылка на который была приведена выше.
Как удалить
Для удобства пользователей рассматриваемая программа не любит себя явно проявлять и становится невидимой и ненавязчивой. Она тихо и спокойно работает, не выводя лишней информации и не занимая много места.
Стоит отметить, что не только игры используют подобный движок, но и некоторые другие развлекательные сетевые ресурсы, к примеру, различные сайты, где предоставляется возможность смотреть фильмы онлайн. Поэтому и её удаление можно считать обоснованным, только если в её работе были зафиксированы какие-либо сбои. Если же вы всё-таки решились на удаление, то «Unity web player» удаляется в штатном режиме через функционал раздела «Программы и компоненты», который можно найти в «Панели управления». Или же нахождение и деинсталяцию данного ПО можно доверить какому-либо «утилизатору», к примеру, «CCleaner». Всё, что требуется, – это нажать на кнопку «Удалить», дождаться подтверждения удаления и по желанию перезагрузить компьютер.
Заключение
Итак, как уже было сказано ранее, разработчики стараются отойти от лишних «телодвижений» в рамках их проектов, что приводит к отключению поддержки различных дополнительных плагинов. Это уже привело к снижению интереса к «Unity», и на очереди «Adobe Flash Player», запрет на поддержку которого «Google» анонсировала ещё несколько лет назад (май 2016 года).
Источник: winzen.ru
Создание вашего WebGL-приложения
Чтобы создать сборку для WebGL, выберите Файл > Настройки сборки в главном меню Unity. В списке платформ выберите WebGL и нажмите Переключить платформу.
После настройки параметров сборки выберите один из следующих двух вариантов:
- Build превращает ваше приложение в проигрыватель.
- Build and Run создает приложение в проигрывателе и открывает этот проигрыватель на целевой платформе.
Система сборки Unity для WebGL API JavaScript, который отображает 2D- и 3D-графику в веб-браузере. Вариант сборки Unity WebGL позволяет Unity публиковать контент в виде программ JavaScript, использующих технологии HTML5 и API рендеринга WebGL для запуска контента Unity в веб-браузере. Подробнее
См. в Словарь поддерживает следующие настройки:
Texture Compression Метод хранения данных, который уменьшает объем требуемого дискового пространства. См. Сжатие текстур, Сжатие анимации, Сжатие звука , Сжатие компоновки. См. в Словарь |
Выберите один из доступных параметров форматирования ниже, чтобы установить сжатие текстур по умолчанию Оборудование для 3D-графики требует, чтобы текстуры были сжаты в специализированных форматах. которые оптимизированы для быстрой выборки текстур. Подробнее Просмотрите в формате Словарь текстуры в проекте. Вы также можете использовать этот параметр для изменения из сценария или с помощью переключателя командной строки -setDefaultPlatformTextureFormat . Дополнительные сведения см. в обзоре формата сжатия текстур. Этот параметр также доступен в настройках проигрывателя настройках, которые позволяют установить различные игра, созданная Unity. Подробнее См. в окне Словарь . |
|
Use default format (DXT) | Это формат сжатия по умолчанию. | |
ETC | Это расширение является частью WebGL API и предоставляет сжатый ETC формат текстуры Формат файла для обработки текстур во время рендеринга в реальном времени аппаратным обеспечением для трехмерной графики, таким как видеокарта или мобильное устройство. More info See in Словарь . |
|
ETC2 | Это расширение является частью WebGL API и предоставляет сжатый ETC Формат текстуры. Используйте этот формат сжатия текстур при использовании OpenGL 4.3. | |
ASTC | Этот формат сжатия текстур является популярным выбором благодаря широкому диапазону производных коэффициентов сжатия. Например, сжатие ASTC доступно для большинства графических процессоров Intel и чипов Nvidia Tegra.. | |
DXT | Это расширение поддерживает формат сжатия DXTn/BCn.. | |
Development Build Сборка разработки включает символы отладки и включает профилировщик. More info See in Словарь |
Включите этот параметр, чтобы включить символы отладки сценариев и профилировщик в вашу сборку. Когда вы включаете это, Unity устанавливает определение скрипта DEVELOPMENT_BUILD . Этот параметр следует использовать только тогда, когда вы хотите протестировать свое приложение. Обратите внимание, что сборки для разработки не минимизируют содержимое, а это означает, что сборки для разработки очень велики для распространения. | |
Code Optimization | Выберите режим оптимизации для компиляции кода WebGL. | |
Speed | Это значение по умолчанию. При выборе этого параметра создается код WebGL, оптимизированный для производительности во время выполнения. | |
Size | При выборе этого параметра создается код WebGL, оптимизированный для размера сборки. Это особенно полезно при создании игр WebGL для мобильных браузеров на Android и iOS мобильной операционной системе Apple. Подробнее См. в Словарь , где параметр оптимизации по скорости по умолчанию приводит к увеличению Файлы WebAssembly для использования мобильными устройствами. |
|
Autoconnect Profiler | Как правило, если этот параметр включен, он позволяет автоматически подключать Unity Profiler к вашей сборке. Однако для WebGL, поскольку вы не можете подключить Profiler окно, которое поможет вам для оптимизации вашей игры. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее См. в Словарь работающую сборку. Используйте этот параметр для подключения содержимого к Вместо этого редактор. Это связано с тем, что соединение Profiler обрабатывается с помощью WebSockets в WebGL, но веб-браузер разрешает только исходящие соединения из содержимого. Чтобы этот параметр был доступен, необходимо включить параметр Разработка. |
|
Deep Profiling Support | Включите этот параметр, чтобы включить Глубокое профилирование в Профилировщике. Благодаря этому Profiler анализирует каждый вызов функции в вашем приложении и возвращает более подробные данные профилирования. Включение поддержки глубокого профилирования может замедлить выполнение скрипта. Этот параметр доступен, только если вы включили параметр Разработка. | |
IL2CPP Code Generation | Определите, как Unity управляет генерацией кода IL2CPP. Этот параметр доступен только в том случае, если вы используете IL2CPP для своего скриптового бэкенда, а не Mono. Чтобы изменить серверную часть сценариев, перейдите в Настройки проигрывателя > Конфигурация > Серверная часть сценариев и измените значение с Mono на IL2CPP. | |
Faster runtime | Создает код, оптимизированный для производительности во время выполнения. Это поведение по умолчанию в предыдущих версиях Unity. | |
Faster (smaller) builds | Создает код, оптимизированный для размера сборки и итерации. Он создает меньше кода и создает меньшую сборку, но может повлиять на производительность среды выполнения, особенно для универсального кода. Вы можете использовать этот параметр, когда важно более быстрое время сборки, например, при итерации изменений. | |
Build | Используйте его для создания своего приложения. | |
Build And Run | Используйте его для локального просмотра WebGL Player. Unity использует локальный веб-сервер для размещения вашей сборки и открывает ее с URL-адреса localhost. В качестве альтернативы вы можете использовать собственный локальный веб-сервер с правильно настроенными заголовками ответов. Дополнительные сведения см. в разделе WebGL: сжатые сборки и конфигурация сервера. |
Чтобы изменить настройки переопределения импорта объектов, см. Настройки сборки.
Создать папку
Папка Build содержит следующие файлы ( [ExampleBuild] представляет собой имя целевой папки сборки).
[ExampleBuild].loader.js | Код JavaScript, необходимый веб-странице для загрузки содержимого Unity.. |
[ExampleBuild].framework.js | Среда выполнения JavaScript и плагины. |
[ExampleBuild].wasm | Двоичный файл WebAssembly. |
[ExampleBuild].mem | Двоичный образ для инициализации динамической памяти для вашего проигрывателя. Unity генерирует этот файл только для многопоточных сборок WebAssembly. |
[ExampleBuild].data | Данные ресурсов и Сцены Сцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. More info See in Словарь . |
[ExampleBuild].symbols.json | Имена символов отладки, необходимые для разбора трассировки стека ошибок. Этот файл создается только для выпускных сборок, когда вы включаете параметр «Отладочные символы» (Файл > Настройки сборки > Настройки проигрывателя). |
[ExampleBuild].jpg | Фоновое изображение, которое отображается во время загрузки сборки. Этот файл создается только в том случае, если в настройках проигрывателя указано фоновое изображение (Файл > Настройки сборки > Настройки проигрывателя > Изображение-заставка). ). Дополнительную информацию см. на странице заставки. |
Если вы включите Метод сжатия для своей сборки, Unity определит расширение, соответствующее методу сжатия, и добавит это расширение к именам файлов внутри подпапки Build. Если вы включите Резервный вариант распаковки, Unity добавит расширение .unityweb к именам файлов сборки. В противном случае Unity добавляет расширение .gz для метода сжатия Gzip или .br для метода сжатия Brotli. Дополнительные сведения см. в разделе WebGL: сжатые сборки и конфигурация сервера.
Если вы включите Именовать файлы как хэши в Настройках проигрывателя, Unity будет использовать хэш содержимого файла вместо имени файла по умолчанию. Это относится к каждому файлу в папке сборки. Этот параметр позволяет загружать обновленные версии сборок игры в ту же папку на сервере и загружать только те файлы, которые изменились между итерациями сборки.
Примечание. Открытие проигрывателя непосредственно из файловой системы может не работать в некоторых браузерах. Это связано с ограничениями безопасности, применяемыми к URL-адресам локальных файлов.
Поддержка глубокого профилирования
Включите параметр Поддержка глубокого профилирования, чтобы приложение Unity Profiler профилировало каждый вызов функции в вашем приложении. Дополнительные сведения см. в документации по Глубокому профилированию.
Настройки проигрывателя
WebGL имеет некоторые дополнительные параметры в настройках проигрывателя (меню: Правка > Настройки проекта Большой набор настроек, которые позволяют настроить поведение физики, звука, сети, графики, ввода и многих других областей вашего проекта. Подробнее
См. Словарь , затем выберите категорию Игрок ).
Другие настройки
Удалить код двигателя
Откройте Другие настройки, чтобы получить доступ к параметру Удалить код двигателя. Этот параметр установлен по умолчанию, чтобы включить удаление кода для WebGL. Если этот флажок установлен, Unity не включает код для классов, которые вы не используете. Например, если вы не используете какие-либо физические компоненты или функции, весь физический движок система, моделирующая аспекты физических систем чтобы объекты могли правильно ускоряться и подвергаться воздействию столкновений, гравитации и других сил. Подробнее
See in Словарь удален из вашей сборки. Дополнительные сведения см. в разделе «Зачистка» ниже.
Настройки публикации
Включить исключения
Откройте Настройки публикации, чтобы получить доступ к Включить исключения. Включить исключения позволяет указать, как будет обрабатываться неожиданное поведение кода (обычно считающееся ошибкой) во время выполнения. У него есть следующие параметры:
- Нет: выберите этот вариант, если вам не нужна поддержка исключений. Это дает наилучшую производительность и наименьшие сборки. При использовании этого параметра любое исключение приводит к остановке вашего контента с ошибкой в этом параметре.
- Только явные исключения (по умолчанию): выберите этот параметр, чтобы перехватывать исключения, которые явно указаны в инструкции throw в вашем скрипты Фрагмент кода, позволяющий создавать собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. нравится. Подробнее
Посмотреть в Словарь , а также убедиться, что окончательно блоки вызываются. Обратите внимание, что выбор этой опции делает сгенерированный код JavaScript из ваших скриптов длиннее и медленнее; Это может быть проблемой только в том случае, если скрипты являются основным узким местом в вашем проекте. - Полный без трассировки стека. Выберите этот параметр, чтобы захватить:
- Исключения, которые явно указаны в операторах throw в ваших сценариях (аналогично параметру Только явные исключения)
- Нулевые ссылки
- Доступ к массиву за пределами границ
Выберите Настройки публикации, чтобы получить доступ к кэшированию данных.
Кэширование данных
Чтобы получить доступ к Кэшированию данных, перейдите к Настройки публикации через Файл > Настройки сборки > Проигрыватель. Настройки > WebGL. Это позволяет браузеру кэшировать основные файлы данных в базе данных IndexedDB.
Использование кэша HTTP браузера по умолчанию не гарантирует, что браузер кэширует конкретный ответ. Это связано с тем, что HTTP-кеш браузера имеет ограниченное пространство, и браузер может не иметь возможности кэшировать слишком большие файлы.
Чтобы повысить скорость загрузки, IndexedDB позволяет кэшировать файлы, превышающие ограничения браузера. Когда вы кешируете больше файлов, вы увеличиваете вероятность того, что загруженный контент будет доступен на компьютере пользователя во время следующего запуска сборки.
Кэширование данных кэширует только файлы .data в кэше IndexedDB для ответов HTTP. Для кэширования AssetBundles необходимо включить кэширование данных и переопределить unityInstance.Module.cacheControl() . Для этого убедитесь, что Module.cacheControl(url) возвращает must-revalidate для запрошенного URL AssetBundle. Например, вы можете переопределить функцию unityInstance.Module.cacheControl() в обратном вызове выполнения обещания, которое возвращает createUnityInstance(). Дополнительную информацию о createUnityInstance() см. в разделе WebGL: сжатые сборки и конфигурация сервера.
- Удалена цель компоновщика asm.js в Unity 2019.1
- Обновления файлов сборки и кэширование данных добавлены в Unity 2020.1
Источник: unityhub.ru
Браузеры с поддержкой Unity Web Player
Некоторые пользователи любят поиграть в браузерные приложения, но определенные из них были разработаны на движке Unity и, соответственно, требуют наличия установленного Unity Web Player на компьютере. Только после инсталляции этого компонента такая портированная игра сможет без проблем запуститься. Однако иногда юзер сталкивается с тем, что его браузер не поддерживает эту технологию. Единственным выходом в таком случае будет подбор подходящего веб-обозревателя, о чем мы и хотели бы поговорить в рамках этой статьи.
Internet Explorer
Internet Explorer — знакомый всем пользователям Windows браузер, но мало используемый. Обычно он запускается один раз — для скачивания другого веб-обозревателя. Это не значит, что стоит навсегда забыть о таком программном обеспечении. Одна из последних версий — IE 11 — хорошо справляется с запуском приложений на Unity Web Player, и вы сможете без каких-либо проблем провести время в любимой игре.
Единственное нужно учитывать, что реализация Unity Web Player невозможна в старых сборках Internet Explorer, а также перед стартом игры рекомендуется убедиться в том, что на компьютере установлена актуальная версия необходимого компонента. Упомянутый обозреватель не нужно скачивать, он по умолчанию установлен во всех операционных системах Виндовс.
Microsoft Edge
В Windows 10 появился новый встроенный веб-обозреватель, предоставляющий массу полезных функций, и он способен составить конкуренцию уже полюбившимся многим проводникам в интернет. Что касается его совместимости с рассматриваемой сегодня технологией, компания-разработчик за время работы над Edge старалась делать все, чтобы максимально быстро примкнуть к рядам софта с поддержкой WebGL, но сделать это сразу не получилось. Впрочем, сейчас Microsoft Edge указан как совместимый с Unity браузер и может быть использован для запуска игр.
Помимо этого, Edge достаточно удобный, автоматически обновляется с выходом новых дополнений для Виндовс и является вполне достойным кандидатом на пост использующегося по умолчанию браузера. Однако ничего вам не мешает задействовать его только для игр, а другую работу продолжать в привычной программе.
Mozilla Firefox
Mozilla Firefox — один из самых популярных браузеров с открытым исходным кодом, что делает его свободно распространяемым на разных платформах, в том числе и Windows. Стабильная работа с Unity Web Player поддерживается только до версии 42, во всех последующих модульная технология была удалена и больше никаким образом не функционирует. Единственный способ взаимодействия с такими приложениями — использование сборки ESR, которая предназначена для системных администраторов. В ней поддержка NPAPI существует до сих пор и, скорее всего, никуда не исчезнет.
Что касается общей функциональности этого обозревателя, он выполняет все те же задачи, что и большинство других аналогов. Некоторые юзеры недовольны большим потреблением системных ресурсов, что значительно снижает общую производительность компьютера, однако Mozilla Firefox в этом плане показывает далеко не худший вариант по сравнению с ближайшими конкурентами.
Safari
Сейчас браузер Safari в основном используется только обладателями компьютеров на платформе MacOS, поскольку выход новых версий для Виндовс был прекращен еще в 2012 году. Он до сих пор поддерживает технологию NPAPI и корректно взаимодействует со всеми подключаемыми модулями, в том числе и с Unity Web Player.
Недостаток заключается в том, что юзерам на Windows придется пользоваться устаревшим ПО, что может вызывать трудности при выполнении каких-либо других задач. Safari распространяется бесплатно, прост в установке и понятии интерфейса, доступен для скачивания на официальном сайте разработчиков.
Netscape Navigator
Изначально технология NPAPI, которая нужна и для дополнения Unity, была создана именно для браузера Netscape Navigator. Спустя некоторое время прекратился выход обновления, а в скорости компания-разработчик отказались от поддержки этого веб-обозревателя. Однако если загрузить последнюю версию этой программы, игры на Unity там будут работать без каких-либо проблем.
Минусы использования Netscape Navigator точно такие же, как и у предыдущего представителя — неактуальность, создающая сложности в повседневном использовании. Если вам нужен браузер только для запуска приложений, упомянутую программу можно взять на вооружение.
Google Chrome
Конечно, Google Chrome считается одним из самых популярных в мире браузеров, но его разработчики отказались от поддержки NPAPI еще в 2015 году. Из-за этого запуск Java, Unity и Flash Player здесь становится невозможным. Единственным выходом для юзеров остается поиск старой версии веб-обозревателя, где эта технология еще присутствовала, но никто не рекомендует устаревшие сборки к использованию.
Скачать Google Chrome
На этом наша статья подходит к своему логическому завершению. Как видите, решений для запуска приложений на Unity Web Player не так много и придется постараться, чтобы отыскать подходящий браузер. Мы же постарались облегчить вам эту задачу, показав доступные варианты.
Мы рады, что смогли помочь Вам в решении проблемы.
Источник: lumpics.ru