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.