Skip to content

09 — Інтеграція у Blueprint

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

Компонент Fuzzy Logic

UFuzzyLogicComponent доступний у групі Fuzzy Logic та додається до будь-якого актора.

Властивість Значення
System Asset Спільний UFuzzySystemAsset; має пріоритет
Inline System Локальна система, коли асет не призначено

Обидві властивості доступні для запису з Blueprint. Компонент кешує скомпільовану систему й помічає, коли ви вказуєте йому на інший System Asset, — тож перемикання профілів поведінки в рантаймі просто працює. Єдина зміна, якої він не бачить, — редагування структури Inline System на місці; після неї викличте Mark System Dirty.

Передавання входів

Вузол Поведінка
Set Input Записує одне значення; повертає false, якщо імені немає серед входів
Set Inputs Записує Map<Name,float>; повертає кількість знайдених імен
Get Input Повертає передане або типове значення
Clear Inputs Забуває передані значення й повертає систему до Default Value

Передані значення зберігаються між оцінюваннями. Оновлюйте лише те, що змінилося.

Обчислення

Вузол Результат
Evaluate Повний FFuzzyInferenceResult
Evaluate Output Одне число за ім’ям виходу
Evaluate Single Output Число єдиного виходу
Get Last Result Попередній результат без нового обчислення

Вузли Evaluate навмисно не є Pure: логічний висновок виконує роботу, і Pure-вузол міг би непомітно повторювати її для кожного читача піна.

Типовий шаблон актора

Event Tick або таймер
  → Set Input (Distance)
  → Set Input (Health)
  → Evaluate Output (Aggression)
  → застосувати до швидкості, ваги переходу або вибору дії

Використовуйте Evaluate Output, коли потрібне одне число. Evaluate — коли потрібні також ступені, активації чи діагностика: тоді чітке значення дістають із мапи Outputs результату стандартним вузлом Find.

Для великої кількості агентів не обов’язково рахувати кожен кадр. Оцінюйте за таймером, при суттєвій зміні входу або розподіляйте агентів між кадрами.

Інспекція

Вузол Призначення
Is System Valid Чи скомпільована система без помилок
Validate System Повний список діагностик
Get Input Names / Get Output Names Імена в порядку оголошення
Get Last Output Surface Точна поверхня останнього обчислення
Mark System Dirty Скинути кеш після редагування структури Inline System на місці

Get Last Output Surface повертає false для невідомого імені виходу й до першого Evaluate, тож на графіку ніколи не з’явиться крива, якої система не будувала. Повністю нульова поверхня — це справжня відповідь («жодне правило не спрацювало») і повертається як успіх.

Спільні системи для багатьох агентів

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

UFuzzyLogicSubsystem компілює кожен асет один раз і ділиться результатом. Налаштовувати нічого не треба — Unreal створює її разом із game instance. Дістати: Get Game Instance Subsystem, клас Fuzzy Logic.

Вузол Призначення
Evaluate Asset Повний FFuzzyInferenceResult для системи асета
Evaluate Asset Output Одне число за ім’ям виходу
Prepare Asset Компілює завчасно, наприклад на екрані завантаження
Validate Asset Компілює за потреби та повертає діагностику
Invalidate Asset / Invalidate All Скидає кеш після зміни системи в рантаймі
Is Asset Prepared Чи асет уже скомпільовано й готово
Get Cached System Count Скільки систем зараз у кеші
Event Tick або таймер
  → Get Game Instance Subsystem (Fuzzy Logic)
  → Make Map (Distance → 450, Health → 72)
  → Evaluate Asset Output (Asset = BehaviorAsset, Output Variable Name = "Aggression")

Відмінність від компонента в тому, що між викликами нічого не запам’ятовується: передавайте щоразу всі потрібні системі входи, бо стану на актора, який би їх тримав, тут немає. Пропущені змінні відкочуються до свого Default Value. Get Last Result теж немає.

Компонент — для кількох акторів, для власних систем на актора або коли ви малюєте рішення. Підсистема — коли багато агентів ділять один асет поведінки. Числа однакові — рішення ухвалює той самий рушій.

Примітка для редактора: збереження зміненого закешованого асета скидає його запис, тож Play-In-Editor завжди виконує щойно збережену версію.

Статична бібліотека

UFuzzyLogicStatics зручна для одноразових операцій без компонента:

  • Evaluate Fuzzy System;
  • Validate Fuzzy System;
  • Parse Fuzzy Rule та Fuzzy Rule To String;
  • Save/Load Fuzzy System To Json;
  • Evaluate Fuzzy Set;
  • Make Fuzzy Term Key;
  • Describe Fuzzy Set;
  • Fuzzy Diagnostic To String.

Для багаторазового оцінювання використовуйте компонент: він кешує скомпільовану систему.

Структура результату

Розберіть (Break) FFuzzyInferenceResult, щоб отримати чіткі виходи, ступені входів, активації множин і правил та діагностику. Усі шість полів доступні для читання з Blueprint.

C++-помічники структури (GetOutput, GetSingleOutput, HasErrors) не є Blueprint-вузлами. З Blueprint:

  • чітке значення дістають вузлом Find по мапі Outputs;
  • перевіряйте bSuccess, перш ніж застосовувати результат системи, яка може надходити з користувацьких даних;
  • щоб відрізнити помилки від попереджень, пройдіть циклом по Diagnostics і порівняйте Severity або викличте Validate System на компоненті.