ResourceLoader
Загрузка ресурсов, общий cache и управляемый lifecycle фоновых заявок.
ResourceLoader загружает подготовленные ресурсы, а не произвольные исходные файлы. Загруженный PackedEntity ещё не находится в дереве игры: нужны Instantiate() и AddChild().
Reuse может вернуть общий native объект и тот же C# wrapper. Не Dispose такую ссылку, пока её aliases используются. Ignore не означает независимость всех внешних зависимостей; для проверенного text backend глубину задают IgnoreDeep/ReplaceDeep. Replace способен обновить уже удерживаемый объект.
Фоновая схема: LoadThreadedRequest() → статус между кадрами → LoadThreadedGet(). Используйте ту же строку пути и балансируйте сборы при повторных Request. Ранний Get может блокировать; это не система стриминга мира.
Готовый фоновый загрузчик, внешние исходные файлы. Проверки выполнены на Windows в отдельных проектах; сбои загрузки, политика отсутствующих зависимостей, импорт/экспорт и GPU-сцены здесь не выполнялись.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Свойства1
SingletonСвойство
public static ResourceLoaderInstance Singleton { get; }Заимствованный wrapper глобального ResourceLoader, не отдельный загрузчик на каждый вызов. Не Free()/Dispose() engine-owned Singleton. Для обычных операций используйте статические методы; ResourceFormatLoader регистрируется отдельно.
Методы16
AddResourceFormatLoadervoid
public static void AddResourceFormatLoader(ResourceFormatLoader formatLoader, bool atFront = false);Добавляет собственный format loader в глобальный список; atFront=true даёт приоритет перед текущими обработчиками. Удерживайте экземпляр до явного удаления регистрации. Повтор того же instance создаёт дубликат, не обновляет существующий; это проверено. Неверный объект/лимит дают диагностику, отдельного Error нет. Не регистрируйте заново перед каждым Load.
| Имя | Тип | По умолчанию |
|---|---|---|
formatLoader | ResourceFormatLoader | — |
atFront | bool | false |
formatLoaderТот же собственный ResourceFormatLoader для регистрации/удаления; учитывайте число Add.
atFrontTrue вставляет перед существующими loaders; false добавляет в конец.
Existsbool
public static bool Exists(string path, string typeHint = "");Проверяет ресурс по кэшу или loader, а не обязательно наличие корректного файла на диске. Cached ресурс даёт true даже после удаления файла и до проверки typeHint. Некорректный файл с распознаваемым расширением тоже может дать true без parsing. Не используйте как гарантию успешного Load<T>() или совпадения C# типа; результат загрузки проверяйте отдельно.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
typeHint | string | "" |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
typeHintНеобязательное имя engine-типа для выбора loader; не C# typeof(T) и не гарантия фактического типа cached результата.
boolОтвет cache/loader; true не гарантирует существующий корректный файл или нужный C# тип.
GetCachedRefResource
public static Resource GetCachedRef(string path);Получает Resource из cache либо null, не читая отсутствующий там файл. Может вернуть тот же C# wrapper, который уже использует другой код; это подтверждено ReferenceEquals. Ранний Dispose такой ссылки делает другие managed aliases недействительными. Согласуйте общий срок жизни вместо независимого освобождения каждого alias. Это не clone и не обновление с диска.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
ResourceCached Resource либо null; возможен тот же managed wrapper, не независимая копия.
GetDependenciesstring[]
public static string[] GetDependencies(string path);Собирает объявленные внешние зависимости через format loaders, не рекурсивное дерево загруженных объектов. Элемент может быть обычным путём или записью UID::тип::fallback; публичная обёртка не добавляет тип, поэтому среднее поле может быть пустым. Не передавайте такую составную строку целиком в файловый API. Пустой список не отличает отсутствие зависимостей от неподдержанного/ошибочного формата. Импорт, UID remap и custom loaders могут менять представление.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
string[]Массив dependency records; не обязательно массив готовых OS paths.
GetRecognizedExtensionsForTypestring[]
public static string[] GetRecognizedExtensionsForType(string type);Запрашивает расширения у зарегистрированных loaders для имени engine-типа, не C# System.Type. Пустое имя может запросить общий набор. Имена без точки; возможны дубликаты и изменения после регистрации плагинов. Список не доказывает существование, импортированность или корректность отдельного файла.
| Имя | Тип | По умолчанию |
|---|---|---|
type | string | — |
typeИмя engine-типа; пустая строка для общего запроса. Не объект System.Type.
string[]Имена расширений без точки, возможно с повторами.
GetResourceTypestring
public static string GetResourceType(string path);Спрашивает loaders о типе ресурса по пути; это metadata query и может выполнять I/O. Не является C# приведением результата или гарантией полной загрузки. Для custom C# ресурса сообщаемый engine base type может отличаться от имени managed-класса. Пустая строка означает отсутствие распознанного типа, не отдельный подробный Error.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
stringИмя engine-типа либо пустая строка без распознанного результата.
GetResourceUidlong
public static long GetResourceUid(string path);В игровом runtime запрашивает reverse registry ResourceUid по нормализованному пути; не сканирует UID-заголовок любого файла. Для неизвестного пути возвращает InvalidId. Устаревшая reverse-запись после SetId/RemoveId может дать ID без актуального HasId(). Редактор использует другой путь через loaders; редакторное сканирование здесь не проверялось.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
longRegistry ID либо InvalidId в runtime; доступность файла проверяется отдельно.
HasCachedbool
public static bool HasCached(string path);Проверяет запись пути в resource cache после нормализации пути. Не загружает файл, не проверяет свежесть данных, наличие файла и фактический тип. Удерживаемый ресурс может оставаться в cache после удаления/изменения файла. Не обещает, что запись сохранится после освобождения всех владельцев.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
boolTrue для текущей записи cache, не проверки свежести/файла.
ListDirectorystring[]
public static string[] ListDirectory(string directoryPath);Перечисляет непосредственные имена каталогов и распознаваемых ресурсов, не все физические файлы и не рекурсивное дерево. Каталоги оканчиваются /; sidecars .import/.remap/.uid сводятся к исходному имени, результат сортируется и устраняет повторы. Распознавание расширения не доказывает корректный parsing: в тесте присутствовал некорректный .rdata. Пустой массив также возможен при ошибке открытия/начала обхода. Export/import backend здесь не выполнялись.
| Имя | Тип | По умолчанию |
|---|---|---|
directoryPath | string | — |
directoryPathКаталог для непосредственного перечисления; не glob и не рекурсивный запрос.
string[]Отсортированные уникальные имена с / для каталогов; пустое также возможно при ошибке.
Load2 перегрузки
public static Resource Load(string path, string typeHint = "", ResourceLoader.CacheMode cacheMode = ResourceLoader.CacheMode.Reuse);Синхронно получает Resource через выбранный формат и режим кэша; при неудаче возможны null и диагностика движка. Это не создание Entity: PackedEntity ещё нужно Instantiate()/AddChild(). Reuse может вернуть тот же native объект и тот же C# wrapper; не Dispose общий wrapper, пока другие ссылки его используют. На проверенном text backend Ignore создаёт независимый основной ресурс, но переиспользует внешние зависимости; IgnoreDeep читает их независимо. Replace может обновить удерживаемый объект совместимого типа, а ReplaceDeep также обновляет внешние зависимости. Изменения файла не обновляют Reuse автоматически. Поведение собственного loader должно учитывать cacheMode.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
typeHint | string | "" |
cacheMode | ResourceLoader.CacheMode | ResourceLoader.CacheMode.Reuse |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
typeHintНеобязательное имя engine-типа для выбора loader; не C# typeof(T) и не гарантия фактического типа cached результата.
cacheModeПолитика cache; у text loader обычные Ignore/Replace не обновляют внешние зависимости, глубокие режимы распространяются на них. Replace может изменить уже используемые объекты.
ResourceResource либо null; generic overload дополнительно выполняет приведение к T и может бросить InvalidCastException.
public static T Load<T>(string path, string typeHint = null, ResourceLoader.CacheMode cacheMode = ResourceLoader.CacheMode.Reuse) where T : class;Синхронно получает Resource через выбранный формат и режим кэша; при неудаче возможны null и диагностика движка. Это не создание Entity: PackedEntity ещё нужно Instantiate()/AddChild(). Reuse может вернуть тот же native объект и тот же C# wrapper; не Dispose общий wrapper, пока другие ссылки его используют. На проверенном text backend Ignore создаёт независимый основной ресурс, но переиспользует внешние зависимости; IgnoreDeep читает их независимо. Replace может обновить удерживаемый объект совместимого типа, а ReplaceDeep также обновляет внешние зависимости. Изменения файла не обновляют Reuse автоматически. Поведение собственного loader должно учитывать cacheMode. Generic обёртка только приводит native результат к T. Она не выводит typeHint из T; несовпадение может дать InvalidCastException, не null.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
typeHint | string | null |
cacheMode | ResourceLoader.CacheMode | ResourceLoader.CacheMode.Reuse |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
typeHintНеобязательное имя engine-типа для выбора loader; не C# typeof(T) и не гарантия фактического типа cached результата.
cacheModeПолитика cache; у text loader обычные Ignore/Replace не обновляют внешние зависимости, глубокие режимы распространяются на них. Replace может изменить уже используемые объекты.
TResource либо null; generic overload дополнительно выполняет приведение к T и может бросить InvalidCastException.
LoadThreadedGetResource
public static Resource LoadThreadedGet(string path);Собирает один результат ранее принятой пользовательской заявки. До завершения может ждать и блокировать вызывающий поток; в обычном flow сначала дождитесь Loaded. После Failed также завершите lifecycle заявки, ожидая null и диагностику loader. Один вызов уменьшает счётчик заявок; при двух одинаковых Request нужны два сбора. После полного сбора status становится InvalidResource. Без заявки/после её потребления возвращает null; полученный Resource может быть общим cached wrapper.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
ResourceРезультат Resource либо null; вызов может ожидать готовность и потребляет одну заявку.
LoadThreadedGetStatusResourceLoader.ThreadLoadStatus
public static ResourceLoader.ThreadLoadStatus LoadThreadedGetStatus(string path, Reckfell.Collections.Array progress = null);Возвращает статус заявки по исходной строке path, а не произвольному эквивалентному OS path. InvalidResource также означает, что заявки ещё не было либо все её результаты собраны; это не только несуществующий файл. Переданный progress Array перезаписывается одним числом 0…1, стирая прежние элементы; выделяйте собственный массив. Статус Loaded, не одна величина progress, разрешает обычный сбор. Не блокируйте главный поток циклом без кадров.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
progress | Reckfell.Collections.Array | null |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
progressСобственный Array, перезаписываемый одним progress числом; null пропускает этот результат.
ResourceLoader.ThreadLoadStatusInvalidResource, InProgress, Failed или Loaded; progress не заменяет статус.
LoadThreadedRequestError
public static Error LoadThreadedRequest(string path, string typeHint = "", bool useSubThreads = false, ResourceLoader.CacheMode cacheMode = ResourceLoader.CacheMode.Reuse);Запускает/получает пользовательскую заявку на фоновую загрузку Resource. Error.Ok не означает готовый результат: опрашивайте LoadThreadedGetStatus() между кадрами, затем соберите через LoadThreadedGet(). Используйте одну и ту же строку path во всех вызовах. Повтор той же строки может разделить token, увеличив число ожидаемых Get; один Get не очищает две заявки. Не рассчитывайте, что новые flags повторного Request перенастроят существующий token. Это не async C# Task, отмена или система стриминга мира.
| Имя | Тип | По умолчанию |
|---|---|---|
path | string | — |
typeHint | string | "" |
useSubThreads | bool | false |
cacheMode | ResourceLoader.CacheMode | ResourceLoader.CacheMode.Reuse |
pathПуть ресурса, поддержанный loader; asset://, допустимый user:// или OS path, а uid:// требует актуального реестра. Для threaded lifecycle сохраняйте исходную строку.
typeHintНеобязательное имя engine-типа для выбора loader; не C# typeof(T) и не гарантия фактического типа cached результата.
useSubThreadsРазрешить распределённую загрузку зависимостей, где backend поддерживает это. Не разрешает произвольную работу с EntityTree из worker-кода.
cacheModeПолитика cache; у text loader обычные Ignore/Replace не обновляют внешние зависимости, глубокие режимы распространяются на них. Replace может изменить уже используемые объекты.
ErrorError принятия заявки; Ok не означает Loaded.
RemoveResourceFormatLoadervoid
public static void RemoveResourceFormatLoader(ResourceFormatLoader formatLoader);Удаляет первую регистрацию указанного instance. Если Add вызван дважды, один Remove оставляет другую запись; проверено. Не удаляет файлы и не является очисткой всех cached ресурсов. Удалите все свои регистрации перед Dispose собственного loader; отсутствующий/null instance даёт диагностику.
| Имя | Тип | По умолчанию |
|---|---|---|
formatLoader | ResourceFormatLoader | — |
formatLoaderТот же собственный ResourceFormatLoader для регистрации/удаления; учитывайте число Add.
SetAbortOnMissingResourcesvoid
public static void SetAbortOnMissingResources(bool abort);Меняет глобальную политику отказа при отсутствующих зависимостях, не локальную настройку одного Load. Во встроенном text loader false может разрешить продолжение с отсутствующей зависимостью, но не обещает пригодный ресурс или исправление схемы. Abort относится к отказу загрузки, не обещанию аварийно завершить игру. Не отключает все ошибки parsing и не отменяет фоновые заявки. В этом проходе поведение проверено по исходникам, не на повреждённых зависимостях.
| Имя | Тип | По умолчанию |
|---|---|---|
abort | bool | — |
abortГлобальная политика отказа загрузки на отсутствующих зависимостях; не переключатель отсутствия любых ошибок.
ResourceLoader.CacheMode
| Значение | Описание |
|---|---|
Ignore = 0 | Ни основной ресурс (тот, который был запрошен для загрузки), ни какой-либо из его подресурсов не извлекается из кэша и не сохраняется в нем. Зависимости (внешние ресурсы) загружаются с |
IgnoreDeep = 3 | Подобно |
Replace = 2 | Как |
ReplaceDeep = 4 | Подобно |
Reuse = 1 | Основной ресурс (тот, который был запрошен для загрузки), его подресурсы и его зависимости (внешние ресурсы) извлекаются из кэша, если они присутствуют, а не загружаются. Те, которые не кэшируются, загружаются и затем сохраняются в кэше. Те же правила рекурсивно распространяются вниз по дереву зависимостей (внешние ресурсы). |
ResourceLoader.ThreadLoadStatus
| Значение | Описание |
|---|---|
Failed = 2 | Вас постигла неудача, во время загрузки произошла ошибка. |
InProgress = 1 | Ресурс все еще загружается. |
InvalidResource = 0 | Ресурс недействителен или не был загружен с помощью |
Loaded = 3 | Ресурс успешно загружен и к нему можно получить доступ через |