feat: import assets from an external folder
Reverse direction of the export: read a folder of .uasset files, recover each one's original package path, and bring the chosen ones back. Recovering the path is the hard part - a reference inside a .uasset names its target by full package path, so a file only works when restored to where it came from. Four sources are tried and the one used is shown per row: our manifest, the package header, the folder structure, or nothing. The package header carries the name on this project's assets, measured, so a flat export without a manifest still restores correctly. The engine notes the field is not always written, hence the chain rather than one check. Import refuses to destroy work: existing assets are skipped unless overwrite is explicitly on, and a package loaded in the editor is never replaced. Also verifies Migrate on real data for the first time - asset and its dependency land at the correct package paths. Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -212,6 +212,39 @@ BOM обязателен: без него Excel ломает кириллицу.
|
||||
|
||||
---
|
||||
|
||||
## Импорт из внешней папки
|
||||
|
||||
`Window → Tools → Import Assets from Folder…` — обратное направление: прочитать папку выгруженных `.uasset` и вернуть выбранное в проект.
|
||||
|
||||
Список с галочками, колонки: файл · во что превратится · **откуда взят путь** · статус.
|
||||
|
||||
### Откуда берётся целевой путь
|
||||
|
||||
Это главная сложность импорта, а не копирование. Ссылка внутри `.uasset` называет цель **полным путём пакета**, поэтому файл заработает только если положить его туда, откуда он пришёл. Ошибка здесь не падает громко — она даёт ассет с отсутствующими ссылками, который обнаружат сильно позже.
|
||||
|
||||
Четыре источника по убыванию доверия, и колонка показывает, какой сработал:
|
||||
|
||||
| Источник | Надёжность |
|
||||
|---|---|
|
||||
| **Manifest** | Мы сами его написали из фактически записанного. Точно |
|
||||
| **Package header** | `FPackageFileSummary::PackageName` — имя, с которым файл сохраняли. **Замерено на этом проекте: работает** |
|
||||
| **Folder structure** | Позиция файла под корнем импорта. Верно для зеркальной выгрузки, догадка для прочих |
|
||||
| **Unresolved** | Не восстановить. Импортируется только в явно названную папку, ссылки не сработают |
|
||||
|
||||
⚠️ Про `Package header` есть оговорка **в самом движке** (`AssetHeaderPatcher.cpp:1214`): поле сериализуется не всегда, и движок сам предусматривает откат. Поэтому цепочка, а не одна проверка.
|
||||
|
||||
### Что импорт делать откажется
|
||||
|
||||
Импорт — единственная операция инструмента, способная **уничтожить работу**: запись поверх `/Game/Art/SM_Rock` заменяет то, что там было, без отмены и без копии.
|
||||
|
||||
- Существующий ассет **пропускается**, пока явно не включена перезапись. Перед перезаписью — отдельное подтверждение.
|
||||
- Пакет, **открытый в редакторе**, не перезаписывается никогда, даже с включённой галочкой: подмена файла под загруженным `UPackage` оставляет сессию с устаревшими объектами, которые потом сохранятся поверх импорта.
|
||||
- Файлы без восстановимого пути пропускаются, если не названа папка-приёмник.
|
||||
|
||||
После копирования выполняется `ScanFilesSynchronous` — без него файлы лежат на диске и невидимы в Content Browser, что читается как «импорт ничего не сделал».
|
||||
|
||||
---
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user