EDIT: Completely rewritten for clarity, because for some reason, not a single person understood what I was trying to fix. In fact, they had the complete opposite idea.
I’m running into an issue where the sounds are behaving like they’re being played locally (or directly to a specific player) instead of originating properly from a 3D position in space and following Roblox’s distance-based dropoff settings.
Originally, my tools would clone a random sound from ReplicatedStorage (I also tried ServerStorage—same result), parent it into the tool, and play it using code like this:
local soundsFolder = RS.Sounds.Sword.Swing
local sounds = soundsFolder:GetChildren()
local randomSwing = sounds[math.random(1, #sounds)]:Clone()
randomSwing.Parent = tool
randomSwing:Play()
debris:AddItem(randomSwing, 1)
Since my tool didn’t have a handle, the sound ended up playing globally (not 3D-positioned). To fix it, I tried parenting the sound to the player’s character instead—but the sound still played globally. I searched for over an hour and couldn’t figure out why.
Then, I tried adding a handle to the tool and cloning the sound into the handle, but it still played globally. The only thing that worked was moving the sound assets directly into the tool itself, and then cloning them into the handle from there. (Same problem happens in my double jump script too—cloning a sound into the character just makes it play globally instead of spatially.)
This solution is extremely inefficient and feels wrong. Please help.
(And yes, I have tried parenting the sound to the player’s HumanoidRootPart. It didn’t work either.)
Not exactly sure what the cause of the problem is, but I would advise against cloning sound objects. Keep the sound object under wherever you want the sound to play.
… because it’s a sound that is to be played in 3D space. The issue is that the sound can be heard from anywhere, as if I were playing to everyone locally.
I don’t think sounds localize if parented to models (tools included). They only do that if their direct parent is a part or attachment.
This is the part that’s a bit strange to me. What are the roll-off distances of the sound? Are you accidentally playing the template sound instead? Are you relying on any part of the new audio wire system?
I think he is looking to avoid any type of drop off to the sound. 3d sound is default in the character and the tool. This one is, place the sound in SoundService.
Considering this is a server script, you would want to create a remote event that a local script can pick up on. Then in that local script move the sound object into the PlayerGui so it only plays for the player.
see if you can mange the swing in a server script and the sound in a client script
i will assume that when a player click their screen (or a text/image button scaled to 1)
you do what you are scared to do in a server script
then fire a remote event to the client script and play the sound
btw i did not fully understand what you are trying to make (:
I don’t know if I worded this incorrectly or something, but none of you guys seem to be understanding my issue. Even with the sound parented to the player’s character via a server script, the sounds are acting like I’m playing them locally. Meaning that the sound can be heard from 1,000 studs away at full volume with no drop-off. This is NOT the intended, nor the desired effect. I want the sound to have an origin in 3D space that get’s quieter as you move away, like normal sounds do. The issue is that THIS IS NOT HAPPENING when I parent the cloned sound into the player’s character or the HumanoidRootPart. I do NOT want the sounds to be localized, but the game is acting as if I played the sound locally to every single player.
In many of my other projects, I’ve been able to just parent the sound to the player’s character and clean it up with DebrisService without any issues. However, for some reason, that approach doesn’t work at all in my current project. As a hacky workaround, I’m now creating a small, massless, invisible, non-collidable part, welding it to the HumanoidRootPart, cloning the sound into that part, playing it, and then using DebrisService to clean up the “SoundPart” afterwards.
I don’t know how anybody hasn’t caught onto this yet, but you need to ensure that you properly set RollOffMaxDistance and RollOffMinDistance. They, as the name suggests, control how far away you need to be for the sound to go completely silent.