Файлы: asset://, user:// и проверка ошибок
Отделяйте ресурсы проекта от записываемых данных пользователя.
Два виртуальных корня
| Путь | Назначение |
|---|---|
| asset:// | Корень проекта рядом с project.reckfell; ресурсы игры |
| user:// | Каталог данных приложения; заметки, настройки и сохранения |
Не рассчитывайте записывать в asset:// после экспорта: ресурсы могут находиться в пакете. Ресурсы движка загружайте через ResourceLoader, обычный текст — через FileAccess. Работа с исходным PNG в редакторе не доказывает, что тот же сырой файл доступен в экспортированной сборке.
Записать и прочитать короткую заметку
TextNoteStore.cs
using System.Text;
using Reckfell;
public static class TextNoteStore
{
public const string Path = "user://script-tools-note.txt";
public const int MaximumBytes = 4096;
public static bool TryWrite(string text, out Error error)
{
error = Error.InvalidParameter;
if (Encoding.UTF8.GetByteCount(text) > MaximumBytes) return false;
using var file = FileAccess.Open(Path, FileAccess.ModeFlags.Write);
if (file is null)
{
error = FileAccess.GetOpenError();
return false;
}
if (!file.StoreString(text))
{
error = file.GetError();
return false;
}
file.Flush();
error = file.GetError();
return error == Error.Ok;
}
public static bool TryRead(out string text, out Error error)
{
text = "";
using var file = FileAccess.Open(Path, FileAccess.ModeFlags.Read);
if (file is null)
{
error = FileAccess.GetOpenError();
return false;
}
if (file.GetLength() > MaximumBytes)
{
error = Error.InvalidData;
return false;
}
string candidate = file.GetAsText();
error = file.GetError();
if (error != Error.Ok && error != Error.FileEof) return false;
text = candidate;
error = Error.Ok;
return true;
}
}Путь фиксирован: user://script-tools-note.txt. Лимит 4096 считается в байтах UTF-8, а не в символах. Слишком большой текст отвергается до открытия на запись, поэтому предыдущая заметка сохраняется. TryRead проверяет размер до чтения.
Если Open вернул null, сразу получите GetOpenError. Запись в режиме Write заменяет содержимое; это простой текстовый пример, не атомарная система сохранения прогресса. Для неё используйте отдельную схему сохранения.
Системные пути и перенос файлов
ProjectSettings.GlobalizePath раскрывает asset:// и user:// в системный путь, например для внешнего инструмента. LocalizePath преобразует путь внутри проекта в asset://; не считайте его универсальной обратной операцией для каталога user://.
Авторские .rscene, .rprefab, .rdata и связанные UID-файлы относятся к исходным данным. .reckfell содержит производный кэш. Утверждение «движок не использует метаданные» здесь неверно: не выбрасывайте UID и импортные сведения при переносе ресурсов.