Casting to a Blueprint just to call one function is the most common way projects tangle themselves.
A Blueprint Interface lets you talk to any actor by what it can do, not by what it is.
Here is how they work, when to reach for them, and exactly how they compare to the other ways Blueprints communicate.
BRIEFING
A Blueprint Interface is a contract, a list of functions with no bodies, that any actor can implement in its own way. You send the message and whoever implements it responds, without you knowing or referencing its class. That is the whole point: talk to a capability, not a type. This piece explains how interfaces work, when they beat a cast, and how to choose between an interface, an event dispatcher, a direct call and a gameplay tag, with the honest truth about performance.
Here is the reflex almost everyone builds first. You want a door to open when the player interacts, so you take the hit actor, cast it to BP_Door, and call OpenDoor. It works.
Then you add a chest, a lever, a computer terminal and a talkative NPC that all need to react to "interact," and suddenly you have a ladder of casts, one branch per class, each one guessing what the thing might be. Worse, every one of those casts to a Blueprint quietly welds your interacting actor to that class and everything it drags into memory. There is a much cleaner way to say "whoever you are, do your version of this," and it is the Blueprint Interface.
What a Blueprint Interface actually is
A Blueprint Interface is a contract with no implementation: a named list of function signatures, like Interact, TakeDamage or GetInteractionText, and nothing else. On its own it does nothing. Its power comes from actors implementing it: any Blueprint can add the interface and then provide its own body for each function. The door implements Interact by opening; the chest implements it by unlocking; the NPC implements it by starting a conversation. One shared verb, many private answers.
To use it, you send the interface message to an actor. If that actor implements the interface, its version runs. If it does not, nothing happens, safely, no crash and no error. You never had to know what the actor was. You only had to know that you wanted to Interact with it.
The detail that matters: the Message node
There are two ways to call an interface function, and the difference is the whole reason we are here. You can call it directly on a reference that is already typed to the interface, or you can use the Message version of the node, which you send to any actor reference.
The Message node is the decoupled one: it does not require the target to be a specific class, it does not create a hard reference to that class, and if the target does not implement the interface it simply does nothing. That single node is how you replace a whole stack of casts with one clean call that works across every type.
Why an interface beats a cast
Three wins, and they compound.
- No hard reference to the class. A cast to a Blueprint hard-references it, which in Unreal means loading it and its whole dependency chain into memory. An interface Message call does not. This is the same load-cost problem at the heart of dependency management, avoided entirely.
- It works across unrelated types. One Interact message reaches a door, a chest and an NPC that share nothing except the interface. No branch ladder, no per-class casting, no guessing.
- It is polymorphism, cleanly. Each class gives its own answer to the same request, which is the Strategy pattern in Blueprint form: the caller states the intent, the receiver owns the behaviour.
When to reach for an interface
The clean rule is about direction and knowledge. Use an interface when you have a reference to something and want to tell it, or ask it, to do a thing, without caring what class it is. That covers a huge amount of a game:
- Interaction: an Interact or Use message sent to whatever the player is looking at.
- Damage and effects: a TakeDamage or ApplyEffect message to anything that might be damageable.
- Queries that return data: GetInteractionText, GetHealthPercent, CanBeInteractedWith. Interfaces can return values, which is a key difference from dispatchers.
- Commands across systems: telling a component, an actor or a widget to do its version of a standard action.
Interface, dispatcher, cast or tag? Choosing well
This is the question people actually get stuck on, so here is the decision, tool by tool.
Interface vs a cast or direct call
A direct call on a known reference is the fastest and simplest thing, and it is fine when the type is genuinely known and stable, especially a native C++ base class, which you can cast to for free. The moment you find yourself casting to a Blueprint just to call a function, or casting to several classes to handle the same intent, switch to an interface. Same call, no hard reference, works everywhere.
Interface vs Event Dispatcher
This is the big one. An interface is a directed call: you, the caller, reach out to a target you already have a reference to and say "you, do this." An Event Dispatcher is a broadcast: the sender announces "this happened" and any number of listeners react, and the sender does not know who is listening. So the rule of thumb is simple. If you know who you want to talk to, use an interface. If you do not know or care who cares, use a dispatcher. Two more distinctions seal it: an interface is usually one-to-one and can return a value, while a dispatcher is one-to-many and is fire-and-forget with no return. Damage is an interface (you hit a specific thing). "I died" is a dispatcher (whoever cares can react).
Interface vs Gameplay Tag
They answer different questions and pair beautifully. A gameplay tag describes what something is or what state it is in, as data you can query; an interface is a verb, a thing you can ask it to do. A very common, very clean pattern is to check a tag to decide whether to act, then send an interface message to do it.
The honest word on performance
People worry about this more than they should. For normal gameplay, the CPU cost of an interface call is negligible; it is in the same territory as an ordinary function call, and the safe Message node adds only a tiny check for whether the target implements the interface. The real cost you are managing in Unreal is almost never the call itself, it is the hard reference a cast creates, with its loading and memory weight, which the interface avoids. The one genuine caution is the same as for any call: do not fire interface messages every frame across thousands of actors just because you can. Decouple your architecture with interfaces, and keep an eye on how often, not whether, you call them.
And if any of this stirs the usual worry that clean architecture means dropping into C++, it does not. Interfaces are pure Blueprint, and shipping a whole game this way is entirely viable, which I argued in full in the C++ myth piece.
KEY TAKEAWAY
Stop casting to a Blueprint just to call a function. A Blueprint Interface lets you talk to a capability instead of a class: no hard reference, works across every type, and it returns values.
Reach for it whenever you have a reference and want to tell or ask something to act, and save broadcasts for the event dispatcher.
WATCH OUT
Keep interfaces small and focused, one role each, or they bloat into a junk drawer of unrelated functions. Do not use an interface to share behaviour that really wants to be an Actor Component; an interface is a contract (a verb), a component is shared machinery. And remember that the Message node does nothing when the target does not implement the interface, which is exactly the safety you want, but it can also hide a wiring bug behind a silent no-op, so check implementation when something mysteriously fails to react.
Glossary
Blueprint Interface (BPI). a named contract of function signatures with no implementation, that any Blueprint can implement in its own way.
Implement an interface. adding the interface to a Blueprint and providing the body for its functions.
Message node. the safe way to call an interface function on any actor reference: no hard reference to the class, and a harmless no-op if the target does not implement it.
Directed call. communication where the caller reaches out to a specific target it references (what interfaces do), as opposed to a broadcast.
Polymorphism. one request, many implementations: different classes each answer the same interface call in their own way.
Hard reference. a reference that forces a class or asset to load into memory; created by casting to a Blueprint, avoided by an interface Message call.
Event Dispatcher. the broadcast counterpart to an interface: a sender announces an event and unknown listeners react (covered in its own article).
Casting to everything and feeling the project tighten?
Interfaces, dispatchers, subsystems and components each have a right moment, and using the right one is most of what keeps an Unreal project loose and fast to grow.
I design and untangle clean, decoupled architectures in 100% Blueprint.
If your project is turning into a cast ladder, that is exactly what I fix.

