Skip to content

18 — Демо Fuzzy Turret Defense

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

Опціональний модуль плагіна FuzzyLogicDemo постачає другу демонстраційну сцену: турель обороняється від хвиль ворожих дронів за допомогою трьох послідовних систем Мамдані замість одного вручну підібраного порогу. Одна система оцінює загрозу, друга наводиться, а третя вирішує, коли справді безпечно стріляти — і жодна з них не є конструкцією switch.

Як запустити

У Content Browser увімкніть іконку налаштувань (шестерня) → Show Plugin Content, якщо Plugins не видно, а потім перейдіть у Plugins → Fuzzy Logic Content → Demo → FuzzyTurretDefense → Maps і відкрийте FuzzyTurretDefense.

Запустіть Play або Standalone Game. Ворожі дрони наближаються з краю арени; турель супроводжує найближчого, розганяється й стріляє, коли її нечіткий вихід FireAuthorization перевищує поріг. Гільзи вилітають із бічного вікна гармати, падають на підлогу з фізикою і зникають через 14 секунд. Панель візуалізації Fire Control у нижньому правому куті малює три вхідні функції належності та агреговану поверхню FireAuthorization у реальному часі — про кнопки HIDE/SHOW і PAUSE/RESUME див. 16 — Демонстраційний контент.

Асети

Усі асети цього демо лежать у Content Browser під Plugins → Fuzzy Logic Content → Demo → FuzzyTurretDefense (увімкніть Show Plugin Content, якщо Plugins не видно):

Ресурс Призначення
Maps/FuzzyTurretDefense Демонстраційна карта
DA_RadarAssessment UFuzzySystemAsset пріоритету загрози
DA_TrackingControl UFuzzySystemAsset швидкості наведення
DA_FireControl UFuzzySystemAsset дозволу на вогонь
RadarAssessment.json, TrackingControl.json, FireControl.json Редаговані JSON-вихідники трьох систем
Blueprints/BP_FuzzyTurret Актор турелі: обертання, зчитування радара, стрільба, накопичення тепла

Назви множин у JSON залишені англійськими, щоб їх було зручно шукати в Blueprint, але нижче наведено їхнє точне значення.

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

Як читати параметри

Для Triangle параметри Left, Peak, Right означають: ступінь належності дорівнює 0 у лівій і правій точках та 1 у вершині. Між ними значення змінюється лінійно. Для Trapezoid повна належність триває від LeftShoulder до RightShoulder. У Ramp значення змінюється від 0 в Foot до 1 у Shoulder; якщо Shoulder менше за Foot, це спадна множина.

Накладання сусідніх множин навмисне: наприклад, результат може бути водночас частково Standby і Authorize. Детальніше про форми — у Функціях належності, а про правила та дефазифікацію — у Мові правил і Налаштуваннях висновку.

1. RadarAssessment — оцінювання загрози

Система визначає, наскільки пріоритетною є найближча ворожа ціль. TargetDistance вимірюється в Unreal units, ClosingRate — у Unreal units за секунду. Щокадру турель обчислює ClosingRate як (попередня дистанція − поточна дистанція) / Delta Seconds і обмежує результат діапазоном 0…1200: віддалення дає 0, швидке зближення — більше значення. Результат ThreatPriority передається у FireControl.

Змінна Діапазон Множина Параметри Значення
TargetDistance 0…3200 Critical Ramp: 1600 → 100 критично близько; повна належність біля 100 і менше, зникає до 1600
Tactical Triangle: 700 / 1700 / 2700 робоча дальність; найтиповіша близько 1700
Distant Ramp: 1900 → 3200 далека ціль; сила зростає після 1900 і повна біля 3200
ClosingRate 0…1200 Slow Ramp: 650 → 0 ціль зближується повільно або майже не зближується
Fast Ramp: 250 → 1100 швидке зближення; повна належність біля 1100
ThreatPriority 0…1 Observe Triangle: 0 / 0.12 / 0.45 спостерігати, без високого пріоритету
Track Triangle: 0.30 / 0.58 / 0.82 супроводжувати ціль
Engage Triangle: 0.68 / 0.93 / 1 загроза достатня для ураження

Правила підвищують пріоритет для близької або швидко наближуваної цілі. Далека повільна ціль дає Observe, далека швидка — Track, а критична або тактична швидка — Engage.

2. TrackingControl — швидкість наведення

Система обирає швидкість сервоприводу. AimError — кутова помилка між віссю гармати й ціллю у градусах. Результат TrackingSpeed — множник швидкості повороту, а не кут.

Змінна Діапазон Множина Параметри Значення
TargetDistance 0…3200 Near Trapezoid: 0 / 0 / 650 / 1450 близька ціль
Medium Triangle: 800 / 1650 / 2500 середня дальність
Far Trapezoid: 1900 / 2700 / 3200 / 3200 далека ціль
AimError 0…180° Aligned Trapezoid: 0 / 0 / 3 / 13 гармату наведено: повна відповідність до 3°, спад до 13°
Tracking Triangle: 5 / 35 / 85 ціль у процесі наведення
Lost Ramp: 45 → 150 велика помилка: ціль майже або повністю втрачена
TrackingSpeed 0.8…7.5 Precise Triangle: 0.8 / 1.5 / 3.2 повільне точне доведення
Responsive Triangle: 2.2 / 4.2 / 6.1 звичайне стеження
Rapid Triangle: 4.8 / 7.0 / 7.5 швидкий пошук або перехоплення

Головне правило тут просте: Lost дає Rapid, Tracking — Responsive, Aligned — Precise. Додаткове правило гарантує Rapid, якщо ціль одночасно далека і втрачена.

3. FireControl — дозвіл на вогонь

Система поєднує точність, пріоритет загрози та тепловий стан. Її вихід FireAuthorization — плавний показник дозволу на постріл від 0 до 1. Він не замінює механічні обмеження: Blueprint також перевіряє перезаряджання.

Змінна Діапазон Множина Параметри Значення
AimError 0…180° Locked Trapezoid: 0 / 0 / 2.5 / 9 надійне захоплення; повна відповідність до 2.5°, зникає до 9°
Marginal Triangle: 3 / 14 / 34 допустима, але неточна наводка
Unsafe Ramp: 14 → 75 небезпечна помилка; повна належність від 75°
ThreatPriority 0…1 Low Ramp: 0.70 → 0.05 низький пріоритет; повна належність біля 0.05 і нижче
High Ramp: 0.35 → 0.95 високий пріоритет; повна належність біля 0.95
WeaponHeat 0…1 Safe Ramp: 0.82 → 0.05 безпечна температура; повна належність біля 0.05
Hot Ramp: 0.58 → 0.98 перегрів; повна належність біля 0.98
FireAuthorization 0…1 Inhibit Triangle: 0 / 0.08 / 0.42 заборона вогню; найсильніша біля 0.08
Standby Triangle: 0.30 / 0.55 / 0.78 супроводжувати й чекати кращої умови; максимум біля 0.55
Authorize Triangle: 0.68 / 0.94 / 1 дозвіл на вогонь; найсильніший біля 0.94

Що означають значення FireAuthorization

  • 0…0.42: активна множина Inhibit; стріляти не можна.
  • приблизно 0.30…0.78: область Standby; система ще може супроводжувати ціль, але умови недостатні для пострілу.
  • 0.68…1: активна Authorize; що ближче результат до 0.94, то сильніша сукупна підстава для пострілу.

У демонстраційному Blueprint постріл фактично дозволяє перевірка FireAuthorization > 0.64 разом із нульовим FireCooldown. Поріг нижчий за початок Authorize (0.68), щоб у зоні переходу не виникало різкого перемикання, але низькі й невизначені результати все одно не могли запустити снаряд.

Правила безпеки мають пріоритет: Unsafe, Low або Hot ведуть до Inhibit. Лише поєднання Locked, High і Safe дає Authorize; Marginal, High, Safe дає проміжний Standby.

Роль JSON

DA_RadarAssessment, DA_TrackingControl і DA_FireControl побудовано з відповідних JSON-файлів (RadarAssessment.json, TrackingControl.json, FireControl.json) через FuzzyLogicStatics.load_fuzzy_system_from_json. Під час виконання BP_FuzzyTurret читає ці три Data Asset напряму; жоден JSON не парситься під час виконання й не потрібен запакованій збірці.

Можна також відкрити будь-який із трьох Data Asset, змінити систему в редакторі та натиснути Save To JSON, щоб синхронізувати зовнішній пресет вручну.

Що спробувати

  • знизьте поріг FireAuthorization > 0.64 у Blueprint і подивіться, як турель починає стріляти раніше, з меншою впевненістю;
  • розширте AimError.Locked у FireControl і перевірте, наскільки неточнішу наводку турель терпітиме, перш ніж перестане стріляти;
  • змініть WeaponHeat.Hot, щоб турелі доводилося охолоджуватися раніше;
  • додайте четверту множину ThreatPriority (наприклад, Critical) і відповідне правило у FireControl;
  • перемкніть дефазифікацію FireControl з Centroid на Mean of Maxima і порівняйте, наскільки рішучіше система переходить до Authorize.

Демо-класи живуть у власному модулі плагіна FuzzyLogicDemo (Plugins/FuzzyLogic/Source/FuzzyLogicDemo) — вони постачаються з плагіном за замовчуванням, але можуть бути повністю виключені зі збірки; див. 16 — Демонстраційний контент.

Значення DefaultValue

DefaultValue в input — початкове значення до першого Set Input. Наприклад, AimError: 90 означає, що до отримання телеметрії система вважає вісь гармати помилковою на 90°.

DefaultValue в output не бере участі у висновку. Це лише значення за замовчуванням у структурі змінної; результат завжди обчислюється з правил і функцій належності. Для FireAuthorization: 0 воно також є безпечним початковим станом до першого обчислення.