Super Text Mesh Integration

Announcements, support questions, and discussion for the Dialogue System.
alfa995
Posts: 30
Joined: Mon Dec 03, 2018 11:31 pm

Re: Super Text Mesh Integration

Post by alfa995 »

Thank you! There's a small bug though. Even though the delay amount is calculated properly each node uses the length of the previous one instead of its own.

I think the variable is updated too late, so by the time the line is ready and calculated it already set the delay based on the previous value. So for example the first node gets skipped the first time (variable set to 0 at start) and every other time it uses the length of the last node in the conversation, since that's when the variable was last modified.

I tried running that code on the SubtitlePanel script, on ShowSubtitle, SetFormattedText, etc. but they don't seem to work either.
User avatar
Tony Li
Posts: 22055
Joined: Thu Jul 18, 2013 1:27 pm

Re: Super Text Mesh Integration

Post by Tony Li »

I left my example vague because I wasn't sure how you'd want to implement that part. For that part, assign subtitle.formattedText.text to a SuperTextMesh component. Then check its drawText.Length, such as:

SetSTMEndVar.cs

Code: Select all

using UnityEngine;
using PixelCrushers.DialogueSystem;

public class SetSTMEndVar : MonoBehaviour 
{
    public SuperTextMesh stm; //<--ASSIGN IN INSPECTOR.

    void OnConversationLine(Subtitle subtitle)
    {
        stm.text = subtitle.formattedText.text;
        int numVisibleChars = stm.drawText.Length;
        float minSeconds = DialogueManager.displaySettings.GetMinSubtitleSeconds();
        float charsPerSecond = DialogueManager.displaySettings.GetSubtitleCharsPerSecond();
        float endValue = Mathf.Max(minSeconds, numVisibleChars / Mathf.Max(1, charsPerSecond));
        DialogueLua.SetVariable("end", endValue);
    }
}
alfa995
Posts: 30
Joined: Mon Dec 03, 2018 11:31 pm

Re: Super Text Mesh Integration

Post by alfa995 »

No no, the value of the end variable is correct. STM has a float SuperTextMesh.totalReadTime variable, it says "The total amount of time it will take the mesh to read out text, including animations" so that's already handled automatically, no need to calculate based on text length, just gotta access that variable. I just don't know where to call the DialogueLua.SetVariable for it to work.

Strangely, if I use the regular {{end}} keyword with the corresponding chars per second (2 chars per sec if the text has a 0.5 read delay for example) it works just fine (ignoring delays and draw animations though). So I think it's best to wait for that delegate to be implemented and plug the variable to give it the alternate value. Since my setup is so weird (involving DoozyUI animations, panels that hide/show when the speaker changes, etc) trying to do checks and update the variable in several spots it will get even messier.
User avatar
Tony Li
Posts: 22055
Joined: Thu Jul 18, 2013 1:27 pm

Re: Super Text Mesh Integration

Post by Tony Li »

The code is simpler in that case:

SetSTMEndVar.cs

Code: Select all

using UnityEngine;
using PixelCrushers.DialogueSystem;

public class SetSTMEndVar : MonoBehaviour 
{
    public SuperTextMesh stm; //<--ASSIGN IN INSPECTOR.

    void OnConversationLine(Subtitle subtitle)
    {
        stm.text = subtitle.formattedText.text;
        DialogueLua.SetVariable("end", stm.totalReadTime);
    }
}
I also updated the example above (using drawText.Length) with the full code for a script.

The {{end}} keyword and [var=end] tag are evaluated at the same time, so the timing won't be any different using a delegate function for {{end}}. However, your sequences will look nicer because {{end}} is more standard than [var=end].
User avatar
Tony Li
Posts: 22055
Joined: Thu Jul 18, 2013 1:27 pm

Re: Super Text Mesh Integration

Post by Tony Li »

BTW, in the next update, you can use this script to set {{end}}:

Code: Select all

using UnityEngine;
using PixelCrushers.DialogueSystem;

public class SetSTMEndVar  : MonoBehaviour
{
    public SuperTextMesh stm;

    private void Awake()
    {
        ConversationView.overrideGetDefaultSubtitleDuration = ComputeEndValue;
    }

    private float ComputeEndValue(string text)
    {
        stm.text = text;
        return stm.totalReadTime;
    }
}
alfa995
Posts: 30
Joined: Mon Dec 03, 2018 11:31 pm

Re: Super Text Mesh Integration

Post by alfa995 »

It's all working now, thank you so much for your help!
User avatar
Tony Li
Posts: 22055
Joined: Thu Jul 18, 2013 1:27 pm

Re: Super Text Mesh Integration

Post by Tony Li »

Glad to help!
Post Reply