Skip to content

15 — Поширені запитання

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

З чого почати, якщо я не знаю нечіткої логіки?

Прочитайте 01 — Вступ, а потім повторіть 02 — Перші кроки. Для першої системи достатньо Triangle, Trapezoid, стандартних налаштувань і Centroid.

Чим Fuzzy Logic відрізняється від Behavior Tree?

Fuzzy Logic обчислює плавні ступені та числові рішення. Behavior Tree організовує послідовність і вибір задач. Їх зручно поєднувати: нечіткий результат стає score, вагою або параметром задачі.

Чому вихід завжди дорівнює середині діапазону?

Ймовірно, жодне правило не спрацювало або жодне правило не пише в цей вихід. Перевірте Compile Log, покриття вхідних множин і RuleActivations.

Чому Set Input повертає false?

У поточній активній системі немає input із таким ім’ям. Перевірте System Asset, написання (регістр не має значення — імена зіставляються без його урахування) та Get Input Names.

Пам’ятайте, що System Asset має пріоритет над Inline System: якщо асет призначено, шукатимуться не змінні інлайн-системи.

Чи потрібно задавати всі входи перед кожним Evaluate?

Ні. Компонент зберігає передані значення. Для відсутніх використовує Default Value. Clear Inputs повертає всі входи до типових значень.

Чи можна мати кілька виходів?

Так. Використовуйте Evaluate, щоб отримати всю карту, або Evaluate Output за ім’ям. Evaluate Single Output призначений лише для системи з одним виходом.

Чому результати в редакторі не зберігаються?

Слайдери Inference — тимчасовий preview. Змініть Default Value у Details, якщо це має бути стартове значення асета.

Як імпортувати JSON у Data Asset?

Відкрийте асет і натисніть Load Preset. Імпорт перевіряється до зміни даних та підтримує Undo. Зворотний напрямок — Save To JSON.

Чи потрібен JSON у запакованій грі?

Ні, якщо компонент використовує Data Asset. JSON потрібен лише тоді, коли ваша гра свідомо завантажує зовнішні дані через API.

Чому правило позначене Invalid — skipped?

Парсер не зміг зв’язати його з системою. Наведіть курсор або відкрийте Compile Log: повідомлення вкаже невідомий токен, змінну, множину чи змішаний оператор.

Яку дефазифікацію вибрати?

Почніть із Centroid. Weighted Average підходить для швидких систем із Singleton або симетричними виходами. Методи максимуму потрібні, коли важлива найсильніше підтримана область, а не плавний баланс усієї кривої.

Чи можна додати власну функцію належності?

Так. Успадкуйте USTRUCT від FFuzzyMembershipFunction і реалізуйте EvaluateRaw. Докладний приклад є у 04 — Функції належності.

У мене сотня агентів на одній поведінці. Компонент на кожного — це правильно?

Починаючи з певного розміру — ні. Кожен компонент компілює й тримає власну копію системи, тож сотня компонентів — це сотня копій. Натомість візьміть UFuzzyLogicSubsystem — Get Game Instance Subsystem, клас Fuzzy Logic, — яка компілює кожен асет один раз і ділиться ним. Див. 14 — Architecture And Performance.

До кількох десятків агентів це не проявиться в профайлі, а з компонентом працювати простіше. Спочатку виміряйте.

Чи можна використовувати engine з кількох потоків?

Після компіляції незмінний FFuzzyInferenceEngine можна оцінювати паралельно. Не викликайте Compile одночасно з Evaluate на тому самому екземплярі. Компонент лишається UObject і зазвичай працює на Game Thread.

Де подивитися повний робочий приклад?

Відкрийте /FuzzyLogic/Demo/FuzzyDroneArena/Maps/FuzzyDroneArena або /FuzzyLogic/Demo/FuzzyTurretDefense/Maps/FuzzyTurretDefense. Опис структури та вимкнення демо наведено в 16 — Демонстраційний контент.