Not multiple managers just to manage the music...
Right now, the way things are set up, each and every scene have their manager objects in the scene, and the audio manager itself has a few variables, and one of these variables is the default music for the given scene, of which it loads automatically on scene load... when the scene is directly loaded in the Unity editor.
If the scene were to be loaded by any other way (a location warp, for example), the original music keeps playing (after fading out and undoing that), and I tried a few ways of getting the loaded scene's manager's data so that the actual manager knows what to play. No dice...
I guess I probably should keep on reworking things... all the "script talk to another script" stuff I've done up to now involved scripts that are already initialized at the same scene (consistent), but this one involves talking to an object part of a scene that is going to be deleted almost immediately afterwards due to redundancy.
Either way, I think I'll try to get the stuff fixed by the end of the day. If I still run into trouble, perhaps I'll chime in back.
You really don't need multiple managers for the same task.
Also if it works one way and not another, despite both ways loading a new scene, that tells me you are controlling what happens from multiple scripts instead of a proper middleman script that receives instruction from other scripts. Like you are managing the music properly on scene swap but don't do it properly on warp.
The controller should manage everything and you simply call a function or coroutine using a single line of code from anywhere you want.
Ex:
My save handling is a single script, a single controller. It has everything I need setup to save whatever I need it to save split up in different functions. When I want to trigger a save I can trigger any type of save, save any information needed, from any object using a single line of code to call SaveEnemiesKilled() or SaveScore() or call a SaveAll() which will then call all of my save functions but only on the save controller.
It sounds like you are trying to directly control the audio from multiple scripts rather than creating functions on your controller that handle all of that for you with functions like StopAllMusic() or FadeOutMusic()
If I wanted to swap tracks I would simply write a function to do just that, pass along the new information to it and have the function self contained.
Ex:
PlayCurrentLevelMusic(trackNumber)
Pseudocode of that function:
Are we playing any music currently?
If yes, call a function to fade out current music
Yield for the fade
Begin playing new track (trackNumber)
Else
Begin playing new track (trackNumber)
It sounds like you have multiple scripts trying to manage the audioanager and have multiple managers for audio trying to do the work and have to delete redundant objects.
Instead let the audioanager manage the music and whatever script calls the audio just have it call a single predefined function on the manager itself.
This will make debugging waaaaaaay easier as you have a single controller to debug when shit hits the fan instead of debugging the objects that call the function and are trying to control what happens directly.
Also, this future proofs what you are doing. Now if you decide to change the way it works you don't need to change every script that calls PlayCurrentLevelMusic() and instead just alter PlayCurrentLevelMusic() and nothing else has to change from any other script unless you want to change when it occurs.
Ex:
I have a weapons controller for my player that uses 3 main functions: Attack, AltAttack and ChargeAttack. Those are the only 3 that are ever called to be used by the player. If I ever need to edit how those work, change systems or do whatever I want - I simply modify what happens when those functions are called and only need to do it on my weapons controller. My player controller can still call all 3 just fine with any changes I make. I only need to edit 1 script and not worry about touching my player controller. Just like with saves, if I need to change how I handle them even on different platforms I only need to edit the save script and nothing else.
Limit the amount of scripts that CONTROL other scripts by only having those outside scripts call functions on the primary manager or controller which does all the controlling.
Edit: from mobile. Hope it makes sense.