I don’t have access to my PC for a few days, but I plan on adding this feature to the master branch.
I do plan on rewriting the code, but the API is nice. I just think creating a thread to do a repeat wait() until is not the best way to accomplish that.
I made this for a StreamingEnabled environment, so it works pretty well for me. I use this quite often without seeing any sort of memory issues or anything related to that. I suppose you could do wait(1) if you are concerned.
I haven’t tested it, but this may break if someone uses the system and changes a user’s listener - although I’m not sure many people use it, it can be used to change where a user ‘hears’ from.
local listenerType, listener = game:GetService("SoundService"):GetListener()
You seem to use the angle to the user’s camera to do the effects, so if the player is listening from somewhere else, it won’t work correctly. (unless you’ve changed something since I’ve last looked.)
Adding a hint of reverb might help. When I created this demonstration, I had added reverb as well. It’s a little too much, but adding the perfect amount helps as well.
I’ve got pretty much all of my game working with this code, and it only required a small amount of modification. Just replace the ‘RenderStepped’ function with the following function.
RunService.RenderStepped:Connect(function()
for Emitter, _ in pairs(CurrentObjects) do
if Emitter.ClassName == "Attachment" then
Emitter.Sound.EqualizerSoundEffect.HighGain = -(-25 * cos(acos(dot(cf(Camera.CFrame.Position,v3(Camera.CFrame.LookVector.X,Camera.CFrame.Position.Y,Camera.CFrame.LookVector.Z)).LookVector.Unit,v3(Emitter.WorldPosition.Unit.X,Camera.CFrame.Position.Y,Emitter.WorldPosition.Unit.Z)))/pi * (pi / 2)) + 25)
elseif Emitter.Sound.Parent:IsA("BasePart") then
Emitter.Sound.EqualizerSoundEffect.HighGain = -(-25 * cos(acos(dot(cf(Camera.CFrame.Position,v3(Camera.CFrame.LookVector.X,Camera.CFrame.Position.Y,Camera.CFrame.LookVector.Z)).LookVector.Unit,v3(Emitter.Sound.Parent.Position.Unit.X,Camera.CFrame.Position.Y,Emitter.Sound.Parent.Position.Unit.Z)))/pi * (pi / 2)) + 25)
end
end
end)
Until now, the module could only add the 3D effect to sounds it created from the :Create() function. Now, if you have a Sound created some other way, be it by another script or before runtime, you can call :Attach() on it to attach the module’s effect onto it as well.
Prior to this update, the module assumed you use the default listener: the Camera. Now, it actually gets the Listener, therefore adding support for setting your listener to various objects or CFrames.
The previous version had some odd behaviours when you left the origin, due to an oversight on my part. Forgot to test while walking around Fixed that now!
Also, changed the easing aspect to -(25 * ((Angle/pi)^2)), which gives a nicer curve.
This is epic. Games like Rainbow Six Siege and Call of duty take advantage of 3-10D Audio. I can already imagine the ideas for like FPS games with the 3D Sound System.
Epik
I’m creating a sound and setting the target parameter to my boombox tool’s handle part. Everything is fine except upon testing with a friend, only I hear the sound being played, how do I get it so that everyone in the server hears it too? Does this happen because the SoundContainer is in the workspace>Camera ?
Also, how would I efficiently remove the attachment if the boombox were to be unequipped and the sound had to be stopped abruptly? Currently I use :Stop() on the sound object and :Destroy() the attachment. Is this fine?
I was using its module and everything was fine, until I discovered that when I rotated the camera and while the sound was in front of me… the equalizer acted as if it was in front of the sound.Most likely it has to do with the attachment never changing its rotation… but i checked your code and there’s nothing wrong. What’s going on?
The only thing I did was attach the sound to an attachment and then play and stand behind it… I repeat, The equalizer acts as if the sound is behind me… And it’s the opposite… and if I position myself in front of the sound… the equalizer remains the same.