From the few times I had to use AudioStreamPlayer3D, I faced several annoyances that I believe could get improvements, in particular with the attenuation model.
In frameworks and engines I used in the past, the attenuation model of a 3D sound has the following features:
A minimum radius under which no attenuation is performed, in addition to the maximum radius above which the sound gets out of range
Spheres are drawn in the 3D viewport to get an idea of the min/max distances
Nice curves in the inspector showing how attenuation actually looks like over distance
On the other hand, in Godot:
There is no minimum radius, and sound gets ALWAYS attenuated and muffled at any range, more or less. There is no way to decide "I want no low-pass attenuation within this distance, only start beyond it".
There is no visualization of attenuation min/max radius in the main viewport
There is no curves either, only numbers. Tweaking Unit Size to adapt the model to the distances in your game is counter-intuitive. For example it defaults to 1 (whatever that means), and all sounds get too muffled to my taste. I bumped it to 50 and it's still too muffled...
There is no way to disable attenuation low-pass, other than forcing the cutoff frequency to 20500 Hz, which is also counter-intuitive.
Here are extra things that could enhance usability:
When you get an attenuation model that suits you for one AudioStreamPlayer3D, you have to do it again for every single sound you want to play. A way to re-use models could be handy.
Ability to have an attenuation-driven high-pass filter in addition to the low-pass filter. I came up with this need from experience, I've been creating audio series for a long time and when a character voice gets far from the "camera" it often sounds better when part of its low frequencies get cut off rather than its high frequencies (especially outside).
From the same experience, I sometimes have to cross-fade two effect buses (one for near, one for far) for a sound that moves from near to really far away, but in Godot you can only output to one bus. How are we expected to do this without creating a bus for every sound? Do we always have to create two AudioStreamPlayer3D and play them both?
On a stretch goal, Unity3D allows to configure the attenuation model very precisely, even allowing custom curves for each variable of the attenuation effect (volume, lowpass, highpass...). See https://docs.unity3d.com/Manual/class-AudioSource.html
I know some of this can be eventually scripted, but please at least give some consideration to the first part :)
From the few times I had to use
AudioStreamPlayer3D
, I faced several annoyances that I believe could get improvements, in particular with the attenuation model.In frameworks and engines I used in the past, the attenuation model of a 3D sound has the following features:
On the other hand, in Godot:
Unit Size
to adapt the model to the distances in your game is counter-intuitive. For example it defaults to 1 (whatever that means), and all sounds get too muffled to my taste. I bumped it to 50 and it's still too muffled...Here are extra things that could enhance usability:
AudioStreamPlayer3D
, you have to do it again for every single sound you want to play. A way to re-use models could be handy.near
, one forfar
) for a sound that moves from near to really far away, but in Godot you can only output to one bus. How are we expected to do this without creating a bus for every sound? Do we always have to create twoAudioStreamPlayer3D
and play them both?I know some of this can be eventually scripted, but please at least give some consideration to the first part :)