/// <summary>
        ///   <para>Plays a 3D sound on a given position.</para>
        /// </summary>
        /// <param name="audio">The audio object to be played.</param>
        /// <param name="position">The 3D position where the sound will be played.</param>
        public static void PlaySound(AudioObject audio, Vector3 position)
        {
            //todo: make this function use object pooling instead of instantiation
            if (audio == null)
            {
                Debug.LogWarning("No audio provided");
                return;
            }

            if (!audio.CanPlay())
            {
                return;
            }

            var go       = new GameObject($"{audio.name} SFX");
            var goSource = go.AddComponent <AudioSource>();

            go.transform.position = position;

            audio.SetAudioSource(ref goSource);

            goSource.maxDistance  = 100f;
            goSource.spatialBlend = 1;
            goSource.rolloffMode  = AudioRolloffMode.Linear;
            goSource.dopplerLevel = 0;

            goSource.Play();

            Object.Destroy(go, goSource.clip.length);
        }
        /// <summary>
        ///   <para>Plays a sound as an one shot.</para>
        /// </summary>
        /// <param name="audio">The audio object to be played.</param>
        public static void PlaySound(AudioObject audio)
        {
            if (!audio.CanPlay())
            {
                return;
            }

            if (!s_oneShotGameObject)
            {
                s_oneShotGameObject  = new GameObject("One Shot Sound");
                s_oneShotAudioSource = s_oneShotGameObject.AddComponent <AudioSource>();
            }

            audio.SetAudioSource(ref s_oneShotAudioSource);
            // _oneShotAudioSource.Play();

            s_oneShotAudioSource.PlayOneShot(audio.GetClip(), audio.GetVolume());
        }