How to add colours to individual letters in an RPG text box scrolling
Like most RPG games, some words have colour, and some have certain styles like italics. Changing the style or the colour for specific words would usually be no problem for me. However my text has a scrolling like effect (AKA a typewriter effect). Meaning each letter appears one after another. The problem with this is that the words' style doesn't take effect until after it's been drawn, and you can also see the HTML tags used to style it.
Here's the code for it.
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class DialogueBoxBehavior : MonoBehaviour
{
[Header("Portrait")]
public Sprite sourceImage;
public Image portrait;
[Header("Dialogue")]
public GameObject textBox;
public Text text;
public TextAsset textFile;
public string[] textLines;
public int lineIndex;
public int endlineIndex;
public float printSpeed;
[Header("Name Tag")]
public Text nameText;
[Header("Sound")]
public AudioClip typingSounds;
private TextPrintSoundBehavior typeSound;
private bool isActive = false;
private bool isPrinting = false;
private bool cancelPrinting = false;
void Awake()
{
typeSound = GetComponent<TextPrintSoundBehavior>();
}
void Start()
{
portrait.sprite = sourceImage;
if (textFile != null)
{
textLines = (textFile.text.Split('\n'));
}
if (endlineIndex == 0)
{
endlineIndex = textLines.Length - 1;
}
if (isActive)
EnableDialogue();
else
DisableDialogue();
}
void Update()
{
if (!isActive)
{
return;
}
if (Input.GetButtonDown("Fire3"))
{
if (!isPrinting)
{
lineIndex++;
if (lineIndex > endlineIndex)
{
DisableDialogue();
}
else
{
StartCoroutine(TextScroll(textLines[lineIndex]));
}
}
else if (isPrinting && !cancelPrinting)
{
cancelPrinting = true;
}
}
}
private IEnumerator TextScroll(string textLine)
{
int letter = 0;
text.text = "";
isPrinting = true;
cancelPrinting = false;
while (isPrinting && !cancelPrinting && (letter < textLine.Length - 1))
{
Debug.Log(textLine[letter]);
text.text += textLine[letter];
letter++;
StartCoroutine(typeSound.PlayTypingSound(typingSounds));
yield return new WaitForSeconds(printSpeed);
}
text.text = textLine;
isPrinting = false;
cancelPrinting = false;
}
public void EnableDialogue()
{
textBox.SetActive(true);
isActive = true;
StartCoroutine(TextScroll(textLines[lineIndex]));
}
public void DisableDialogue()
{
lineIndex = 0;
textBox.SetActive(false);
isActive = false;
cancelPrinting = true;
}
public void ReloadScript(TextAsset textFile)
{
if (textFile != null)
{
textLines = new string[1];
textLines = (textFile.text.Split('\n'));
}
}
}
Anyone know how to get rich text AND a typewriter effect?
Your answer
Follow this Question
Related Questions
Trying to move UI Elements but they are not working 1 Answer
Storing playerprefs as string in inputfield.text 1 Answer
Update and Get PlayerPrefs during runtime? 0 Answers
2D Object effect like Life is Strange? 0 Answers
Make a script of button which gets value of UI.Toggle and stores it in a file 2 Answers