The Sound Subsystem is the driver of the priority system, AudioComponents can either register themselves to it, or you can ask it to spawn one for you. When an AudioComponent is added to the subsystem the user can declare its desired Priority and Sound Group. Which then the system will use to determine it's low-level Priority Level and alter it's volume accordingly.
When I had a progress-check meeting with the lecturer for the module, they mentioned that it would be nice to have a way to group sounds and make changes to those groups, which led to implement the Sound Groups. Sound Groups are essentially a Gameplay Tag that is used to tag sounds, they can alter the priority of a given sound/audio component and/or modify its volume multiplier.
Throughout this module, we were also shown how to use the recording studio in the university. Armed with that knowledge me and my friends wanted to record sounds for our projects and we did. During one of those recording session we came up with the idea for spell incantations in my projects, which I thought was a great idea, so we recorded sounds for them and then I had to implement a system to allow for easy modification and implementation of those sounds in my system. Which is where I developed the Spell Effects system. Spell Effects derive from an Abstract class and default to being instance in Unreal Engine, that way you can easily edit them inline in a blueprint of a choice. That way I could just specify that an Actor in the world will play a spell effect when interacted with and I can implement many different ones. There are 3 in the project
During the development of this coursework I mainly faced many challenges, but one of the most important ones in my opinion was creating a way to easily add and remove the Sound Group volume modifiers and prioritizing sound groups. I had volumes that when the player entered them, a sound group would be prioritized and sound group volume modifiers will be applied and when the player left those changes would be reversed. But the problem was that sometimes the player would enter a volume and then enter a second one before leaving the first and all these changes would get removed. So I was in a volume, but nothing was happening, this led to implement a system where all changes were held in a Stack data structure and I used handles that an object would receive when adding them and can later use to remove the changes.