public SoundPlayCommand GetSlot(ISoundData data)
        {
            // ISoundSlot unusedSlot = _slotPool.IsEmptyPool() ?
            ISoundSlot unusedSlot = _slotPool
                                    .Spawn()
                                    .SetGlobalVolume(_globalVolume_0_1);

            if (data != null)
            {
                AudioClip playClip = data.GetAudioClip(this);
                if (playClip == null)
                {
                    Debug.LogError($"[{_monoOwner.name}.{nameof(GetSlot)}]soundKey:{data.GetSoundKey()} Clip is null", _monoOwner);
                }

                string soundCategory = data.GetSoundCategory();
                string soundKey      = data.GetSoundKey();
                float  localVolume   = CalculateLocalVolume(data, soundCategory, soundKey);
                bool   isMute        = CalculateMute(soundCategory, soundKey);

                unusedSlot.InitSlot(playClip, soundCategory, soundKey);
                unusedSlot.SetLocalVolume(localVolume);
                unusedSlot.SetMute(isMute);
            }

            SoundPlayCommand playCommand = _commandPool.Spawn();

            playCommand.Init(unusedSlot, DespawnCommand);
            OnPlaySound?.Invoke(unusedSlot);

            return(playCommand);
        }
        private void DespawnCommand(ResourcePlayCommandBase <ISoundSlot> command)
        {
            _commandPool.DeSpawn(command as SoundPlayCommand);

            ISoundSlot soundSlot = command.ResourcePlayer;

            _slotPool.DeSpawn(soundSlot as SoundSlotComponentBase);
            OnFinishSound?.Invoke(soundSlot);
        }