コード例 #1
0
        private void DisposeOfSource(PooledAudioSource data)
        {
            //Search for source in list and remove
            for (int i = 0; i < playingAudio.Count; i++)
            {
                if (playingAudio[i].Equals(data))
                {
                    //Label complete and dispose
                    playingAudio[i].complete = true;
                    playingAudio.RemoveAt(i);
                }
            }

            data.Dispose();

            AudioSource source = (AudioSource)data.audioSource;

            if (source == null)
            {
                return;
            }

            source.Stop();
            source.gameObject.SetActive(false);

            if (audioPool.Count > maxAudioPool)
            {
                Destroy(source.gameObject);
            }
            else
            {
                audioPool.Add(source);
            }
        }
コード例 #2
0
        //Play a random sound at a position selected from a list
        public static PooledAudioSource PlayAudioAtTransform(List <ArdenAudioClip> clips, Transform transform, MixerGroup group = MixerGroup.sfx, float volume = 1, bool looped = false, AudioSourceSettings settings = null)
        {
            if (clips == null)
            {
                return(null);
            }

            if (clips.Count == 0)
            {
                return(null);
            }

            PooledAudioSource source = null;

            if (clips.Count == 1)
            {
                source = PlayPooledClip(clips[0].audioClip, transform.position, group, clips[0].volume * volume, clips[0].GetPitch(), looped, settings);
            }
            else
            {
                int r = UnityEngine.Random.Range(0, clips.Count);
                source = PlayPooledClip(clips[r].audioClip, transform.position, group, clips[r].volume * volume, clips[r].GetPitch(), looped, settings);
            }

            if (source != null)
            {
                source.attached = transform;
                source.Update();
            }


            return(source);
        }
コード例 #3
0
        public void Init(PooledAudioSource source)
        {
            this.source = source;

            position = this.source.audioSource.transform.position;

            source.onComplete += () => { _OnComplete(); };
        }
コード例 #4
0
        public override ArdenAudioInstance Play(AudioSourceSettings settings, float volume, MixerGroup group = MixerGroup.sfx, bool looped = false)
        {
            PooledAudioSource source = SoundManager.PlayPooledClip(audioClip, group, volume * this.volume, GetPitch(), looped, settings);

            ArdenAudioClipInstance instance = new ArdenAudioClipInstance(this, settings);

            instance.Init(source);

            return(instance);
        }
コード例 #5
0
        public static PooledAudioSource PlayAudioAtTransform(ArdenAudioClip clip, Transform transform, MixerGroup group = MixerGroup.ui, float volume = 1, AudioSourceSettings settings = null, bool looped = false)
        {
            if (clip == null)
            {
                return(null);
            }

            PooledAudioSource source = PlayPooledClip(clip.audioClip, transform.position, group, clip.volume * volume, clip.GetPitch(), looped, settings);

            if (source != null)
            {
                source.attached = transform;
                source.Update();
            }

            return(source);
        }
コード例 #6
0
        //Force stop a specific source
        public static void StopPooledClip(PooledAudioSource source)
        {
            if (source == null)
            {
                return;
            }

            if (source.complete)
            {
                return;
            }

            if (Instance.playingAudio.Contains(source))
            {
                //Stop coroutine
                if (source.coroutine != null)
                {
                    CoroutineManager.StopACoroutine(source.coroutine);
                }

                Instance.DisposeOfSource(source);
            }
        }
コード例 #7
0
 private void OnAudioSourceDone(PooledAudioSource source)
 {
     DisposeOfSource(source);
 }
コード例 #8
0
        //Play a sound at a position
        public static PooledAudioSource PlayPooledClip(AudioClip clip, Vector3?position, MixerGroup group = MixerGroup.sfx, float volume = 1, float pitch = 1, bool loop = false, AudioSourceSettings settings = null)
        {
            if (Instance.audioPool == null)
            {
                Instance.audioPool = new List <AudioSource>();
            }

            if (Instance.audioPoolObject == null)
            {
                Instance.audioPoolObject = new GameObject("__Audio Pool (Singleton)");
                GameObject.DontDestroyOnLoad(Instance.audioPoolObject);
            }

            if (clip == null)
            {
                return(null);
            }

            if (settings == null)
            {
                settings = new AudioSourceSettings();
            }

            AudioSource audioSource = null;

            if (position == null)
            {
                audioSource = Instance.GetAudioSource();
            }
            else
            {
                audioSource = Instance.GetAudioSource((Vector3)position);
            }

            audioSource.outputAudioMixerGroup = GetMixerGroup(group);

            audioSource.clip   = clip;
            audioSource.volume = volume;
            audioSource.loop   = loop;
            audioSource.name   = clip.name;
            audioSource.time   = 0;

            if (pitch > 0)
            {
                audioSource.pitch = pitch;
            }
            else
            {
                audioSource.pitch = 0.01f;
            }

            audioSource.Play();

            audioSource.rolloffMode = settings.rolloffMode;
            audioSource.maxDistance = settings.maxDistance;
            audioSource.minDistance = settings.minDistance;

            PooledAudioSource audioSourceData = new PooledAudioSource();

            audioSourceData.audioSource = audioSource;
            audioSourceData.complete    = false;

            //By default, anything not music, ambient, or UI will be affected by time
            if (group != MixerGroup.ambient && group != MixerGroup.music && group != MixerGroup.ui)
            {
                audioSourceData.gameTimebased = true;
            }

            if (loop == false)
            {
                IEnumerator WaitTillAudioComplete()
                {
                    yield return(new WaitWhile(() =>
                    {
                        if (audioSource == null)
                        {
                            return false;
                        }
                        return audioSource.isPlaying;
                    }));

                    if (audioSourceData.onComplete != null)
                    {
                        audioSourceData.onComplete();
                    }
                    Instance.OnAudioSourceDone(audioSourceData);
                }

                audioSourceData.coroutine = CoroutineManager.RunExternalCoroutine(WaitTillAudioComplete());
            }

            Instance.playingAudio.Add(audioSourceData);

            return(audioSourceData);
        }