Экспортирование пакетов, патчей и модов
Случаи использования
Зачастую возникает желание добавить функциональность в игру уже после ее развертывания.
Примеры этого включают...
Загружаемый контент: возможность добавлять функции и контент в свою игру.
Патчи: возможность исправить ошибку, которая присутствует в отправленном продукте.
Моды: предоставить другим людям возможность создавать контент для своей игры.
Эти инструменты помогают разработчикам расширить свою разработку за пределы первоначального выпуска.
Обзор файлов PCK/ZIP
Godot делает это возможным с помощью функции, называемой resource packs (файлами PCK с расширением .pck или файлами ZIP).
Преимущества:
дополнительные обновления/патчи
даёт возможность создавать DLC
даёт возможность поддержки модификаций(модов)
нет необходимости раскрывать исходный код для модов
более модульная структура проекта
пользователям не нужно заменять всю игру
Первая часть их использования включает экспорт и доставку проекта игрокам. Затем, когда позже требуется добавить функциональность или контент, они просто доставляют обновления пользователям через файлы PCK/ZIP.
Файлы PCK/ZIP обычно содержат, помимо прочего:
скрипты
сцены
шейдеры
модели
текстуры
звуковые эффекты
музыка
любой другой ассет, пригодный для импорта в игру
Файлы PCK/ZIP могут даже представлять собой совершенно другой проект Godot, который оригинальная игра загружает во время выполнения.
Можно одновременно загружать файлы PCK и ZIP в качестве дополнительных пакетов. Сравнение двух форматов см. в разделе PCK по сравнению с форматами файлов ZIP Pack.
См. также
Если вы хотите загрузить свободные файлы во время выполнения (не упакованные в PCK или ZIP-архив Godot), рассмотрите возможность использования Загрузка и сохранение файла времени выполнения. Это полезно для загрузки пользовательского контента, созданного не с помощью Godot, и не требует от пользователей упаковывать свои моды в определенный формат файла.
Недостатком такого подхода является то, что он менее прозрачен для игровой логики, поскольку не позволяет использовать те же преимущества управления ресурсами, что и файлы PCK/ZIP.
Создание файлов PCK
Чтобы упаковать все ресурсы проекта в PCK-файл, откройте проект, выберите Project > Export и нажмите Export PCK/ZIP. Также убедитесь, что при этом выбран шаблон экспорта.
Другой метод — export from the command line с помощью --export-pack. Выходной файл должен иметь расширение .pck или .zip. В процессе экспорта будет создан файл этого типа для выбранной платформы.
Примечание
Если кто-то хочет поддерживать моды для своей игры, им потребуется, чтобы их пользователи создавали файлы, экспортируемые аналогичным образом. Предполагая, что исходная игра ожидает определенной структуры ресурсов PCK и/или определенного интерфейса для своих скриптов, то либо...
Разработчик должен опубликовать документацию по этим ожидаемым структурам/интерфейсам, ожидать, что моддеры установят Godot Engine, а затем также ожидать, что эти моддеры будут соответствовать заданному в документации API при создании мод-контента для игры (чтобы он работал). Затем пользователи будут использовать встроенные инструменты экспорта Godot для создания файла PCK, как описано выше.
Разработчик использует Godot для создания GUI-инструмента для добавления в проект своего точного содержимого API. Этот инструмент Godot должен работать на сборке движка с поддержкой инструментов или иметь доступ к нему (распространяемому вместе с исходными файлами игры или, возможно, в них). Затем инструмент может использовать исполняемый файл Godot для экспорта PCK файла из командной строки с помощью OS.execute(). Сама игра не должна использовать инструментальную сборку движка (в целях безопасности), поэтому лучше держать инструмент для моддинга и игру отдельно.
Открытие файлов PCK или ZIP во время выполнения
Для загрузки файла PCK или ZIP используется синглтон ProjectSettings. В следующем примере ожидается наличие файла mod.pck в каталоге исполняемого файла игры. Файл PCK или ZIP содержит в своем корневом каталоге тестовую сцену mod_scene.tscn.
func _your_function():
# This could fail if, for example, mod.pck cannot be found.
var success = ProjectSettings.load_resource_pack(OS.get_executable_path().get_base_dir().path_join("mod.pck"))
if success:
# Now one can use the assets as if they had them in the project from the start.
var imported_scene = load("res://mod_scene.tscn")
private void YourFunction()
{
// This could fail if, for example, mod.pck cannot be found.
var success = ProjectSettings.LoadResourcePack(OS.get_executable_path().get_base_dir().path_join("mod.pck));
if (success)
{
// Now one can use the assets as if they had them in the project from the start.
var importedScene = (PackedScene)ResourceLoader.Load("res://mod_scene.tscn");
}
}
Предупреждение
По умолчанию, если вы импортируете файл с тем же путем/именем, что и у файла, который уже есть в вашем проекте, импортируемый файл заменит его. На это следует обращать внимание при создании DLC или модов. Эту проблему можно решить, используя инструмент, который изолирует моды в определенной подпапке mods.
Однако это также способ создания патчей для собственной игры. Такой PCK/ZIP-файл может исправить содержимое ранее загруженного PCK/ZIP-архива (поэтому порядок загрузки пакетов имеет значение).
Чтобы отказаться от этого поведения, передайте false в качестве второго аргумента функции ProjectSettings.load_resource_pack().
Примечание
Для проекта C# вам необходимо сначала создать DLL и поместить его в каталог проекта. Затем перед загрузкой пакета ресурсов вам необходимо загрузить этот DLL следующим образом: Assembly.LoadFile("mod.dll")
Устранение неполадок
Если вы загружаете пакет ресурсов и не замечаете никаких изменений, это может быть связано с тем, что пакет был загружен слишком поздно. Это особенно актуально для сцен меню, которые могут предварительно загружать другие сцены, используя preload(). Это означает, что загрузка пакета в меню не повлияет на другую сцену, которая уже была предварительно загружена.
Чтобы избежать этого, необходимо загрузить пакет как можно раньше. Для этого создайте новый скрипт autoload и вызовите ProjectSettings.load_resource_pack() в скрипте автозагрузки функцию _init(), скорее, чем _enter_tree() или _ready().
Подведение итогов
В этом руководстве объясняется, как добавлять моды, патчи и DLC в игру. Самое важное — определить, как планируется распространять будущий контент для игры, и разработать рабочий процесс, адаптированный под эти цели. Godot должен сделать этот процесс плавным, независимо от выбранного разработчиком пути.