void PlayVoiceInternal(string voiceName, float delay = 0, bool killOtherVoices = true)
    {
        if (killOtherVoices)
        {
            KillAllVoices();
        }

        if (string.IsNullOrEmpty(voiceName))
        {
            return;
        }

        NextVoice next = new NextVoice();

        next.name  = voiceName;
        next.delay = delay;

        _voicesQueue.Add(next);
    }
    IEnumerator VoicesCoroutine()
    {
        while (true)
        {
            _voiceBusy = false;
            // Wait next voice
            while (_voicesQueue.Count == 0)
            {
                yield return(null);
            }
            _voiceBusy = true;

            NextVoice next = _voicesQueue [0];
            _voicesQueue.RemoveAt(0);
            _currentVoiceKilled = false;

            float timer = next.delay;
            while (timer > 0 && !_currentVoiceKilled)
            {
                timer -= Time.deltaTime;
                yield return(null);
            }

            if (_currentVoiceKilled)
            {
                continue;
            }


            string voiceFile;
            if (string.IsNullOrEmpty(languageFolder))
            {
                voiceFile = "Voices/" + next.name;
            }
            else
            {
                voiceFile = "Voices/" + languageFolder + "/" + next.name;
            }

            // Play voice
            ResourceRequest request = LoadClipAsync(voiceFile);
            while (!request.isDone)
            {
                yield return(null);
            }

            AudioClip voiceClip = (AudioClip)request.asset;

            if (_currentVoiceKilled)
            {
                continue;
            }

            GameObject voice = new GameObject("Voice: " + next.name);

            voice.transform.parent = transform;

            _currentVoiceSource = voice.AddComponent <AudioSource> ();
            _currentVoiceSource.outputAudioMixerGroup = voiceAudioMixerGroup;
            _currentVoiceSource.priority            = 64;
            _currentVoiceSource.playOnAwake         = false;
            _currentVoiceSource.mute                = _mutedVoice;
            _currentVoiceSource.volume              = _volumeVoice * DefaultVoiceVolume;
            _currentVoiceSource.ignoreListenerPause = false;
            _currentVoiceSource.clip                = voiceClip;
            _currentVoiceSource.Play();

            // Wait voice over or killed
            while (_currentVoiceSource.isPlaying)
            {
                if (_currentVoiceKilled)
                {
                    _currentVoiceSource.Stop();
                    break;
                }
                yield return(null);
            }

            _currentVoiceSource = null;
            Destroy(voice);

            yield return(null);
        }
    }
Example #3
0
    void PlayVoiceInternal(string voiceName, float delay = 0, bool killOtherVoices = true)
    {
        if (killOtherVoices)
            KillAllVoices();

        if (string.IsNullOrEmpty(voiceName))
            return;

        NextVoice next = new NextVoice();
        next.name = voiceName;
        next.delay = delay;

        _voicesQueue.Add(next);
    }