Экспортирование пакетов, патчей и модов

Случаи использования

Зачастую возникает желание добавить функциональность в игру уже после ее развертывания.

Примеры этого включают...

  • Загружаемый контент: возможность добавлять функции и контент в свою игру.

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

  • Моды: предоставить другим людям возможность создавать контент для своей игры.

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

Обзор файлов 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. Также убедитесь, что при этом выбран шаблон экспорта.

../../_images/export_pck.webp

Другой метод — export from the command line с помощью --export-pack. Выходной файл должен иметь расширение .pck или .zip. В процессе экспорта будет создан файл этого типа для выбранной платформы.

Примечание

Если кто-то хочет поддерживать моды для своей игры, им потребуется, чтобы их пользователи создавали файлы, экспортируемые аналогичным образом. Предполагая, что исходная игра ожидает определенной структуры ресурсов PCK и/или определенного интерфейса для своих скриптов, то либо...

  1. Разработчик должен опубликовать документацию по этим ожидаемым структурам/интерфейсам, ожидать, что моддеры установят Godot Engine, а затем также ожидать, что эти моддеры будут соответствовать заданному в документации API при создании мод-контента для игры (чтобы он работал). Затем пользователи будут использовать встроенные инструменты экспорта Godot для создания файла PCK, как описано выше.

  2. Разработчик использует 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")

Предупреждение

По умолчанию, если вы импортируете файл с тем же путем/именем, что и у файла, который уже есть в вашем проекте, импортируемый файл заменит его. На это следует обращать внимание при создании 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 должен сделать этот процесс плавным, независимо от выбранного разработчиком пути.