Skip to content

🇬🇧 English | 🇺🇦 Українська

← До змісту

2. Налаштування


Де що зберігається

Плагін навмисно розділяє налаштування на три місця за одним принципом: що з цього поїде у зібрану гру?

Місце Що там Куди потрапляє
Project Settings → S3 Compatible Storage Адреса, регіон, стиль адресації, параметри передавання DefaultGame.ini — у систему контролю версій і в збірку
Project Settings → S3 Credentials (Editor Only) Ваші ключі для роботи в редакторі Saved/Config/.../EditorPerProjectUserSettings.ini — лише на вашій машині
Локальне сховище користувача Ключі, які вводить кінцевий користувач вашого застосунку Зашифрований файл у теці користувача, поза проєктом

Тому на головній сторінці немає полів для ключів. Це не недогляд: будь-що збережене там опинилося б у файлі, який їде всередині збірки й легко видобувається.


Секція Connection

Provider

Найважливіше поле сторінки. Вибір провайдера проставляє те, що з нього випливає:

  • стиль адресації — Amazon хоче віртуальні хости (bucket.host/key), майже всі решта хочуть шлях (host/bucket/key);
  • адресу, якщо вона у провайдера фіксована;
  • регіон, якщо провайдер вимагає конкретного значення.

Оберіть Custom / Other, щоб задати все вручну — для сервісу, якого немає у списку.

Endpoint URL

Базова адреса зі схемою й без кінцевого слеша.

Лишіть порожнім для Amazon S3 і Google Cloud Storage — у них відома адреса за замовчуванням. Для Amazon ще й регіональний хост обчислюється з поля Region, тому s3.amazonaws.com тут ніколи не є помилкою.

Для решти адреса залежить від вашого облікового запису або розгортання, тож її треба вказати.

Region

Регіон бере участь у формуванні підпису, тому має збігатися з очікуваннями провайдера навіть там, де регіонів насправді немає. MinIO його не перевіряє, але підпис однаково має бути узгодженим. Cloudflare R2 вимагає літерала auto.

Path Style Addressing

Як бакет потрапляє в адресу:

Значення Вигляд адреси Для кого
Вимкнено https://bucket.host/key Amazon S3
Увімкнено https://host/bucket/key Практично всі інші

Помилка тут проявляється як HTTP 403 із SignatureDoesNotMatch — код, який нічого не каже про причину. Саме тому варто обирати провайдера зі списку, а не заповнювати поля вручну.

Default Bucket

Бакет для кнопок перевірки й для підсистеми. Це не обмеження: будь-яка операція може працювати з іншим бакетом.


Секція Credentials

Credential Source

Звідки зібрана гра братиме ключі. Докладно — у розділі Облікові дані; коротко:

Значення Для чого
Environment variables Виділений сервер, бекенд, збірковий агент
Local user store (encrypted) Однокористувацький застосунок, де бакет належить самому користувачеві
Anonymous Публічні бакети й сценарії з підписаними посиланнями
Supplied in code Клієнт гри, який отримує короткоживучі ключі від вашого бекенда

Local Store Profile Name

Ім'я, під яким локальне сховище тримає ключі. Дайте кожному застосунку своє, щоб два застосунки на одній машині не читали ключі один одного.


Секція Transport

Timeout Seconds

Таймаут на одну спробу. Запит, який вичерпав усі повтори, може зайняти приблизно (Max Retries + 1) × Timeout плюс затримки між спробами.

Multipart Part Size Bytes

Поріг, після якого завантаження стає багаточастинним, і водночас розмір однієї частини.

S3 вимагає щонайменше 5 МБ на частину (крім останньої), тож менші значення просто підвищуються до мінімуму — інакше провайдер відхилив би завантаження вже наприкінці.

Більші частини — менше запитів, але більше повторної роботи, якщо частина не пройшла.

Max Concurrent Parts

Скільки частин передається одночасно.

1 — строго послідовно. Більші значення значно краще використовують канал за високої затримки, ціною того, що стільки ж буферів одночасно тримається в пам'яті. Після 8 приріст зазвичай вирівнюється, а пам'ять продовжує зростати.

Use Streaming IO

Передавати тіла запитів і відповідей потоком замість того, щоб тримати їх у пам'яті цілком.

З увімкненим параметром завантаження файлу на 2 ГБ коштує буфера розміром із частину, а не 2 ГБ, і зчитування повідомляє справжній побайтовий прогрес. Вимикати варто хіба що для того, щоб виключити цей механізм із підозр під час діагностики.

Resume Interrupted Uploads

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

Ідентифікатор завантаження запам'ятовується під Saved/S3/Uploads/, і наступна спроба того самого файлу питає провайдера, які частини вже на місці, та досилає лише відсутні. Стосується лише S3 Upload File — дані з пам'яті не переживають перезапуск процесу — і лише поки файл і розмір частини не змінилися з моменту переривання. Докладно — у 5. Передавання файлів.

Resume Interrupted Downloads

Дзеркальний параметр для зчитування: чи продовжувати перерване, замість того щоб тягнути об'єкт наново. Увімкнено за замовчуванням.

Стосується лише S3 Download File Chunked — продовження потребує діапазонів, а звичайне S3 Download File є одним потоковим запитом. Те, що встигло прийти, лежить поруч із призначенням як <файл>.s3part, і на місце потрапляє лише зібраним повністю.

Об'єкт звіряється за entity tag на кожному діапазоні, тож переписаний об'єкт не буде дописаний до старого хвоста. Розмір шматка між спробами може бути іншим — на відміну від розміру частини під час завантаження в сховище. Докладно — у 5. Передавання файлів.


Секція Retry

Повторюються лише ті збої, від повтору яких є користь: обрив з'єднання, таймаут, обмеження швидкості (429) і помилки сервера (5xx). Клієнтські помилки — 403, 404 — не повторюються ніколи, бо друга спроба дасть той самий результат.

Параметр Що робить
Max Retries Скільки додаткових спроб після першої. 0 вимикає механізм
Retry Initial Delay Seconds Затримка перед першим повтором
Retry Max Delay Seconds Стеля затримки, щоб довгий ланцюжок повторів не завис на хвилини

Затримка подвоюється з кожною спробою і береться випадково з проміжку від нуля до поточної стелі. Ця випадковість важливіша, ніж здається: коли провайдер обмежує швидкість пачці запитів, вони падають одночасно — і без розкидання повторів повертаються теж одночасно, відтворюючи ту саму пачку.


Побудова конфігурації з коду

Сторінка налаштувань — не єдиний шлях. Той самий набір можна зібрати у Blueprint або в C++:

FDemoS3Config Config;
Config.Endpoint.Provider    = EDemoS3Provider::MinIO;
Config.Endpoint.EndpointURL = TEXT("http://localhost:9000");
Config.Endpoint.Region      = TEXT("us-east-1");

Config.Transport.MaxConcurrentParts = 8;

// Проставляє стиль адресації та приводить параметри до допустимих меж.
Config.Normalize();

UDemoS3Client* Client = UDemoS3Client::CreateClient(Config);

У Blueprint для цього є ноди Make S3 Config (Provider) і Make S3 Config (Custom), а Validate S3 Config поверне текст проблеми або порожній рядок.


Кілька сховищ: профілі як ассети

Сторінка налаштувань описує одне сховище — те, з яким проєкт працює переважно. Якщо сховищ кілька, збирати FDemoS3Config руками в кожному графі означає розмножити адресу й регіон по всіх графах, які їх торкаються, і виправляти потім у всіх.

S3 Storage Profile — це та сама конфігурація, збережена як ассет, на який можна просто вказати.

Створення

Content Browser → Miscellaneous → Data Asset → S3 Storage Profile.

Назвіть його за змістом — SP_ArchiveStorage, SP_UserUploads — і заповніть ті самі поля, що й на сторінці налаштувань: провайдер, адреса, регіон, стиль адресації, бакет, джерело облікових даних і параметри передавання.

Угорі ассета — ті самі чотири кнопки перевірки, що й у Project Settings, і працюють вони проти адреси та облікових даних саме цього профілю: конфігурацію варто мати змогу перевірити там само, де її редагують.

Використання

Get S3 Subsystem  →  Get S3 Client For Profile  →  S3 Upload File
                         Profile: SP_ArchiveStorage

Ассет підключається як будь-який інший: у пін ноди, у змінну Blueprint, у Data Table, у масив. Редагування ассета оновлює всіх, хто на нього вказує.

Клієнт створюється при першому зверненні й далі перевикористовується, тож викликати ноду з різних місць графа дешево. У редакторі правка ассета перебудовує клієнта автоматично — виправлена адреса діє без перезапуску Play In Editor.

Профілі проти Get Named S3 Client

Get Named S3 Client Get S3 Client For Profile
Конфігурація збирається в графі лежить в ассеті
Змінити адресу правити граф правити ассет
Повторний виклик з іншим конфігом мовчки ігнорується — клієнт уже створено під цим ім'ям немає такої пастки: ассет і є конфігурацією
Дістати вже створений клієнт деінде Find Named S3 Client (ім'я, без Config) сама нода Get S3 Client For Profile — вона й так не просить конфігурацію
Коли доречно конфігурація відома лише в рантаймі — прийшла від бекенда чи від користувача конфігурація відома заздалегідь

Якщо адреса й регіон відомі на етапі розробки — профіль кращий практично завжди.

Чого в профілі немає — і чому

Полів для Access Key і Secret Key. Ассет кукається у зібрану гру, тому ключ, вписаний у нього, поїде всередині збірки й видобувається звідти так само, як із DefaultGame.ini — рівно з тієї самої причини їх немає й на сторінці налаштувань.

Профіль зберігає звідки брати облікові дані, а не самі дані:

Поле Навіщо
Credential Source Те саме, що в налаштуваннях: оточення, локальне сховище, анонімно, з коду
Local Store Profile Name Дайте кожному сховищу своє ім'я, щоб ключі від одного не пішли в інше
Environment Variable Prefix Дозволяє тримати кілька сховищ в одному оточенні: ARCHIVE тут читає ARCHIVE_ACCESS_KEY_ID замість AWS_ACCESS_KEY_ID

Ключі для роботи в редакторі

Нижче цих полів є ще три — Editor Access Key Id, Editor Secret Access Key і Editor Session Token. Це ключі саме цього профілю, і саме їх використовують кнопки перевірки вгорі ассета.

Вони не зберігаються в ассеті: поля позначені як Transient, а значення лягають у ваш власний EditorPerProjectUserSettings.ini під іменем цього ассета — той самий файл і ті самі гарантії, що й у спільної секції S3 Credentials (Editor Only). У збірку не потрапляють, у систему контролю версій не потрапляють.

Заповнювати їх треба саме тут, а не в спільній секції, щойно сховищ стає більше одного. Спільна пара ключів одна на весь проєкт — вона може описувати лише одне сховище. Профіль, який не має власних ключів, візьме спільні: запит до Amazon піде підписаний ключем від MinIO, а провайдер відповість, що такого ключа не існує. Помилка звинувачує ключ, хоча проблема в конфігурації.

Щоб побачити, який ключ пішов насправді, дивіться перший рядок звіту:

---- https://s3.us-east-2.amazonaws.com, Static(editor keys for SP_Archive), region us-east-2, path-style off

Static(editor keys for <ім'я профілю>) — ключі цього профілю. Static(editor settings) — спільна пара. Environment — справжні змінні оточення.

Ці поля читаються лише коли Credential Source = Environment variables: у редакторі вони заміняють змінні оточення, а зібрана гра їх не бачить взагалі й читає справжнє оточення.

Якщо ключі стають відомі лише в рантаймі — залиште Supplied in code й установіть провайдера на клієнта самі. Після зміни ключів викличте Forget Profile Client, щоб наступне звернення створило клієнта наново: клієнт кешує те, що вже отримав.


Далі: 3. Облікові дані