示例#1
0
 // 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));
     }
 }
示例#2
0
    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);
        }
    }