// Play method for per particle events void GetAudioSourceAndPlay(AudioClip clip, ParticleSoundVolume volume) { if (volume.volume.mode == ParticleSystemCurveMode.Constant || volume.volume.mode == ParticleSystemCurveMode.TwoConstants) { audioSources.Keys.First().PlayOneShot(clip, volume.volume.Evaluate(0)); } else { AudioSource chosenSource = null; foreach (AudioSource audioSource in audioSources.Keys) { if (!audioSource.isPlaying) { chosenSource = audioSource; audioSources[audioSource] = false; break; } } if (chosenSource == null) { chosenSource = AddAudioSource(false); } // If adding the audio source failed, cancel the play if (chosenSource == null) { return; } chosenSource.clip = clip; chosenSource.Play(); StartCoroutine(ApplyVolumeCurve(chosenSource, volume)); } }
IEnumerator ApplyVolumeCurve(AudioSource audioSource, ParticleSoundVolume volume) { AudioClip originalClip = audioSource.clip; while (audioSource != null && audioSource.isPlaying && audioSource.clip == originalClip) { if (volume.durationMode == ParticleSoundVolume.SoundDurationMode.AUDIO_CLIP_DURATION) { audioSource.volume = volume.volume.Evaluate(Mathf.Clamp(audioSource.time / audioSource.clip.length, 0, 1)); } else if (volume.durationMode == ParticleSoundVolume.SoundDurationMode.PARTICLE_LIFETIME) { float particleLifetime = particles.main.startLifetime.Evaluate(particles.time); audioSource.volume = volume.volume.Evaluate(Mathf.Clamp(audioSource.time / particleLifetime, 0, 1)); } yield return(null); } }