Проблема захламления проекта кучей ассетов стоит почти у каждой команды, когда проект доходит до определенных стадий. В самом проекте остаются ассеты из прототипов, из покупных паков с маркетплейса, а так же просто лишний хлам, который, по тем или иным причинам, стал не нужен. Рано или поздно, проект начинает весить десятки гигабайт, в то время как рабочий и нужный контент остается не больше пары гигабайт.

В данной статье я хотел описать способы очистки проекта от неиспользуемых ассетов без сторонних плагинов, один из которых недавно обнаружил во время оптимизации нашего проекта. В конце я так же оставлю пару ссылок на сторонние плагины, что бы все было в одном месте.

Так же заранее предупреждаю, что я не рекомендую использовать автоматические инструменты для очистки, в том числе сторонние плагины, если в проекте не настроена система контроля версий. Иначе вы рискуете безвозвратно очистить нужные ассеты без возможности восстановления.

!!! Обратите внимание, что все способы используют систему референсов в Unreal Engine для определения того, что потенциально будет использовано в проекте, а что нет.

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

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

Способ 1 - Фильтр

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

Однако этот способ не поможет удалить ассеты, которые используются в каких-либо ненужных сценах, которые, например, попали в ваш проект в результате импорта пака из магазина. Эти сцены придется удалить вручную перед очисткой проекта этим способом.

Для фильтрации нужно выбрать папку, которую вы хотите очистить от неиспользуемых ассетов, а затем просто включить фильтр Not Used In Any Level.

Выбор фильтра для неиспользуемых ассетов
Выбор фильтра для неиспользуемых ассетов

В Content Browser останутся только те ассеты, которые не используются ни в одной сцене.

А что бы показать ассеты со всего проекта, можно выбрать самую главную папку - Content.

После того, как вам отобразятся все неиспользуемые ассеты, вам останется лишь выделить те, которые хотите удалить и нажать кнопку Delete.

Способ 2 - Аудит ассетов

В отличии от предыдущего способа, этот немного замороченнее, однако он позволяет удалить ассеты используемые в картах, которые не будут запаковываться в финальный проект. Так же он поможет удалить и ненужные сцены.

Однако с этим способом стоит быть аккуратным, ведь в вашем проекте могут быть сцены, которые не пакуются в проект, однако необходимы для разработки проекта, например тестовые сцены или ещё не готовые локации.

Что бы найти неиспользуемые ассеты этим способом, в первую очередь стоит выбрать папку в Content Browser, из которой мы хотим найти удалить неиспользуемые ассеты. Затем в строке поиска вставить пробел, что бы отобразить все ассеты, в том числе и те, что находятся в подпапках.

Вы так же можете воспользоваться фильтрами, что бы фильтровать только определенные ассеты

Отобразить все ассеты в папке и подпапках
Отобразить все ассеты в папке и подпапках

Для определения использования ассетов нам нужно открыть инструмент Audit Assets, что бы отсортировать используемые и неиспользуемые ассеты. Для этого нужно выбрать все ассеты, которые отобразились после предыдущего шага, нажать ПКМ и выбрать пункт Audit Assets.

Открытие аудита ассетов
Открытие аудита ассетов

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

Эта панель так же полезна для определения, какие ассеты больше всего весят, или в каких модельках больше всего полигонов, например.

Самая важная колонка для целей этой статьи - Total Usage, которая указывает на вероятность использования ассета в запущенном проекте. Отсортировав ассеты по её значению мы сможем получить список всех ассетов, которые нигде не используются (имеют значение 0).

Что бы отсортировать значение, необходимо нажать на название самой колонки. При необходимости нажать ещё раз, что бы сортировать по возрастанию, а не убыванию.

Сортируем список по использованию ассетов
Сортируем список по использованию ассетов

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

Для быстрого выделения всех неиспользуемых, можно выбрать первый ассет, зажать Shift и выбрать последний неиспользуемый ассет.

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

Когда все нужные ассеты выбраны, нам нужно будет выбрать их в Content Browser'е. Это можно сделав, щелкнув по списку с выделением ПКМ и выбрав пункт Browse To Asset.

Выбор неиспользуемый ассетов
Выбор неиспользуемый ассетов

ПК может подвиснуть на некоторое время, но после этого, в Content Browser будут выделены только те ассеты, которые были выделены в списке аудита ассетов.

Далее достаточно будет нажать Delete, как движок начнет процесс удаления.

Он ещё раз покажет вам список ассетов, которые будут удалены, который вы можете дополнительно проверить. Если список вас устраивает, можно нажать красную кнопку Force Delete, которая удалит все ассеты из списка.

Способ 3 - Миграция

Этот способ является наименее предпочтительным, так как для очистки будет задействован второй проект. Основная идея этого способа - выбрать карты, которые должны остаться в проекте, а затем использовать инструмент миграции, что бы перенести карты и используемые в них ассеты в другой проект, игнорируя весь оставшийся контент.

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

Что бы произвести миграцию, для начала стоит создать чистый проект на той же самой версии движка. В новый проект сразу стоит перенести все файлы, необходимые для работы проекта. Как правило, это папка Config и Plugins, а если в проекте есть исходники, то Source и Binaries.

Для того, что бы мигрировать карты вместе с ассетами, необходимо в оригинальном проекте выбрать необходимые ассеты, нажать ПКМ и выбрать пункт Migrate.

Миграция карт
Миграция карт

У вас должно отобразиться окошко, где будет список со всеми ассетами, которые эти карты используют, и, как следствие, что будет перенесено в новый проект.

Миграция только используемых ассетов
Миграция только используемых ассетов

После того, как вы нажмете OK, редактор предложит вам выбрать путь, куда перенести карты и ассеты. Вам необходимо выбрать путь к папке Content в вашем новом проекте. Именно папку Content, а не путь к самому проекту, иначе миграция не будет успешна.

Как только миграция будет окончена, вы можете открыть новый проект и убедиться в том, что все необходимые ассеты перенеслись, а неиспользуемых ассетов нет.

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

Способ 4 - Плагины

Ниже список сторонних плагинов, которые могут так же помочь в очистке проектов. Я эти плагины никогда не использовал, и не могу ручаться за их работу. Решил закинуть сюда, что бы статья была более полноценна. Если у вас был опыт с одними из них, обязательно напишите об этом в комментариях.

Заключение

Возможно есть ещё какие-то способы, я лишь привел те, которые известны мне. Если у вас есть какие-либо комментарии, буду рад их почитать.

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

Комментарии (5)


  1. Watcover3396
    06.01.2022 00:21
    +1

    Для миграции другой проект вообще не нужен, я сам такой способ только и юзаю.
    1. Рядом с оригинальной папкой Content создаю новую папку, не важно какое название ASDAS.
    2. Выделяю в Анриле все точно используемые в игре карты, мигрирую в новую папку ASDAS, Анрил будет ругаться мол, эй чувак это не папка с именем контент, плевать, он всё равно работает относительно её. Для успокоения можно создать папку с названием Content в другом месте и мигрировать туда, что-бы не получать это сообщение.
    3. Закрываем Анрил, оригинальную папку Content переименовываем в ContentOld, а новую папку ASDAS в Content. Или переносим с оригинальным названием папку из другого места с мигрированными ассетами.
    4. Запускаем проект и/или лаунчим игру, проверяем что-бы не было ошибок в логах.
    5. Profit! Каждое утро так делай, спина болеть не будет.
    Но, на самом деле, это решение следствия, а не самой проблемы, если проект в стадии активного прототипирования, найдется куча дизайнеров всяких, которые обязательно завезут кучу нового мусора, и их можно понять, нельзя выбрать подходящую модель чашечки, не выставив её на сцену, прикинув как оно будет выглядеть, не залив весь пак из 100500 чашек в проект, жаль они потом это всё заливают в репозиторий, пушо разбираться и головой подумать это сложно, нафик надо)
    А как не заливать весь пак чашек в репозиторий? Мигрировать одну чашку в тот же проект? Держать отдельный жирный клон проект? А вдруг завтра еще одну чашку надо будет добавить?
    Хотя как бы есть специальные папки Collections и Developers, которые со старту добавляются в gitignore, и все могут у себя локально добавлять туда любые паки, выкидывать на сцену, прикидывать чо и им надо, а потом что будет использоваться переносить в папку контента, но к сожалению всё что качается из маркета из коробки добавляется в корень папки контент, и перенос в другое место сулит жопной боли и поломанными референсами. Увы, не продумано как-то получилось у Эпиков, хотя может я чего-то не знаю.


    1. Watcover3396
      06.01.2022 00:31

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


    1. Flakky Автор
      06.01.2022 00:39
      +1

      Мы все паки качаем в отдельный проект и мигрируем только то, что нужно. Исключение составляют паки, которые используются в нескольких новых локациях, которые собираются левел-дизайнером из того, что есть в паке. Потом просто отдельно чистим.

      Насчет миграции в отдельную папку да, любопытный способ. Правда из-за того, что старая папка удаляется, нет возможности потом отдельно доперенести ассеты, которые не захватила основная миграция.

      Например в нашем проекте есть куча дата-ассетов, которые никак не референсятся. И их анриал считает за тех, что не используются. На деле же они чуть ли не основу нашего мета-геймплея составляют. Такие вещи, пришлось бы отдельно мигрировать.

      Впрочем, мы сами никогда миграцией не пользуемся. Нам проще прочистить проект другими двумя способами.


      1. Watcover3396
        06.01.2022 15:06

        Ну удалять старую папку вовсе не обязательно, можно держать какое-то время, хоть до следующего мигрейта-чистки, но это конечно тоже такое себе)


  1. cr1gger
    07.01.2022 19:56

    О ты решил вернуться на публику)) Красава