Quick answer: AsyncLoadObject returns UObject. Cast to your specific class on the loaded result; check IsValid first.

Soft Object reference to UEnemyData. Async Load completes. Cast returns null. Wrong type or load actually failed.

The Fix

BP:
  Async Load Object (SoftObjectRef = EnemyDataRef)
    On Loaded:
      Branch: IsValid(LoadedObject)
        True → Cast To EnemyData
          Cast Succeeded → Use(EnemyData)
          Cast Failed → Log warning, retry
        False → Log error

Two-phase validation: IsValid checks the load succeeded; Cast narrows type. Failure paths give graceful UX.

Verifying

Async load completes; cast returns valid EnemyData. Mismatched class: cast fails cleanly, logged.

“IsValid then Cast. Defensive load.”

Related Issues

For Soft Class async load, see soft class. For SpawnActor Deferred, see spawn deferred.

Validate. Cast. Use.