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.