Как обычно, кратко описываю суть, подробности спрашивайте в комментах.
1️⃣ На каждую площадку и тип сборки я сделал по отдельной кнопки в меню:
[MenuItem("Build/Yandex")]
public static void BuildYandex()
{
BuildYandex(BuildOptions.None);
}
[MenuItem("Build/Yandex [Dev]")]
public static void BuildYandexDev()
{
BuildYandex(BuildOptions.Development);
}2️⃣ Есть основной метод Build, который непосредственно запускает сборку в Unity.
var buildPlayerOptions = new BuildPlayerOptions
{
scenes = new[] { "Assets/Scenes/Initialization Scene.unity" },
locationPathName = locationPathName,
target = buildTarget,
options = BuildOptions.CompressWithLz4 | buildOptions,
extraScriptingDefines = extraScriptingDefines.ToArray()
};
var report = BuildPipeline.BuildPlayer(buildPlayerOptions)
В него передаются параметры сборки, специфичные для каждой площадки. Например:
private static void BuildYandex(BuildOptions buildOptions)
{
Build(PlatformType.Yandex, new List<string> { "PLATFORM_YANDEX" }, BuildTarget.WebGL, "Build/Yandex", buildOptions);
}
Здесь
▶️
PlatformType.Yandex – это мой enum со всеми площадками▶️
new List<string> { "PLATFORM_YANDEX" } – это Scripting Define, в эту штуку я оборачиваю код, специфичный только для Яндекса ( ещё могу передать SHOWCASE – код для шоукейсов)▶️
BuildTarget.WebGL – непосредственно платформа▶️
"Build/Yandex" – целевая папка для билда▶️
buildOptions – необходимые опции, например Development3️⃣ Есть класс с конфигами для каждой платформы
[Serializable]
public class PlatformConfig
{
[field: SerializeField] public string ProductName { get; private set; } = "drill_and_dig";
[field: SerializeField] public Monetization Monetization { get; private set; } = Monetization.Free2Play;
[field: SerializeField] public AdBackend AdBackend { get; private set; } = AdBackend.None;
[field: SerializeField] public string SupportUrl { get; private set; } = "mailto:support@honeycombs.games";
...
В рантайме нужный конфиг определяется на основе Scripting Defines
[UsedImplicitly]
public PlatformType GetTypeProd()
{
#if PLATFORM_YANDEX
return PlatformType.Yandex;
#elif PLATFORM_VK_PLAY_DEMO
return PlatformType.VkPlayDemo;
...
и в коде я использую эти настройки через методы в статическом классе Platform:
if (Platform.IsF2P())
{
adManager.ShowRewarded(rewarded =>
{
if (rewarded) Fire();
}, type.ToString());
}
else
{
itemsCount.Coins().ApplyChange(-GetCost());
Fire();
}
4️⃣ Это все основные моменты. Кроме этого, у меня автоматизировано:
1) Автоматическое вписывание версии игры в конфиги аналитики и в настройки Unity.
2) Хак для Text Mesh Pro, чтобы шрифт не попадал в основной билд, а подгружался через Addressables
3) Проверка цепочек квестов на правильность.
4) Определение, подключен ли телефон к компу, чтобы сразу запустить на нем билд.
5) Исключение библиотек из Андроид зависимостей в зависимости от площадки (RuStore/Google Play)
6) В dev режиме доступна панель разработчика с читерскими кнопками (и отключены лидерборды)
7) На Андроиде, если собираю в dev режиме, игра собирается в Mono, а не IL2CPP, т. к. в Mono билд собирается в пять раз быстрее.
8) На Андроиде автоматически вписывается пароль для кейстора (Unity его не сохраняет)
9) Подключаю разные JS SDK (Яндекс/ВКонтакте)
Если что-то непонятно или про что-то нужно рассказать подробнее, спрашивайте.
#самый_крутяк