To be honest, I somehow found a “fix” and I still have a question about it-
For context, I’m trying to preload sounds, but for some reason they all consistenly return “Failure”. After a lot of testing, for some reason, doing :Play() (followed by :Stop() so it doesn’t actually play) before :PreloadAsync() ends up letting the preload consistently return “Success”
…so now I’m wondering why it works? Why can’t it just preload the Sound without me having to run :Play(). And yes I’ve tried waiting for seconds, it would still return “Failure” – though I did notice an instance during my testing where after a while of testing, I basically reset my character, and the preloading reran and ended up returning “Success”.
Roblox doesn’t “fully initialize” a Sound object until it has actually begun loading its audio data, and that doesn’t happen just because the instance exists. Calling :Play() triggers the engine to begin fetching the asset, which is why PreloadAsync() suddenly succeeds afterward.
A Sound must start its load pipeline before PreloadAsync can report it as successfully loaded.
Simply having the instance in the DataModel isn’t enough.
This also explains why:
Calling :Play() then immediately :Stop() makes it work
Resetting your character (causing a replication/update cycle) sometimes makes it work
Waiting for a few seconds without playing does nothing: the engine hasn’t started loading the audio yet
PreloadAsync doesn’t start the load, it only waits for the load to finish. If the sound never entered a loading state, it will always return "Failure".