You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.7 KiB
C#
121 lines
3.7 KiB
C#
6 months ago
|
using UnityEngine;
|
||
|
using System.Collections;
|
||
|
|
||
|
|
||
|
namespace TMPro.Examples
|
||
|
{
|
||
|
public class TextConsoleSimulator : MonoBehaviour
|
||
|
{
|
||
|
private TMP_Text m_TextComponent;
|
||
|
private bool hasTextChanged;
|
||
|
|
||
|
void Awake()
|
||
|
{
|
||
|
m_TextComponent = gameObject.GetComponent<TMP_Text>();
|
||
|
}
|
||
|
|
||
|
|
||
|
void Start()
|
||
|
{
|
||
|
StartCoroutine(RevealCharacters(m_TextComponent));
|
||
|
//StartCoroutine(RevealWords(m_TextComponent));
|
||
|
}
|
||
|
|
||
|
|
||
|
void OnEnable()
|
||
|
{
|
||
|
// Subscribe to event fired when text object has been regenerated.
|
||
|
TMPro_EventManager.TEXT_CHANGED_EVENT.Add(ON_TEXT_CHANGED);
|
||
|
}
|
||
|
|
||
|
void OnDisable()
|
||
|
{
|
||
|
TMPro_EventManager.TEXT_CHANGED_EVENT.Remove(ON_TEXT_CHANGED);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Event received when the text object has changed.
|
||
|
void ON_TEXT_CHANGED(Object obj)
|
||
|
{
|
||
|
hasTextChanged = true;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Method revealing the text one character at a time.
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
IEnumerator RevealCharacters(TMP_Text textComponent)
|
||
|
{
|
||
|
textComponent.ForceMeshUpdate();
|
||
|
|
||
|
TMP_TextInfo textInfo = textComponent.textInfo;
|
||
|
|
||
|
int totalVisibleCharacters = textInfo.characterCount; // Get # of Visible Character in text object
|
||
|
int visibleCount = 0;
|
||
|
|
||
|
while (true)
|
||
|
{
|
||
|
if (hasTextChanged)
|
||
|
{
|
||
|
totalVisibleCharacters = textInfo.characterCount; // Update visible character count.
|
||
|
hasTextChanged = false;
|
||
|
}
|
||
|
|
||
|
if (visibleCount > totalVisibleCharacters)
|
||
|
{
|
||
|
yield return new WaitForSeconds(1.0f);
|
||
|
visibleCount = 0;
|
||
|
}
|
||
|
|
||
|
textComponent.maxVisibleCharacters = visibleCount; // How many characters should TextMeshPro display?
|
||
|
|
||
|
visibleCount += 1;
|
||
|
|
||
|
yield return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Method revealing the text one word at a time.
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
IEnumerator RevealWords(TMP_Text textComponent)
|
||
|
{
|
||
|
textComponent.ForceMeshUpdate();
|
||
|
|
||
|
int totalWordCount = textComponent.textInfo.wordCount;
|
||
|
int totalVisibleCharacters = textComponent.textInfo.characterCount; // Get # of Visible Character in text object
|
||
|
int counter = 0;
|
||
|
int currentWord = 0;
|
||
|
int visibleCount = 0;
|
||
|
|
||
|
while (true)
|
||
|
{
|
||
|
currentWord = counter % (totalWordCount + 1);
|
||
|
|
||
|
// Get last character index for the current word.
|
||
|
if (currentWord == 0) // Display no words.
|
||
|
visibleCount = 0;
|
||
|
else if (currentWord < totalWordCount) // Display all other words with the exception of the last one.
|
||
|
visibleCount = textComponent.textInfo.wordInfo[currentWord - 1].lastCharacterIndex + 1;
|
||
|
else if (currentWord == totalWordCount) // Display last word and all remaining characters.
|
||
|
visibleCount = totalVisibleCharacters;
|
||
|
|
||
|
textComponent.maxVisibleCharacters = visibleCount; // How many characters should TextMeshPro display?
|
||
|
|
||
|
// Once the last character has been revealed, wait 1.0 second and start over.
|
||
|
if (visibleCount >= totalVisibleCharacters)
|
||
|
{
|
||
|
yield return new WaitForSeconds(1.0f);
|
||
|
}
|
||
|
|
||
|
counter += 1;
|
||
|
|
||
|
yield return new WaitForSeconds(0.1f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|