/**********************************************************************************/ // воспроизводим звуковой эффект по ключу // /**********************************************************************************/ public void PlaySound(string SoundKey) { if (!m_soundEffectCollection.ContainsKey(SoundKey)) { Debug.LogError("We have no such music! Key: " + SoundKey); return; } // проверяем таймера if (m_soundTimers[SoundKey] > 0.0f) { // если таймер ещё не отработал - отправляем звук в очередь и выходим m_soundQueue[SoundKey] = m_soundQueue[SoundKey] + 1; return; } else { m_soundTimers[SoundKey] = m_soundEffectCollection[SoundKey].DelayBeetwenSounds; } // получаем аудио "дорожку" для воспроизведения AudioSource soundEffectAudioSource = null; // если есть свободная - используем её if (m_freeSourceCollections.Count > 0) { soundEffectAudioSource = m_freeSourceCollections.First.Value; m_freeSourceCollections.RemoveFirst(); } // в противном случае создаём новую else { soundEffectAudioSource = Instantiate(AudioEffectLine, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.identity) as AudioSource; soundEffectAudioSource.transform.SetParent(this.transform); } // выбираем звуковой эффект для воспроизведения AudioClipPackage package = m_soundEffectCollection[SoundKey]; int clipIndex = Random.Range(0, package.Clips.Length); // включаем звуковой эффект soundEffectAudioSource.clip = package.Clips[clipIndex].Clip; soundEffectAudioSource.Play(); soundEffectAudioSource.volume = SoundVolume * package.Clips[clipIndex].Volume; m_soundeSourceInUseCollections.AddLast(soundEffectAudioSource); }
/**********************************************************************************/ // функция проверяет отложенные звуковые эффекты и запускает их в случае необходимости // /**********************************************************************************/ protected void ProcessTimersAndQueue() { List <string> keys = new List <string>(m_soundTimers.Keys); foreach (string soundKey in keys) { int queue = m_soundQueue[soundKey]; // если в очереди что-то есть - проверяем таймера if (queue > 0) { float timer = m_soundTimers[soundKey]; timer -= Time.deltaTime; // если пришло время воспроизводить звук - делаем это if (timer <= 0.0f) { m_soundTimers[soundKey] = timer; PlaySound(soundKey); queue--; // выправляем значение таймера if (queue > 0) { AudioClipPackage package = m_soundEffectCollection[soundKey]; timer += package.DelayBeetwenSounds; } else { timer = 0.0f; } m_soundQueue[soundKey] = queue; } // сохраняем обновлённый таймер со значениями для следующего цикла m_soundTimers[soundKey] = timer; } } }
/**********************************************************************************/ // включаем следующий трек зависимости от того, где находимся // /**********************************************************************************/ public void PlayNextTrack() { List <AudioClipPackage> musicSource = null; if (m_state == GAM_STATE.MENU) { musicSource = MainMenuPlayListSources; } else if (m_state == GAM_STATE.GAME) { musicSource = GamePlayListSources; } m_currentTreckNumber++; if (m_currentTreckNumber >= musicSource.Count) { m_currentTreckNumber = 0; } // меняем местами ссылки на источники звука AudioSource currentSource = MusicSource1; MusicSource1 = MusicSource2; MusicSource2 = currentSource; // устанавливаем следуюший трек в новый мажорный источник AudioClipPackage package = musicSource[m_currentTreckNumber]; int clipIndex = Random.Range(0, package.Clips.Length); AudioClip nextClip = package.Clips[clipIndex].Clip; MusicSource1.clip = nextClip; MusicSource1.Play(); m_currentTrackTiming = 0.0f; m_nextTreckSwitch = nextClip.length; }