private IEnumerator SpeakTask(ChatMessage message) { // Wait for any current speech to finish. while (isSpeaking) { yield return(null); } isSpeaking = true; var speakingCharacter = portraits.SingleOrDefault(p => p.Player == message.PlayerSpeaking); var listeningCharacters = portraits.Where(p => p.Player != message.PlayerSpeaking); foreach (var character in listeningCharacters) { character.SetListener(); } if (speakingCharacter != null) { speakingCharacter.SetSpeaker(); } chatText.ClearText(); chatText.gameObject.SetActive(true); chatText.SetText(message.Text, CharactersPerMinute); while (chatText.IsDisplaying) { yield return(null); } yield return(new WaitForSeconds(message.PostDelay)); if (chatQueue.Count == 0) { foreach (var character in portraits) { character.SetVisibility(false); } chatText.SetVisibility(false); } isSpeaking = false; message.Callback?.Invoke(); yield return(null); }