- Home /
Voice Over Subtitle System don't work
I have this script, but on update, the Display function is not launched at all, why ?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SubtitleManager : MonoBehaviour
{
public List<string> stringsInQueue;
public List<AudioClip> audioInQueue;
public AudioSource gmAudioSource;
[Header("DEBUG")]
public string debugstring;
public AudioClip debugaudio;
void AddToQueue(string askedstring, AudioClip audio)
{
stringsInQueue.Add(askedstring);
audioInQueue.Add(audio);
}
private void Awake()
{
AddToQueue(debugstring, debugaudio);
AddToQueue(debugstring, debugaudio);
AddToQueue(debugstring, debugaudio);//to test
}
private void Update()
{
Display(audioInQueue[0], stringsInQueue[0]);//play the first audio of the list
}
IEnumerator Display(AudioClip audiotoplay,string current)
{
print(current);
gmAudioSource.clip = audiotoplay;
gmAudioSource.Play();
yield return new WaitForSeconds(gmAudioSource.clip.length);
yield return new WaitForSeconds(0.5f);//pause a little before next voiceline
print(current + " stopped");
audioInQueue.Remove(audiotoplay);
stringsInQueue.Remove(current);
}
}
Answer by ADiSiN · May 26, 2020 at 10:44 AM
Hi!
It's because your Display functions is an interface IEnumerator, but you are trying to call it as normal function which not gonna work. In order to call IEnumerator you should use next line:
StartCoroutine(Display(audioInQueue[0], stringsInQueue[0]));//play the first audio of the list);
However, for test purpose or not, you will have it called each frame, because the WaitForSeconds is working inside Coroutine only - it doesn't create delay between calls in Update. In order to create delay that will be controlled by IEnumerator you should have boolean that you will adjust, something like this:
bool is_Speaking;
private void Update()
{
if(!is_Speaking)
StartCoroutine(Display(audioInQueue[0], stringsInQueue[0]));//play the first audio of the list
}
IEnumerator Display(AudioClip audiotoplay, string current)
{
is_Speaking = true;
print(current);
gmAudioSource.clip = audiotoplay;
gmAudioSource.Play();
yield return new WaitForSeconds(gmAudioSource.clip.length);
yield return new WaitForSeconds(0.5f);//pause a little before next voiceline
print(current + " stopped");
audioInQueue.Remove(audiotoplay);
stringsInQueue.Remove(current);
is_Speaking = false;
}
Hope it helps.
Your answer
Follow this Question
Related Questions
A node in a childnode? 1 Answer
How to Mute / Unmute audio after WaitForSeconds() 1 Answer
Musical beat not in perfect time with tempo. WaitForSeconds not accurate. 2 Answers
How to increase rate of a falling object in pooling object? 1 Answer
How to get consecutive voice clips to sound natural 1 Answer