Первым делом создаем проект в Solution. Создавать я его буду в Solution под названием ArtaServices. Первоначально данный Solution создавался для работы с T4 Template с заделом на будущее. ![Создаем проект с сервером](images/Создаем%20проект%20с%20сервером.png) <br> Далее, необходимо добавить Assembly Definition (asmdef) в Unity-проект. В папки View, Core. И назвать одноименно с папками. Заметка: «Как настроить Assembly Definition (asmdef) в Проекте» После добавления asmdef, необходимо запустить игру в Unity, чтобы скомпилировались DLL Core и View. <br> Добавляем dll под названием Core из Unity в проект сервера. Заметка: «Как подключить DLL к чистому c# проекту». ![Создаем проект с сервером-1](images/Создаем%20проект%20с%20сервером-1.png) <br> Олег мне скинул свою библиотеку под названием «SolonityTcpTransport» для работы с сетью на транспортном уровне. Он мне его скинул уже как проект (исходный код), поэтому мне его нужно просто добавить в сервер-проект. Для этого мне нужно скопировать папку SolonityTcpTransport и закинуть в solution, где находится сервер-проект. На скриншот ниже показано, куда нужно закинуть папку. ![Создаем проект с сервером-2](images/Создаем%20проект%20с%20сервером-2.png) <br> Далее, нужно дать знать riderу, что ему подкинули проект. ![Создаем проект с сервером-3](images/Создаем%20проект%20с%20сервером-3.png) ![Создаем проект с сервером-4](images/Создаем%20проект%20с%20сервером-4.png) <br> Далее, нужно подключить к сервер-проекту наш SolonityTcpTransport-проект ![Создаем проект с сервером-5](images/Создаем%20проект%20с%20сервером-5.png) ![Создаем проект с сервером-6](images/Создаем%20проект%20с%20сервером-6.png) Убеждаемся, что успешно подключено. ![Создаем проект с сервером-7](images/Создаем%20проект%20с%20сервером-7.png) <br> Далее, нам нужно настроить автоматическую пересборку запущенного сервер-проекта, если Core-DLL была изменена. Это актуально, когда я изменяю логику игры (в Core-части) в Unity, а запущенный сервер-проект самостоятельно перезапускается из-за изменений в Unity. ![Создаем проект с сервером-8](images/Создаем%20проект%20с%20сервером-8.png) ![Создаем проект с сервером-9](images/Создаем%20проект%20с%20сервером-9.png) ![Создаем проект с сервером-10](images/Создаем%20проект%20с%20сервером-10.png) ![Создаем проект с сервером-11](images/Создаем%20проект%20с%20сервером-11.png) dotnet watch run --project Server/Server.csproj --no-hot-reload Где Server/Server.csproj - меняем путь на необходимый проект. Показываю для наглядности как выглядит путь в Finder. ![Создаем проект с сервером-12](images/Создаем%20проект%20с%20сервером-12.png) Также Олег сказал отключить Execute in the terminal. ![Создаем проект с сервером-13](images/Создаем%20проект%20с%20сервером-13.png) Опция "Execute in terminal" определяет, где будет выполняться ваше приложение. Выбор между встроенным терминалом и эмулятором терминала в Rider зависит от ваших потребностей: - Встроенный терминал: Когда вы выбираете "Execute in terminal", ваше приложение запускается во встроенном терминале Rider. Этот терминал имитирует функциональность командной строки и предоставляет доступ ко всем его функциям, включая выполнение произвольных команд, доступ к файловой системе и т.д. Это может быть полезно, если ваше приложение использует или взаимодействует с этих функциями. - Эмулятор терминала: Когда вы не выбираете "Execute in terminal", ваше приложение запускается во внутреннем эмуляторе терминала Rider. Это означает, что вывод вашего приложения отображается в отдельном окне вывода, и вам не предоставляется доступ к командной строке в контексте выполнения вашего приложения. Этот режим обеспечивает более контролируемый и изолированный контекст для вашего приложения и может быть предпочтительнее, если вы не хотите, чтобы ваше приложение взаимодействовало с командной строкой. <br> Далее, открываем Server.csproj (Выделяем проект и ⌘ + ↓) и прописываем данные строки: ``` <ItemGroup> <Watch Include="..\..\ArtaUnity\Library\ScriptAssemblies\Core.dll"/> </ItemGroup> ``` Этот фрагмент кода используется для добавления пути к определенному файлу или директории в список "Watch". Это означает, что Rider будет "наблюдать" за изменениями в указанном файле или директории и Rider автоматически перекомпилирует проект при обнаружении изменений. То есть, когда dll изменится, Rider сам заново соберет и запустит наш сервер. ![Создаем проект с сервером-14](images/Создаем%20проект%20с%20сервером-14.png) Теперь при запуске проект-сервера нужно это делать через только что настроенную конфигурацию ![Создаем проект с сервером-15](images/Создаем%20проект%20с%20сервером-15.png) Далее нам нужно настроить конфигурацию для сборки проекта SolonityTcpTransport в DLL. ![Создаем проект с сервером-16](images/Создаем%20проект%20с%20сервером-16.png) ![Создаем проект с сервером-17](images/Создаем%20проект%20с%20сервером-17.png) Target location - указываем, куда будет сохраняться собранная DLL от проекта. Мы будем сохранять DLL прямо в Unity-проект. Создадим внутри папки Assets новую папку Plugins и укажем путь до нее. ![Создаем проект с сервером-18](images/Создаем%20проект%20с%20сервером-18.png) Когда ставил галку на чекбокс «Store as project file», то не менял путь по умолчанию. (См скрин ниже) ![Создаем проект с сервером-19](images/Создаем%20проект%20с%20сервером-19.png) Опция "Store as project file" позволяет определить, где будут храниться настройки конфигурации (которую мы вот сейчас настраиваем и хотим создать) Если вы выбираете этот чекбокс, настройки конфигурации запуска будут сохранены в файле внутри вашего проекта. Это означает, что эти настройки могут быть помещены в систему контроля версий и разделяемы с другими членами вашей команды. Это может быть особенно полезно, если у вас есть определенные настройки, которые должны быть одинаковы для всех членов команды. Если этот чекбокс не выбран, настройки конфигурации запуска сохраняются только на вашем локальном компьютере и не добавляются в ваш проект или в систему контроля версий. Это может быть полезно для личных настроек, которые не должны быть общими для всех членов команды. Теперь когда нам нужно будет собрать DLL из проекта SolonityTcpTransport, то мы будем это делать через созданную конфигурацию «Publish SolonityTcpTransport to folder» вот таким образом: ![Создаем проект с сервером-20](images/Создаем%20проект%20с%20сервером-20.png) ![Создаем проект с сервером-21](images/Создаем%20проект%20с%20сервером-21.png) Либо же вот так ![Создаем проект с сервером-22](images/Создаем%20проект%20с%20сервером-22.png) При сборке SolonityTcpTransport-проекта будут создаваться вот такие 3 файла (остальные 3 файла - это meta-файлы, которые создает Unity и хранит там свои конфиги) ![Создаем проект с сервером-23](images/Создаем%20проект%20с%20сервером-23.png) ### NLog Далее, устанавливаем nuget-пакет под названием NLog для сервер-проекта ![Создаем проект с сервером-24](images/Создаем%20проект%20с%20сервером-24.png) <br> Далее, нужно добавить NLog.config в корневую директорию сервер-проекта: Что добавлять: ![](NLog.config) Куда добавлять: ![Создаем проект с сервером-25](images/Создаем%20проект%20с%20сервером-25.png) <br> Далее, открываем Server.csproj (Выделяем проект и ⌘ + ↓) и прописываем данные строки: ``` <ItemGroup> <None Update="NLog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> ``` Этот фрагмент кода отвечает за копирование указанного файла (в данном случае, \`NLog.config`) в выходную директорию каждый раз, когда проект собирается. Вкратце, эта запись делает следующее: - `<None Update="NLog.config">` говорит .NET, что нужно обновить действия для указанного файла. В данном случае файл называется `NLog.config`. - `<CopyToOutputDirectory>Always</CopyTo0utputDirectory>` указывает, что этот файл нужно всегда копировать в выходную директорию при сборке проекта. К слову, помимо того, что это Олег мне сказал так сделать, я прошелся по [документации](https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application) NLog и увидел такое же требование. ![Создаем проект с сервером-26](images/Создаем%20проект%20с%20сервером-26.png) <br> ### Отладка через debug Чтобы отлаживать сервер-проект, нужно включать debug таким образом: ![Создаем проект с сервером-27](images/Создаем%20проект%20с%20сервером-27.png) Далее, скорее всего, всплывет такая ошибка: A fatal error was encountered. The library 'libhostpolicy.dylib' required to execute the application was not found in '/usr/local/share/dotnet'. ![Создаем проект с сервером-28](images/Создаем%20проект%20с%20сервером-28.png) Решением будет добавить в Server.csproj такую строку: ``` <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> ``` Решение проблемы нашел Олег, просто загуглив ошибку при мне. Дал ссылку на [stackoverflow](https://stackoverflow.com/questions/47285243/a-fatal-error-was-encountered-the-library-libhostpolicy-so-required) Примечание: возникла снова данная ошибка, хотя я уже воспользовался решением. Закрытие и открытие rider решило проблему. ![Создаем проект с сервером-29](images/Создаем%20проект%20с%20сервером-29.png) Строка `<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>` в файле .csproj говорит системе сборки .NET Core о необходимости генерировать файл .runtimeconfig.json для выполняемого приложения. Файл .runtimeconfig.json используется для настройки среды выполнения .NET Core приложения и может содержать такую информацию, как версия среды выполнения .NET Core, которую следует использовать, и различные настройки конфигурации, такие как параметры сборки мусора. Если выполняемое приложение не может найти библиотеку `libhostpolicy.dylib`, это может означать, что ему необходим файл .runtimeconfig.json для правильного определения окружения во время выполнения. Добавление этой строки в .csproj гарантирует, что файл .runtimeconfig.json будет сгенерирован при сборке, что должно помочь исправить ошибку.