Strange Race condition for one prefab

Following setup:

Here the master Volume is set:

    public class GameController : MonoBehaviour
        [SerializeField] float soundFXMasterVolume = 0.5f;

        public float GetSoundFXMasterVolume()
            return soundFXMasterVolume;

And here it is referenced and read:

    public class ClipManager : MonoBehaviour
        [SerializeField] GameObject positionedSoundPrefab = default;
        [SerializeField] ClipDefinition[] clipDefinitions = default;
        AudioSource audioSource = default;
        GameController gameController = default;
        float soundFXMasterVolume = 1f;

        SpawnedObjectsController spawnedObjectsController = default;
        Transform instanceParent = default;

        private void Awake()
            audioSource = GetComponent<AudioSource>();
            gameController = FindObjectOfType<GameController>();
            spawnedObjectsController = FindObjectOfType<SpawnedObjectsController>();

        private void Start()
            soundFXMasterVolume = gameController.GetSoundFXMasterVolume();
            instanceParent = spawnedObjectsController.sound;

But unfortunately for one of several prefab types that is not working.
The soundFXMasterVolume for that one prefab is not correctly returned. It seems I always get the very first value I set for the serialized field.
To fix it, I have to move the line

soundFXMasterVolume = gameController.GetSoundFXMasterVolume();

from the Start() method to Awake() - which from my understanding is not the correct way to do it.

The prefab that generates the problem is calling the clip manager in its Start() method, which all the others don’t.

What could it be that I am missing to see?

Thanks for the help

@Namey5 @Bunny83
Oh boy… I found out why it is behaving like it is, but I am not really sure why this is the way the stuff gets executed:
Execution order in the Program:
In PortalFactory class a Portal is instantiated. In the Portal classes Start() the sound is played using its component ClipManager (and there a method called PlayAtPosition()).

Here comes the fun part how Unity executes the call:

  • Awake GameController (yes - I have only one for sure)
  • Awake Portal
  • Awake ClipManager
  • Start Portal
  • PlayAtPosition() in ClipManager
  • Start ClipManager

This perfectly explaines why this all only works when the lines are in awake in my first post and why not if they are in the Start() method.
But I thought Unity does all Awake and all Start before running a method in the components. Wow. This somehow terrifies me.

Edit: I found this from 2008 - exactely my question and a short answer: