logo
LIS PUBLICA
☰
  • Новое
  • Горячее
  • Сокровищница
  • Лучшее
  • Сообщества
  • Видео
  • Обсуждаемое
  • Поиск

VariusSoft
VariusSoft Сообщество: GameDev Опубликовано 12 часов назад
  • [моё]
  • GameDev
  • Godot Engine
  • Длиннопост
  • Программирование

Менеджер пакетов для Godot

Но не плагин, а вшитый прям в движок

36
Читалка

Стоит оговориться, что речь не просто про Godot как таковой. Потому как я сделал форк Redot'а (форка Godot'а) и там уже в исходниках движка внёс исправления.

Мне показалось странным, что такой базовой вещи, как менеджер пакетов нет в движке из коробки, поэтому я вооружился буквами и пошёл насыпать их в код. В качестве первого этапа разработки подключил АПИ NuGet'а, дальше в будущем планирую добавить добавление пакетов из гита и в последствии, думаю, это будет логично, планирую поднять собственный репозиторий, чтобы хранить там свои какие-то переиспользуемые пакеты или пакеты, предназначенные только для движка.

Вообще, если вы используете для работы не встроенный редактор скриптов, а VS, то стандартного нюгет пакета вполне хватит на первое время, но так как я сморю чуть дальше и чуть глубже, я пошёл по пути собственного инструмента. Дополнительно: я пишу на шарпе, а Годот по умолчанию работает с GDScript и шарп у него подключается отдельно. Я сбилдил свою версию так, чтоб она по умолчанию работала с шарпом.

И так, что же у нас тут по менеджеру пакетов?

В папочке modules/mono/editor/GodotTools/GodotTools/ создаём новую папку нашего инструмента, я назвал её NuGet на текущем этапе. При доработках думаю, переименую уже во что-то более универсальное.

Внутри папки создаётся три файла: NuGetManagerWindow.cs

Класс описывающий окно, наследует и имплементрирует ConfirmationDialog, ISerializationListener. Описать обязательно несколько методов:

    public override void _Ready()
        {
            Title = "NuGet Package Manager";
            Size = new Vector2I(800, 600);
            Exclusive = true;

            _apiClient = new NuGetApiClient();

            BuildUI();
            RefreshInstalledPackages();
        }

BuildUI и RefreshInstalledPackages соответственно это не обязательные прям с точки зрения Годота методы, просто я в них вынес нужную мне логику.

Второй класс NuGetPackageInfo - это буквально описание каждого пакета. То есть просто DTO для пакетов с основной информации:

    /// <summary>
    /// Represents a NuGet package from search results.
    /// </summary>
    public class NuGetPackageInfo
    {
        [JsonPropertyName("id")]
        public string Id { get; set; } = string.Empty;

        [JsonPropertyName("version")]
        public string Version { get; set; } = string.Empty;

        [JsonPropertyName("description")]
        public string Description { get; set; } = string.Empty;

        [JsonPropertyName("authors")]
        [JsonConverter(typeof(StringOrArrayConverter))]
        public List<string> Authors { get; set; } = new();

        [JsonPropertyName("projectUrl")]
        public string ProjectUrl { get; set; } = string.Empty;

        [JsonPropertyName("iconUrl")]
        public string IconUrl { get; set; } = string.Empty;

        [JsonPropertyName("totalDownloads")]
        public long TotalDownloads { get; set; }

        [JsonPropertyName("versions")]
        public List<NuGetVersionInfo> Versions { get; set; } = new();

        public string AuthorsString => string.Join(", ", Authors);
    }

Ну и NuGetApiClient – логично, что дёргает запросы в сторону нюгета, для получения информации о пакетах.

После того, как мы всё что нужно описали, надо отредактировать GodotSharpEditor.cs и добавить туда ссылку на наше окно, добавить пункт меню и его обработчик для открытия нашего окна

    _menuPopup.AddItem("NuGet Packages...".TTR(), (int)MenuOptions.NuGetPackages);
private enum MenuOptions
{
    CreateSln,
    NuGetPackages,
}
private void OpenNuGetManager()
        {
            if (!File.Exists(GodotSharpDirs.ProjectCsProjPath))
            {
                ShowErrorDialog("No C# project found. Create a C# solution first.".TTR());
                return;
            }

            if (_nugetWindow == null)
            {
                _nugetWindow = new NuGetManagerWindow();
                _nugetWindow.SetUnparentWhenInvisible(true);
            }

            EditorInterface.Singleton.PopupDialogCentered(_nugetWindow);
        }

На выходе получаем удобный способ управления внешними пакетами

Если есть упоротые, которые пойти по пути внесения правок в исходники движка, могу поделиться решением и скинуть архив с файликами.

Читать дальше...
9
+9 / -0
78%
0
Войти

Вход

Регистрация

Я не помню пароль

Войти через Google
Порог горячего 17
  • Thefoxinmyheart
    Thefoxinmyheart

    О, кажется я где-то это видела))))

    +1
  • rammdarkfunny
    rammdarkfunny

    Не, сковородка продырявлена и без бэка, должно быть норм)

    +1
  • rammdarkfunny
    rammdarkfunny

    Подозреваю, ещё две темы осталось, раз Месяц АРТа

    +2
Правила сайта
Пользовательское соглашение
О ПД
Принципы самоуправления
FAQ
Нашёл ошибку?
©2026 Varius Soft