Text Mesh pro Typewriter effect
Text Mesh pro Typewriter effect
Hi,
I have two things. One is doubt and the other is a problem.
Context: I am creating a simple introduction scene. A background image and a TextMeshPro Text with a Text Mesh pro Typewriter effect. It will write little by little a simple text and, once finished, go the first playable scene. (To make sure, I am not using a Standard Dialogue UI, etc here as I guess it is not necessary for this case).
The problem: I am using the Full Pause Duration which pauses the typewriter effect when it founds a "\." inside the text. If I write it directly inside the Text Mesh Pro UGUI (Script) -> Text Input Box something like "Hello.\. My name is Gabriel." The result is what I expected, where the "\." doesn't appear in "play mode" and pauses the time I assigned. The problem is when I use a Localize Text Mesh Pro. It seems to write also "\." in "play mode". It affects the other special characters that are mentioned inside the documentation too: "\,", >, etc. I am not really sure why.
The doubt: Is there a way to detect when it reaches a certain part of the text? I will like to make appear like a "continue button" in those moments while the Text Mesh pro Typewriter effect is paused. When the player presses it, the text continues.
Thanks!
I have two things. One is doubt and the other is a problem.
Context: I am creating a simple introduction scene. A background image and a TextMeshPro Text with a Text Mesh pro Typewriter effect. It will write little by little a simple text and, once finished, go the first playable scene. (To make sure, I am not using a Standard Dialogue UI, etc here as I guess it is not necessary for this case).
The problem: I am using the Full Pause Duration which pauses the typewriter effect when it founds a "\." inside the text. If I write it directly inside the Text Mesh Pro UGUI (Script) -> Text Input Box something like "Hello.\. My name is Gabriel." The result is what I expected, where the "\." doesn't appear in "play mode" and pauses the time I assigned. The problem is when I use a Localize Text Mesh Pro. It seems to write also "\." in "play mode". It affects the other special characters that are mentioned inside the documentation too: "\,", >, etc. I am not really sure why.
The doubt: Is there a way to detect when it reaches a certain part of the text? I will like to make appear like a "continue button" in those moments while the Text Mesh pro Typewriter effect is paused. When the player presses it, the text continues.
Thanks!
Re: Text Mesh pro Typewriter effect
Hi Javier,
TextMesh Pro requires an extra frame to initialize its content. Untick the typewriter effect''s Play On Enable, and add a script like this to start the effect:
StartTMPTypewriter.cs
Try using a Localize UI component instead of Localize Text Mesh Pro.Japtor wrote: ↑Mon Jan 07, 2019 7:12 amThe problem: I am using the Full Pause Duration which pauses the typewriter effect when it founds a "\." inside the text. If I write it directly inside the Text Mesh Pro UGUI (Script) -> Text Input Box something like "Hello.\. My name is Gabriel." The result is what I expected, where the "\." doesn't appear in "play mode" and pauses the time I assigned. The problem is when I use a Localize Text Mesh Pro. It seems to write also "\." in "play mode". It affects the other special characters that are mentioned inside the documentation too: "\,", >, etc. I am not really sure why.
TextMesh Pro requires an extra frame to initialize its content. Untick the typewriter effect''s Play On Enable, and add a script like this to start the effect:
StartTMPTypewriter.cs
Code: Select all
using System.Collections;
using UnityEngine;
public class StartTMPTypewriter : MonoBehaviour
{
private IEnumerator Start()
{
var tmp = GetComponent<TMPro.TextMeshProUGUI>();
if (tmp == null) yield break;
var originalColor = tmp.color;
tmp.color = new Color(0, 0, 0, 0);
yield return null;
yield return new WaitForEndOfFrame(); // Give TMP time to build its mesh.
tmp.color = originalColor;
GetComponent<PixelCrushers.DialogueSystem.TextMeshProTypewriterEffect>().StartTyping(tmp.text);
}
}
Assign a method to the typewriter effect's OnCharacter() event. The effect will call this method every time it adds a character. When it gets to the part where you want to stop, call the typewriter effect's Pause() method. After the player clicks the continue button, call the Unpause() method.
Re: Text Mesh pro Typewriter effect
Hi Tony,
Thanks for the reply!
Another doubt: I am not sure how to configure the OnCharacter() Event. How do you know when the text has arrived at the part you want to start a Pause()?
Thanks!
Thanks for the reply!
Another doubt: I am not sure how to configure the OnCharacter() Event. How do you know when the text has arrived at the part you want to start a Pause()?
Thanks!
Re: Text Mesh pro Typewriter effect
Check the TextMeshProUGUI's text property. Your script could check for a specific length. Here's a simple example:
Code: Select all
public class TypewriterContinueButton : MonoBehaviour
{
public int pausedAtLength = 20; // Set in inspector.
public Button continueButton; // Set in inspector.
private TextMeshProTypewriterEffect typewriter;
private TextMeshProUGUI tmp;
void Start()
{
tmp = GetComponent<TextMeshProUGUI>();
typewriter = GetComponent<TextMeshProTypewriterEffect>();
typewriter.onCharacter.AddListener(CheckLength);
continueButton.onClick.AddListener(Continue);
continueButton.gameObject.SetActive(false);
}
void CheckLength()
{
if (tmp.text.Length == pausedAtLength)
{
typewriter.Pause();
continueButton.gameObject.SetActive(true);
}
}
void Continue()
{
typewriter.Unpause();
continueButton.gameObject.SetActive(false);
}
}[code]
The example above hooks up the UnityEvents in code, but you could hook them up in the inspector instead if you prefer. I just typed this script into the reply. It might have typos. I also didn't include the "using" part at the top of the script.
Re: Text Mesh pro Typewriter effect
Hi Tony,
Thanks for the reply!
Is there not a better way than checking the length? Because when the text is in a different language, the length of the text changes.
I was thinking of using the Full Pause Duration (\.) from the Text Mesh Pro Typewriter Effect. However, I think the Full Pause Duration doesn't have able a way to pause it forever (until you know, the continue button) and also the ability to unpause it, right? For example, I tested putting "20" inside the Full Pause Duration and then use the Unpause(). The thing is Unpause doesn't unpause the Full Pause Duration.
Any other idea?
Thanks!
Thanks for the reply!
Is there not a better way than checking the length? Because when the text is in a different language, the length of the text changes.
I was thinking of using the Full Pause Duration (\.) from the Text Mesh Pro Typewriter Effect. However, I think the Full Pause Duration doesn't have able a way to pause it forever (until you know, the continue button) and also the ability to unpause it, right? For example, I tested putting "20" inside the Full Pause Duration and then use the Unpause(). The thing is Unpause doesn't unpause the Full Pause Duration.
Any other idea?
Thanks!
Re: Text Mesh pro Typewriter effect
You could put a special code inside your text, such as:
In the StartTMPTypewriter's Start method, you can look for this code, record its position, and remove it before starting the typewriter effect. Something like:
Code: Select all
This is sentence 1. <PAUSE> This is sentence 2.
Code: Select all
private IEnumerator Start()
{
var tmp = GetComponent<TMPro.TextMeshProUGUI>();
if (tmp == null) yield break;
int position = UITools.StripRPGMakerCodes(tmp.text).IndexOf("<PAUSE>");
GetComponent<TypewriterContinueButton>().pausedAtLength = position;
tmp.text = tmp.text.Remove("<PAUSE>");
var originalColor = tmp.color;
tmp.color = new Color(0, 0, 0, 0);
yield return null;
yield return new WaitForEndOfFrame(); // Give TMP time to build its mesh.
tmp.color = originalColor;
GetComponent<PixelCrushers.DialogueSystem.TextMeshProTypewriterEffect>().StartTyping(tmp.text);
}
Re: Text Mesh pro Typewriter effect
Hi,
Thanks for the reply.
It finally worked! Thank you so much!
If someone wants to do something similar with more <PAUSE> moments inside one single text. You can add something like this:
And inside the Start add this before the StartTyping function:
Thanks again, Tony!
Thanks for the reply.
It finally worked! Thank you so much!
If someone wants to do something similar with more <PAUSE> moments inside one single text. You can add something like this:
Spoiler
Code: Select all
private bool GetAllPausePosition()
{
int position = PixelCrushers.DialogueSystem.UITools.StripRPGMakerCodes(m_TextMeshProUGUI.text).IndexOf(m_PauseString); //m_PauseString -> <PAUSE>
// If it finds a <PAUSE>
if (position >= 0)
{
m_TextMeshProUGUI.text = m_TextMeshProUGUI.text.Remove(position, m_PauseString.Length);
m_PausePosition.Add(position); // Adds it to a list
return true;
}
return false;
}
Spoiler
Code: Select all
while (GetNextPausePosition());
Re: Text Mesh pro Typewriter effect
Happy to help! Thanks for sharing your code.