How long is a TSoftObjectPtr valid?

Hello! Wow I’m so excited to share this with you. I hope it can still help you. I had been scratching my head over this same problem. I wanted to async load large assets at specific points in time and ensure they stayed in memory. It would also be ideal for this memory to be freed when the Actor that was using the asset gets destroyed. I can’t understand why there isn’t practically any documentation or forums talking about this. Anyways, I really hope this helps with the book keeping! Steps to follow:

Step 1: Define a Streamable manager in a Singleton, ideally your game instance class.

Step 2: On your component / Actor, have a property like this:

Step 3: Load your soft object pointer like this asynchronously. In the component / Class where you have declared your handle.


It is key that you set the parameter which corresponds to ManageActiveHandle to true. What this will do is ensure the handle does not get cleared after assets have been loaded. You must clear it explicitly. In my case that is not even necessary because it will get cleared when my Actor / Component gets destroyed, just like with any hard reference. Just check here in the documentation what the parameter implies.

Step 4:
After this is done, all is well and good. Now you know, whenever you want to access your async loaded asset, you can simply do it with a Get(), and assume the weakObjectPtr always will point to it.

I hope this helps you! This makes the code cleaner and in case you have multiple SoftObjectPtrs of different types in a component / class, you only have to declare a single handle to make sure they all remain loaded in memory.

Bare in mind you have to first group all these softObjectPaths together and call ResquestAsyncLoad for the entire list, like so:

Anyways! Good luck! I hope you get to read this and it avoids some suffering :slight_smile:

8 Likes