private void CheckShowTime(BubbleMsg msg) { var timeLeft = msg.maxTime - (msg.msg.Length * msg.characterPopInSpeed); var additionalTime = PlayerPrefs.GetFloat(PlayerPrefKeys.ChatBubbleAdditionalTime); if (timeLeft >= additionalTime) { return; } //Set max time to the needed amount msg.maxTime = additionalTime - timeLeft; }
/// <summary> /// Pops in characters from the message over time /// </summary> private void ShowCharacter(BubbleMsg msg) { while (msg.elapsedTime > 0f) { if (msg.characterIndex > msg.msg.Length - 1) { break; } msg.elapsedTime -= msg.characterPopInSpeed; var currentCharacter = msg.msg[msg.characterIndex]; if (char.IsWhiteSpace(currentCharacter)) { msg.elapsedTime -= msg.characterPopInSpeed * 2f; } else if (char.IsPunctuation(currentCharacter)) { msg.elapsedTime -= msg.characterPopInSpeed * 3f; } var text = msg.msg.Substring(0, msg.characterIndex + 1); var newText = new StringBuilder(); //God Save Our Eyes if ((msg.modifier & ChatModifier.Clown) == ChatModifier.Clown && PlayerPrefs.GetInt(PlayerPrefKeys.ChatBubbleClownColour) == 1) { for (int i = 0; i < text.Length; i++) { newText.Append($"<color=#{RandomUtils.CreateRandomBrightColorString()}>{text[i]}</color>"); } } else { newText.Append(text); } if (msg.buffered && msg.characterIndex < msg.msg.Length - 1) { //Add the rest of the character but invisible to make bubble correct size //and keep the characters in the same place (helps reading) newText.Append($"<color=#00000000>{msg.msg.Substring(msg.characterIndex + 1)}</color>"); } SetBubbleParameters(newText.ToString(), msg.modifier); msg.characterIndex++; } }
IEnumerator ShowDialogue(CancellationToken cancelToken) { showingDialogue = true; if (msgQueue.Count == 0) { yield return(WaitFor.EndOfFrame); yield break; } BubbleMsg msg = msgQueue.Dequeue(); SetBubbleParameters(msg.msg, msg.modifier); while (showingDialogue) { if (cancelToken.IsCancellationRequested) { yield break; } yield return(WaitFor.EndOfFrame); msg.elapsedTime += Time.deltaTime; if (msg.elapsedTime * displayTimeMultiplier >= msg.maxTime && msg.elapsedTime >= displayTimeMin) { if (msgQueue.Count == 0) { ReturnToPool(); } else { msg = msgQueue.Dequeue(); SetBubbleParameters(msg.msg, msg.modifier); } } } yield return(WaitFor.EndOfFrame); }
IEnumerator ShowDialogue() { showingDialogue = true; if (msgQueue.Count == 0) { yield return(WaitFor.EndOfFrame); yield break; } BubbleMsg msg = msgQueue.Dequeue(); SetBubbleParameters(msg.msg, msg.modifier); while (showingDialogue) { yield return(WaitFor.EndOfFrame); msg.elapsedTime += Time.deltaTime; if (msg.elapsedTime * displayTimeMultiplier >= msg.maxTime && msg.elapsedTime >= displayTimeMin) { if (msgQueue.Count == 0) { bubbleText.text = ""; chatBubble.SetActive(false); showingDialogue = false; } else { msg = msgQueue.Dequeue(); SetBubbleParameters(msg.msg, msg.modifier); } } } yield return(WaitFor.EndOfFrame); }
IEnumerator ShowDialogue(CancellationToken cancelToken) { showingDialogue = true; if (msgQueue.Count == 0) { yield return(WaitFor.EndOfFrame); yield break; } DoBubble: BubbleMsg msg = msgQueue.Dequeue(); //Sets the chat text to instant from player prefs, 1 == true msg.instantText = PlayerPrefs.GetInt(PlayerPrefKeys.ChatBubbleInstant) == 1; bubbleSize = PlayerPrefs.GetFloat(PlayerPrefKeys.ChatBubbleSize); if (msg.instantText) { SetBubbleParameters(msg.msg, msg.modifier); } else { //Sets the chat character pop in speed from player prefs msg.characterPopInSpeed = PlayerPrefs.GetFloat(PlayerPrefKeys.ChatBubblePopInSpeed); //See if the show time needs updating for speed CheckShowTime(msg); } while (showingDialogue) { if (cancelToken.IsCancellationRequested) { yield break; } yield return(WaitFor.EndOfFrame); msg.elapsedTime += Time.deltaTime; if (msg.instantText == false) { ShowCharacter(msg); } if (msg.elapsedTime * displayTimeMultiplier >= msg.maxTime && msg.elapsedTime >= displayTimeMin) { if (msgQueue.Count == 0) { ReturnToPool(); } else { goto DoBubble; } } } yield return(WaitFor.EndOfFrame); }