Часто в играх необходимо получать обновления игрового баланса, обновлять профиль игрока, сохранять достижения и выдавать награды. Если хранить данные прямо в клиенте, то придется ждать публикации нового патча командой. Как более гибкое решение - получать конфигурацию и ресурсы для игры с внешнего сервера. В посте рассмотрим как можно из клиента Unity подключиться к простейшему сервису для получения от него сообщения. Для реализации сервиса возьмем библиотеку SignalR. Пример создания простейшего сервиса SiglanR и разворачивание его на Ubuntu. Демонстрация как подключить библиотеку из NuGet к Unity. Несколько советов, которые могут ускорить работу с ассетами под редактором Unity. Разбор нескольких частых ошибок при сборке на Android сторонних dll. По мере написания статьи количество деталей, которые хотелось бы показать, очень быстро росло, поэтому их отложим на следующие статьи и в этой мы не будем касаться: Для доступа к нашему сервису не будет использоваться HTTPS/SSL. Для релизных приложений использовать HTTPS/SSL необходимо. Не будем придираться к SOLID, пример небольшой и добавлять паттерны только чтобы они были не хочу. Не будет разворачивания ASP.NET Core из Docker. Пропустим Авторизацию в сервисе и управление правами доступа. Тема хорошая, затронем в следующий раз. Маппинг моделей с игрового сервера в клиент и шаринг кода между клиентом и сервером вынесем в следующую статью. Оптимизация трафика запросов. Использование инструментов подобных MessagePack. Обязательно вернемся к этому позже. Создаем решение из шаблона Web API Asp.NET Core. У Microsoft уже есть отличный пошаговый тутор на русском языке SignalR для ASP.NET Core с Blazor, возьмем его за основу. Запускать на сервис мы будем на Ubuntu.  Для начала поставим .NET SDK на машину: Проверяем установленную версию: Дальше мы соберем наш проект на машине с Ubuntu и оставим его висеть демоном. Сначала перейдем в каталог с нашим сервисом SignalR и выполним команду сборки: Опубликуем в нужной нам директории из которой планируем запускать: Нам достаточно, чтобы SIgnalR Hub висел в фоновом процессе, поэтому не будем придумывать лишнего. Нам хватит простой команды: Если теперь попробуем открыть с http://localhost:500 то увидим наше demo web приложение. Если наша машина имеет публичный ip, пусть это будет 53.53.53.53. Попытка открыть в браузере с другой машины http://53.53.53.53:5000 скажет нам лишь, что: “Не удается получить доступ к сайту”.  Проблема в редиректе. Решать ее будем через nginx. Сначала поставим его. Теперь добавим конфиг в /etc/nginx/sites-available для редиректа в наше приложение: Перезапускаем сервис nginx: В нашем демо сервисе SignalR мы зарегистрировали Hub под именем demohub: Теперь Hub будет доступен публично: http://53.53.53.53:5000/demohub Начнем с начала, получил саму библиотеку SignalR. Если вы попробуете просто взять пакет Microsoft.AspNetCore.SignalR.Client в NuGet, то наткнетесь на проблему, пакет не содержит зависимости.  Решим эту ошибку напряму скачав SignalR через NuGet CLI: Качаем NuGet CLI и сохраняем где вам удобно. Просим NuGet скачать нам SignalR. Теперь у нас все необходимые зависимости и сам клиент SignalR Если открыть один из скачанных пакетов, увидим следующее: На момент написания статьи LTS версия Unity - 2021.3.16f1. Эта версия поддерживает: .NET Standard 2.1 / 2.0 .NET Framework Это значит, что перед тем как добавлять в проект необходимо удалить версию для .NET Core. Если в игре вы используете только .NET Standard или .NET Framework, то оставьте только нужную версию.  Теперь можно добавить библиотеки в клиент игры. В своем demo я расположил их адресу: Assets/Plugins/Packages/SignalR Если вам необходимо использовать .NET Standard и .NET Framework версии библиотеки, то после добавления придется помочь Unity понять какая dll для какой версии. В документации по компиляции проекта под разные платформы можно найти нужные defines NET_STANDARD - Defined when building scripts against .NET Standard 2.1 API compatibility level on Mono and IL2CPP Дальше необходимо указать это ограничение компиляции для наших dll. Для .NET Standard должно так: А для .NET Framework необходимо поставить обратное ограничение: Dll в проект мы добавили много. Настройки для каждой можно выставить руками, но это утомительно. Поэтому напишем небольшой и глупый сприпт, который сделает работу сам. Одноразовые скрипты должны быть написаны максимально прямолинейно и понятно.  Кратко отмечу полезные моменты: Используйте AssetDatabase.StartAssetEditing/AssetDatabase.StopAssetEditing, для модификации группы ассетов, чтобы не ждать реимпорт каждого отдельного ассета. PluginImporter позволяет вам менять настройки dll и всего, что Unity относит к категории плагинов Теперь мы вызываем выполнение нашего скрипта через меню - Tools/Apply SignalR Constraints. После того как он закончит выполнение мы получим библиотеки разделенные по версии рантайма, который будем использовать. Теперь переключения между .NET Standard и .NET Framework не будут вызывать ошибок. Дальше мы напишем небольшой скрипт подключения к SignalR из под редактора. После чего приступим к сборке под Android и проверим наше приложение на устройстве. В Unity connection.StartAsync() может вызвать ошибку подключения. На устройстве она будет выглядеть следующим образом: Она может произойти, если в момент подключения у пользователя не было сети или сервер с сервисом хаба SignalR был не доступен. Мы дошли до этапа тестирования на устройстве. Тестировать будем на Android. Еще одно важное ограничение наш билд сразу будет под IL2CPP. И при первом запуске после сборки нас ждет ошибка. В сообщении будет сказано, что нужные для работы SignalR зависимости не найдены и создать инстанс интересующего нас типа невозможно. Причина ошибки в том, что Unity старается вырезать (https://docs.unity3d.com/Manual/ManagedCodeStripping.html) неиспользуемый код и библиотеки и порой под нож попадают и нужные нам зависимости. Чтобы починить эту проблему достаточно добавить файл link.xml. Документация по Unity linker. Для нас решением проблемы будет вот такой файл link.xml: После добавления указания линкеру и сборки, на старте ошибок быть уже не должно. Мы перешагнули главный страх многих новичков при работе с сервером в GameDev - получили первое сообщение от сервиса, который реализовали сами. В планах осветить дальше то, что не попало сюда из-за объема. А поскольку в игре, которую создаем сейчас для мета гейма выбрали именно SignalR, получится добавить реальных кейсов применения и проблем, с которыми столкнулись: Работа с дополнительными параметрами запросов под Unity, авторизация, HTTPS/SSL Сколько стоит сил и денег подключить облако для игры, какие плюсы и минусы это несет Оптимизация трафика и маппинг моделей между клиентом и сервером Как организовать обработку данных на клиенте и связать с ECS геймплеем На этом всё. Спасибо за внимание.P.S ссылка на мой telegram канал о разработке игр