using System; using System.IO; using System.Text.RegularExpressions; using UnityEditor; using UnityEditor.Android; using UnityEngine; // Починка сборки Android на этом компьютере (05.11): // 1. Имя пользователя Windows с русскими буквами (C:\Users\Вальдемар). Gradle хранит свои файлы в // C:\Users\<имя>\.gradle, и одна из его программ (prefab) не понимает такой путь -- сборка падает. // Перед сборкой переносим папку Gradle в C:\gradle (переменная GRADLE_USER_HOME для процесса Unity, // сборщик её наследует). Ничего в Windows менять не нужно. // 2. Два Kotlin в зависимостях (1.8 у Unity и 1.6 у одного из пакетов) -- "Duplicate class kotlin...". // В сгенерированный проект Gradle дописываем правило: все kotlin-stdlib -- одной версии 1.8.22. [InitializeOnLoad] public class AndroidBuildFixes : IPostGenerateGradleAndroidProject { const string GradleHome = @"C:\gradle"; const string Marker = "// Bogatyri: kotlin-stdlib одной версии"; static AndroidBuildFixes() { EnsureAsciiGradleHome(); } public static void EnsureAsciiGradleHome() { string current = Environment.GetEnvironmentVariable("GRADLE_USER_HOME"); if (!string.IsNullOrEmpty(current) && IsAscii(current)) return; if (IsAscii(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))) return; // путь и так латиницей try { Directory.CreateDirectory(GradleHome); Environment.SetEnvironmentVariable("GRADLE_USER_HOME", GradleHome, EnvironmentVariableTarget.Process); Debug.Log("[СБОРКА] Папка Gradle: " + GradleHome + " (в пути пользователя есть русские буквы)"); } catch (Exception e) { Debug.LogWarning("[СБОРКА] Не удалось задать GRADLE_USER_HOME: " + e.Message); } } static bool IsAscii(string s) => !Regex.IsMatch(s ?? "", @"[^\u0000-\u007F]"); public int callbackOrder => 999; // path -- папка unityLibrary сгенерированного проекта public void OnPostGenerateGradleAndroidProject(string path) { string root = Directory.GetParent(path).FullName; foreach (var file in new[] { Path.Combine(root, "launcher", "build.gradle"), Path.Combine(path, "build.gradle") }) { if (!File.Exists(file)) continue; string text = File.ReadAllText(file); if (text.Contains(Marker)) continue; text += "\n" + Marker + "\n" + "configurations.all {\n" + " resolutionStrategy.eachDependency { details ->\n" + " if (details.requested.group == 'org.jetbrains.kotlin' && details.requested.name.startsWith('kotlin-stdlib')) {\n" + " details.useVersion('1.8.22')\n" + " }\n" + " }\n" + "}\n"; File.WriteAllText(file, text); } } }