Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Експорт пакетів, патчів та модів

Випадки використання

Часто хочеться додати функціональність до своєї гри після її розгортання.

Наприклад...

  • Зміст, який можна завантажити: можливість додавати функції та вміст у гру.

  • Патчі: можливість виправити помилку, яка присутня у створеному продукті.

  • Моди: надайте іншим людям можливість створювати контент для своєї гри.

Ці інструменти допомагають розробникам розширити свою розробку після початкового випуску.

Огляд файлів PCK/ZIP

Godot дозволяє це за допомогою функції під назвою паки ресурсів (файли PCK з розширенням .pck або ZIP-файли).

Переваги:

  • покрокові оновлення / виправлення

  • пропонує DLC

  • пропонує підтримку модів

  • не потрібне розкриття вихідного коду для модів

  • більш модульна структура проєкту

  • користувачі не повинні замінювати всю гру

Перший етап їх використання включає експорт та доставку проєкту гравцям. Потім, коли пізніше потрібно додати функціональність або контент, оновлення просто доставляють користувачам у вигляді PCK/ZIP-файлів.

Файли PCK/ZIP зазвичай містять, але не обмежуються:

  • скрипти

  • сцени

  • шейдери

  • моделі

  • текстури

  • звукові ефекти

  • музику

  • будь-який інший актив, придатний для імпорту в гру

Файли PCK/ZIP можуть бути навіть зовсім іншим проектом Godot, який оригінальна гра завантажує під час виконання.

Можна одночасно завантажувати файли PCK та ZIP як додаткові пакети. Див. Формати файлів PCK та ZIP для порівняння двох форматів.

Дивись також

Якщо ви хочете завантажувати окремі файли під час виконання (не упаковані в PCK або ZIP-архів Godot), розгляньте можливість використання Завантаження та збереження виконавчого файлу. Це корисно для завантаження контенту, створеного користувачем не за допомогою Godot, без необхідності пакування модів у певний формат файлу.

Недоліком цього підходу є те, що він менш прозорий для ігрової логіки, оскільки не отримає такого ж користі від управління ресурсами, як файли PCK/ZIP.

Security concerns

It is important to note that loading PCK files for patches, mods, or extra content like expansions, will require you to code a system to automatically load files based on their location, and possibly name. This is a security vulnerability in three scenarios. One, a user downloads a mod with malicious code. Two, a malicious program already exists on an end user's PC and has replaced the PCK file with a malicious copy. Three, you are distributing patch PCK files through a game launcher and the system has become compromised.

Take this into consideration when determining how to use PCK files in a project. For situations where you have a patching system via a launcher, consider using asymmetric cryptography. You could store the public key in the main PCK, and sign patch or expansion PCK files with the private key. See the Crypto class for more information.

Генерування файлів PCK

In order to pack all resources of a project into a PCK file, open the project and go to Project > Export, select an export preset, and click on Export PCK/ZIP.

../../_images/export_pck.webp

Іншим методом було б export from the command line з --export-pack. Вихідний файл повинен мати розширення .pck або .zip. Процес експорту створить файл цього типу для вибраної платформи.

Patch PCK files

Generating Patch PCK files

To create a PCK file that only contains resources not present in the original release of a project, you would create a patch PCK file. This could be used for patches, mods, or expansions. For this to work you'll first need to have a PCK file for your project at the point of its initial release.

To generate a patch PCK file, within the export menu, and with your desired preset selected, click on the Patching tab. At the bottom is the Base Packs section. Click on the Add Pack button, then navigate to the PCK file you exported that contains everything in your project for its initial release.

Now, when you go to export a PCK file of your project again, if you have the Export as Patch button selected, only resources that have changed will be exported in the PCK file.

You can also add any patches you export to your base packs for future use. For example, adding patch.pck will ensure that patch2.pck will not include any resources from that first patch.

Delta encoding

Patch PCK files can be made smaller through the use of delta encoding. This makes it so that only the parts of a file that have been changed are updated. This does have a drawback of longer load times for the resources that are updated, and each patch for a resource cumulatively increases its load time.

There are two settings for delta encoding in addition to the filters:

  • Delta Encoding Compression Level: Controls how much compression is applied to the files. We do not recommend any more than the default of 19. Beyond that more memory is needed for export and import for significantly fewer gains. Any positive values will have the same decompression speed, however export will take longer the higher the number is. Negative values enable fast mode, which means larger files, but the decompression speed is higher.

  • Delta Encoding Minimum Size Reduction: Controls how much size has to be saved at minimum for compression to be used on an individual file. For example, at a level of 10%, if the file size can only be reduced by 5%, then the file won't use delta encoding.

The default compression level, 19, is the highest recommended level.

For the smallest patch size possible we recommend turning off compression for any resources you want to patch. Even if your base PCK files were compressed that shouldn't cause an issue.

There are several places compression can be disabled for different resources:

  • Import settings related to compression on individually imported resources, such as translation or 3D model files

  • Compress Binary Resources in the editor settings

  • GDScript Export Mode in the Scripts tab of an export preset

Примітка

After disabling Compress Binary Resources you must delete the contents of your projects .godot/imported/ folder, then closing and open the project again to re-generate it.

It's important to note that when you export a delta encoded patch on top of previous patches, the packs you list under Base Packs in the Patching tab must be the exact same files that are loaded by the game at runtime, in the exact order they are loaded in. Re-exporting previous versions may end up being slightly different, due to non-determinism in Godot's export process, which can cause the patching to fail. This only applies to delta encoded patches, regular ones don't have this issue.

Відкриття 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")

Попередження

За замовчуванням, якщо ви імпортуєте файл із тим самим шляхом/ім’ям, що й у вашого проєкту, імпортований файл замінить його. На це слід звернути увагу під час створення 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().

Modding considerations

If one wishes to support mods for their game, they will need their users to create similarly exported files. Assuming the original game expects a certain structure for the PCK's resources, and/or a certain interface for its scripts, then one of two things has to be done.

  1. The developer must document these expected structures/

    interfaces, expect modders to install Godot Engine, and then also expect those modders to conform to the documentation's defined API when building mod content for the game (so that it will work). Users would then use Godot's built in exporting tools to create a PCK file, as detailed above.

  2. The developer uses Godot to build a GUI tool for adding their exact API

    content to a project. This Godot tool must either run on a tools-enabled build of the engine or have access to one (distributed alongside or perhaps in the original game's files). The tool can then use the Godot executable to export a PCK file from the command line with OS.execute(). The game itself shouldn't use a tool-build of the engine (for security), so it's best to keep the modding tool and game separate.