Quick answer: Replace BP “Cast to MyInterface” with “Does Implement Interface” check + Interface Message node call. Prefer C++ interfaces for stable dispatch in cooked builds.
Editor PIE: enemy responds to player’s OnInteract call. Shipping build: silence. Cast to BPI_Interactable returns false even though enemy clearly implements it.
The Symptom
Interface call only works in editor. Cooked build returns null/false from the cast. Implementation visible in the BP editor.
The Fix
Use Does Implement Interface + Message.
BP graph:
Other -> Does Implement Interface(BPI_Interactable) -> Branch true:
Other -> OnInteract (Message) // no cast needed
The Message version dispatches to the implementation without a hard reference. Works for both BP and C++ implementers in cooked builds.
C++ Interface Pattern
UINTERFACE(BlueprintType)
class UInteractable : public UInterface { GENERATED_BODY() };
class IInteractable
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void OnInteract(AActor* Initiator);
};
BP classes can implement IInteractable; from anywhere, call IInteractable::Execute_OnInteract(Target, Initiator) safely.
Verifying
Cook for Shipping. Run on device. Interface calls land. If still failing, check the implementation class is actually cooked (DataAsset cooked correctly).
“Does Implement + Message. C++ interface for stability. Cooks deliver.”
Related Issues
For DataAsset cooked build, see DataAsset. For Blueprint async pending, see async task.
Message dispatch. Cooks honor.