Цю сторінку ще не перекладено — показано англійську версію.
Як побудовано SDK
Як написано SDK і як він працює. Чому одна й та сама ідея трохи по-різному виглядає в Python і в Unreal C++ і що стоїть між вашим викликом і мережею.
Від загального до конкретного
SDK — це один дизайн, який можна звузити двома способами, і правило тут у порядку: на нижчий рівень ніщо не спускається, доки рівень вище здатен це виразити.
| Рівень | Що тут живе |
|---|---|
| Спільні принципи | Однакові в кожному біндингу: поведінку оголошують атрибутом поруч із тим, що вона описує; кожне оголошення (declaration), яке ви надсилаєте, адмін-панель показує; ваш код звертається до модулів і більше ні до чого. |
| Форма мови | Лише те, чого парадигма мови не може виразити спільним способом. У C# є атрибути, у Python — декоратори: це те саме оголошення, записане так, як кожна мова вже записує цю ідею. Мова без такої конструкції передає те саме оголошення інакше, і там, де він застосовується, цей спосіб запису названо явно. |
| Форма рушія | Лише те, що ігровий рушій змінює поверх своєї мови. Unreal C++ — не звичайний C++: у нього власна об’єктна модель і власна рефлексія під час збірки, тому оголошення там розміщують всередині рефлексійного макроса самого рушія, у тій позиції, де цей макрос уже приймає специфікатори. Unity C# — теж не серверний C#: там старіше середовище виконання й менша базова бібліотека. |
Якщо читати згори вниз, стає зрозуміло, чому шість вкладок у кожному прикладі — не шість різних API. Це один API, записаний шістьма способами, а відмінності, які ви бачите, — це два нижні рівні, що проступають крізь нього.
Як це працює: від вашого коду вниз
Ваш ігровий код бачить модулі, і на цьому словник закінчується.
- Модулі — це те, до чого ви звертаєтеся. Вони утворюють граф, а не дерево, а що це дає, описує сторінка Успадкування і композиція.
- Чотири примітиви — те, з чого складено модулі: події, RPC, дані й підписки, групи. Кімната, чат і пул підбору гравців (matchmaking) влашто вані однаково: усі вони — той самий примітив групи, лише з різними правилами.
- Хаб лежить нижче, і ви ніколи його не викликаєте. Це впровадження залежностей, монтування модулів, сесія користувача, відновлення стану та якість доставки повідомлень. Окремо про нього йдеться лише на сторінці Під капотом.
- Транспортні адаптери (transport adapter) лежать у самому низу, по одному на протокол, і хаб повністю їх ховає. Їх буде кілька — WebSocket, наш власний UDP, HTTP, — і який із них понесе виклик, ваш код не вирішує й не помічає.
Про доставку модуль повідомляє лише її якість обслуговування — at-least-once або at-most-once, — і нічого більше. Транспорт під ним може змінитися, а ваш код лишиться тим самим.
Що це вам дає
- Один SDK, а не клієнтський і серверний. Що може виклик, визначають видані акторові права (grant), а не прапорець збірки. Докладніше — на сторінці Хто ухвалює рішення.
- Оголошення — вихідна точка для всього. Надішліть його — і з’явиться типізов аний API, адмін-панель його покаже, а кодогенерація створить код для кожного біндингу. Див. Схема в коді.
- Модулі поєднуються, а не успадковуються. Як саме і що тут означає «успадкування», описує сторінка Успадкування і композиція.