Collision Sound Framework¶
The Collision Sound Framework is a lightweight solution for subtle but effective Sound Effects for Collisions, in order to improve the realism and authenticity of the experience.
To enable Collision Sound for a GameObject, add the MAGES Collision Sound Object component. This component requires a Rigidbody and Colliders to work (Does not require an Audio Source).
You can select the Collision Sound Material that determines how the object will sound from the Material drop down menu. You can also set the volume level of the specific object using the Local Volume slider.
Collision Sound Controller and Sound Playback¶
The Collision Sound Controller also contains a database of all Collision Sound Material Audio Files. These sounds are loaded when the game starts.
The Collision Sound Controller has a set of settings that can customize the system.
Sound Pool Size: The number of available Audio Playback prefabs allocated for playing back sounds. These can be reused, however it limits how many sounds can play at the same time. Lower values lead to less memory consumption.
Pitch Modulation Enabled, Pitch Modulation Range: Randomly set the pitch of every sound played within the range to make the sounds less repetitive.
Min Collision Volume: The minimum volume a sound can be played back at.
Max Collision Velocity: When a collision at or over this value happens, it is considered to be the highest impact possible, and the loudest sound is played.
Global Volume: Overall volume of all collisions.
Play Delay: Minimum time between collision sounds to avoid audio spam.
The Controller has a pool of Audio Playback prefabs that are used to play back all Collision Sounds. When a collision occurs, the Collision Sound Object requests an Audio Playback prefab from the Collision Sound Bank. The prefab is then loaded with the correct sound, its various parameters are set depending on the strength of the impact, and it is moved to the location of the impact. The sound is finally played back.
Audio File Structure¶
Each Sound Material’s Audio File contains a pool of different variations on the Sound Material, to make the sound more realistic. These pools also contain different sounds for different strengths of collisions.
These different Sounds are all placed into 1 Audio file.
When a collision happens, a pool is chosen at random. Then, depending on the strength of the collision, a Strength level is chosen.
For each Sound Material, the number of levels is the same across all of the pools. The duration of each level is also always the same. Every Sound Material can have a different number of levels, pools or different level duration.
All collision detection provided by Unity’s collision system is used to detect initial collisions between Game Objects (usage of OnCollisionEnter). However, to further enhance the collision detection system, all new collisions that a GameObject might have while already colliding with another GameObject, are also now detected.
The rotation detection system uses the rotational difference of the object in between frames to recognize collisions. If the object is rotating and then suddenly stops, while already colliding with another object, it is assumed to have collided with something due to the sudden stop.
Determining the Strength of a Collision¶
The Strength of a collision is defined as a value within (0,1] that defines how powerful a collision was. This requires setting a maximum strength for both Collisions detected by Unity, and with the rotation detection system.
For collisions using Unity’s OnCollisionEnter, the mass defined in the Rigidbody attached to the Interactable is used, multiplied by some constants.
For the rotation detection system, the size of the collider’s bounding box is used as a measure for setting a rotational difference threshold. For example, a pen can have many small rotations that would be ignored with a high rotational threshold, and a larger statue’s small collisions would be detected as big with a smaller rotational threshold.
Then, to pick a Strength in between the minimum and maximum values:
For collisions using Unity’s OnCollisionEnter, the impulse magnitude of the collision is used.
For collisions using the rotation detection system, the difference in rotation between the previous frame and the current frame is used.
The Strength is used to manipulate the Volume of the Audio Source, and is also used to pick a specific Strength Level from the Collision Sound Material.