CharTweener icon indicating copy to clipboard operation
CharTweener copied to clipboard

Sprite and/or Rich Text tags in TextMesh label is stopping character animations

Open cellininicholas opened this issue 1 year ago • 1 comments

My character animations are getting as far as the character I have in my text. I'm even skipping the sprite character animation setup.

for (int i = 0; i < tweener.CharacterCount; i++)
{
    TMP_CharacterInfo charInfo = textInfo.characterInfo[i];
    if (charInfo.elementType == TMP_TextElementType.Sprite) {
        Debug.LogWarning($"TMP_TextElementType.Sprite character");
        continue;
    }
    // Character animation setup comes next...
                
}

I've found that if I edit the Text live in the Editor and delete the Sprite, the animations for all the characters suddenly start working. Any tips?


Update 1 In fact, it looks like that is the case with all Rich Text Tags in my TextMeshPro label...


Update 2 I've discovered that in CharTweener::UpdateCharPositions() There is a check which is skipping characters after a Sprite character...

for (var i = proxyTransformList.Count - 1; i >= 0; i--)
{
    // ...
    if (proxy.CharIndex >= characterCount)
        continue;
    // ...
}

Looks like proxy.CharIndex is referencing the index of characters BEFORE Rich Text Tags are passed and characterCount uses the count AFTER Rich Text Tags are passed.

cellininicholas avatar Jun 05 '24 11:06 cellininicholas

Alright I figured out a solution that got it working with Sprites present. I'm too lazy to make a pull request, so if anyone wants to make the change or find the solution, here it is:

In CharTweener.cs, modify AssignCharInfo(TMP_CharacterInfo charInfo) to the following

public void AssignCharInfo(TMP_CharacterInfo charInfo, int parsedCharIndex)
{
    // charIndex = charInfo.index;
    charIndex = parsedCharIndex;
    
    // ...            
}

Then, anytime AssignCharInfo() is called, pass the non-raw character index. That means changing the two calls in UpdateStartPositions() to...

proxy.AssignCharInfo(charInfo[pair.Key], charIndex);

Sprites and all following characters worked for me after that. I assume this also fixes any labels that contain Rich Text.

cellininicholas avatar Jun 05 '24 12:06 cellininicholas