using System.Collections;
using UnityEngine;
namespace Febucci.UI
{
///
/// Default TextAnimatorPlayer, which can show letters dynamically (like a typewriter).
/// To enable it, add this component near a one
/// - Base class:
/// - Manual: TextAnimatorPlayers
///
[HelpURL("https://www.textanimator.febucci.com/docs/text-animator-players/")]
[AddComponentMenu("Febucci/TextAnimator/TextAnimatorPlayer")]
public class TextAnimatorPlayer : Core.TAnimPlayerBase
{
[SerializeField] [Attributes.CharsDisplayTime] [Tooltip("Wait time for normal letters")] public float waitForNormalChars = .03f;
[SerializeField] [Attributes.CharsDisplayTime] [Tooltip("Wait time for ! ? .")] public float waitLong = .6f;
[SerializeField] [Attributes.CharsDisplayTime] [Tooltip("Wait time for ; : ) - ,")] public float waitMiddle = .2f;
[SerializeField] [Tooltip("-True: only the last punctuaction on a sequence waits for its category time.\n-False: each punctuaction will wait, regardless if it's in a sequence or not")] bool avoidMultiplePunctuactionWait = false;
[SerializeField, Tooltip("True if you want the typewriter to wait for new line characters")] bool waitForNewLines = true;
[SerializeField, Tooltip("True if you want the typewriter to wait for all characters, false if you want to skip waiting for the last one")] bool waitForLastCharacter = true;
protected override float WaitTimeOf(char character)
{
//avoids waiting for the last character
if (!waitForLastCharacter && textAnimator.allLettersShown)
return 0;
//avoids waiting for multiple times if there are puntuactions near each other
if (avoidMultiplePunctuactionWait && char.IsPunctuation(character))
{
if (textAnimator.TryGetNextCharacter(out var result))
{
if (char.IsPunctuation(result.character)) //next character is punctuation
{
return waitForNormalChars;
}
}
}
//avoids waiting for new lines
if (!waitForNewLines && !textAnimator.latestCharacterShown.isVisible)
{
bool IsUnicodeNewLine(ulong unicode) //Returns true if the unicode value represents a new line
{
return unicode == 10 || unicode == 13;
}
//skips waiting for a new line
if (IsUnicodeNewLine(textAnimator.latestCharacterShown.textElement.unicode))
return 0;
}
//character is not before another punctuaction
switch (character)
{
case ';':
case ':':
case ')':
case '-':
case ',': return waitMiddle;
case '!':
case '?':
case '.':
return waitLong;
}
return waitForNormalChars;
}
///
/// Waits any input from the user.
///
///
protected override IEnumerator WaitInput()
{
while (!Input.anyKeyDown)
yield return null;
}
}
}