К содержимому
Установка
На этой странице

Установка

Как подключить SDK к проекту на .NET или Unity и проверить, что он читает ваши уровни

Код SDK лежит в github.com/bullet-hero/sdk. Лицензия MIT

.NET

Пакет BulletHero.SDK пока не опубликован на nuget.org. Соберите его из исходников:

git clone https://github.com/bullet-hero/sdk.git
cd sdk
dotnet build -c Release BH.SDK.csproj   # bin~/Release/BH.SDK.dll и BH.SDK.xml
dotnet pack  -c Release BH.SDK.csproj   # bin~/Release/BulletHero.SDK.<version>.nupkg

Затем подключите одно из двух:

  • .nupkg из локальной папки: dotnet add package BulletHero.SDK --source <папка>. Три зависимости придут вместе с ним
  • BH.SDK.dll напрямую. Тогда три пакета ниже добавьте сами: ссылка на DLL свои зависимости не приносит

Зависимости, все из NuGet:

ПакетВерсияЗачем
Newtonsoft.Json13.0.3JSON
BouncyCastle.Cryptography2.7.0OpenPGP для уровней под паролем
SharpZipLib1.4.2tar и zip (gzip берётся из BCL)

Детали сборки

  • сборка называется BH.SDK.dll, рядом с ней лежит XML-документация
  • цель - netstandard2.1, язык - C# 9. Это те же числа, что у Unity-проекта, поэтому одни и те же исходники собираются и в Unity, и без него
  • папки вывода - bin~ и obj~. Тильда нужна, потому что Unity не импортирует папки с тильдой на конце

Unity

Игра подключает SDK как git submodule:

git submodule init
git submodule add -f https://github.com/bullet-hero/sdk.git Assets/Plugins/BulletHeroSDK

Удаление - git rm -r -f Assets/Plugins/BulletHeroSDK

Что Unity-проект должен дать сам:

  • Newtonsoft.Json через пакет com.unity.nuget.newtonsoft-json
  • BouncyCastle.Cryptography и SharpZipLib из NuGet (игра ставит их через NuGetForUnity)
  • scripting define BHSDK_UNITY в Player Settings. Без него UnityIntegration выберет ветку без движка
  • BH.SDK.Roslyn.dll в корне SDK. Unity применяет анализатор только к сборке из его папки и к сборкам, которые на неё ссылаются. Перенесённый в другое место, он ничего не анализирует

В корне репозитория лежит package.json с именем com.vertoker.bullet-hero-sdk и минимальной версией Unity 6000.0. Поэтому Package Manager может добавить SDK и по git URL. Разработчики этот путь не используют и не описывают

Проверка: пример ConsoleSmoke

Samples~/ConsoleSmoke - консольное приложение на net8.0. Оно ссылается на собранную BH.SDK.dll, ровно как сторонний инструмент. Приложение читает папку уровня, печатает имя, число объектов и поколение. Затем прогоняет уровень туда и обратно через JSON и .blob

dotnet build -c Release Samples~/ConsoleSmoke/ConsoleSmoke.csproj
dotnet Samples~/ConsoleSmoke/bin~/Release/net8.0/ConsoleSmoke.dll <папка уровня>
Код выходаЗначение
0всё совпало
1неверные аргументы
2не найден level.* или metadata.*
3прогон туда и обратно не совпал
4файл новее этого SDK

Вывод на встроенном уровне игры new-zero-demo (записан на SDK 0.15.0):

BH.SDK 0.15.0, model generation 1
name:       New zero demo
objects:    782
generation: 1 (Blob)
round trip Json: equal (1505132 bytes)
round trip Blob: equal (680751 bytes)
exit 0

Дальше - Формат уровня

Из чего состоит SDK

ЧастьЧто этоНужен Unity
BH.SDKядро: модели, сериализация, версии, правила, валидация, архивы, публикация, генераторы, связь с Afterbeatнет
UnityIntegrationтонкий слой, где каждый файл компилируется и с Unity, и без него (#if BHSDK_UNITY), например логгер Catнет: вне Unity он компилируется прямо в ядро
UnityExtensionsпреобразования в типы Unity, 2D-трансформы, движение аватарада, всегда
BH.SDK.Roslynанализаторы и генератор исходников. Для каждой модели с [GenerateModel] он пишет Equals, копирование, кодеки JSON и .blob и обход валидацииработает во время компиляции

Файл модели содержит только её поля и конструкторы. Всё повторяющееся пишет генератор. Поэтому поле нельзя забыть в одном из семи сгенерированных тел

Зачем отдельная библиотека

  • Уровни переживают игру. Уровень - это папка файлов в открытых форматах (JSON, tar.gz, zip, OpenPGP). Код, который их читает, тоже открыт. Уровень остаётся читаемым, даже если игры, которая его записала, больше нет
  • Связь с другими ритм-играми. Конвертация в Afterbeat (бывший Project Arrhythmia) и обратно уже есть в SDK. Подробнее - Связь с Afterbeat
  • Быстрые исправления. Дефект формата виден снаружи. Любой, кто читает код, может сообщить о нём или прислать исправление
  • Сторонние инструменты. Конвертер, валидатор, генератор уровней или мод работают с теми же моделями, что и игра. Восстанавливать их по файлам не нужно
  • Серверы. Ядро собирается без Unity как netstandard2.1. Поэтому сервер выполняет те же проверки над теми же моделями, что и клиент