Quick answer: Blueprint → Class Settings → Implemented Interfaces → Add. Implement the function in the event graph. Without an implementation, calls return the declared default.
Damage system uses a BPI BPI_Damageable. You call TakeDamage on a target. It returns success but health stays full because the actor never implemented the function.
The Symptom
BPI Call Function fires, return values default (0/empty/false), no error.
The Fix
Target Blueprint:
Class Settings → Implemented Interfaces:
+ BPI_Damageable
Event Graph:
+ Right-click → Add Event → Take Damage // from BPI
Implement: subtract Damage from Health, Return Health
Caller-side gate when in doubt:
Branch: Does Implement Interface(Target, BPI_Damageable)
True → Take Damage(Target, 10)
False → Skip
Verifying
Damage call updates health. Implements check returns true. On non-implementer: skip path runs, no silent default.
“Implement the BPI. Or check before calling. Defaults stop hiding bugs.”
Related Issues
For state alias, see state alias. For GAS attribute, see GAS.
Implement BPI. Or guard with check.