There is a model in ReplicatedStorage with a part in it, and a LocalScript in StarterPlayerScripts that reparents that model to workspace.
The part is far enough away from spawn that it’s outside of streaming radius. As soon as the LocalScript parents the model to workspace, the part gets removed.
Expected Behavior
I expect all assets that are not contained in workspace on the server to be entirely unaffected by StreamingEnabled.
I do not expect assets that were parented by the client to be affected by Streaming.
Actual Behavior
Models that are originally in ReplicatedStorage and then parented to workspace by the client are affected by StreamingEnabled. If the parts are not within streaming radius, they get removed as soon as the client sets their parent to workspace. If the player subsequently gets within streaming radius, the parts are not replaced because they do not exist on the server to be streamed back in.
Workaround
Any object that exists on the server will have this issue. But if you clone the object before parenting, the cloned object does not exist on the server, so it will be unaffected by streaming.
Issue Area: Engine Issue Type: Other Impact: High Frequency: Constantly
As the object technically exists on the server, it’s flagged by the client as something that needs to be streamed in and out. This means that even though we parent the object to Workspace on the client, it is still flagged as a “streamable” asset and therefore still gets affected by StreamingEnabled. A workaround this issue is to :Clone() the asset and parent the clone to Workspace. As the cloned asset never truly existed on the server, it was never flagged by the client.
To my knowledge, this is how StreamingEnabled works:
Instance gets created by server → When the Instance is replicated to the client, it gets flagged, and will now be affected by StreamingEnabled
And I’m guessing that even though the client is parenting the asset, it never gets un-flagged, so it will still be affected by StreamingEnabled.
Ultimately, Roblox should have a feature to “un-flag” assets, essentially exempting them from being affected by StreamingEnabled.
If you parent a part out of ReplicatedStorage it is considered a remote part and is subject to stream out. The correct way to avoid this situation is to clone the part out of ReplicatedStorage. This will result in a local part that is not subject to stream out.
We will update the documentation to make this distinction clearer.