Long story short, for some reason, at a point, I need to retrieve the characterInfo with given index numbers. I have at least 600 characters in my textMeshProUGUI text but if I try to fetch characterInfo of the 333rd one (tmp.textInfo.characterInfo[333]) it doesn’t work because the tmp.textInfo.characterInfo.Length is always 256.
tmp.textInfo.characterCount returns the right amount, but I can’t access all of them if the index is more than 256.
The text processing data structures such as TextInfo and sub structures like characterInfo, etc. are allocated in blocks in power of two. For examples, if the text only contained 23 characters, the characterInfo array length would be of size 36.
The textInfo count properties reflect the number of characters, words, spaces, lines, etc. These should be queried for iterating over any of these data structures.
In terms of why the characterInfo is of length 256 when your text contained 600 characters, this is likely because you are querying these data structures before the text has been updated / processed which happens just before the camera is rendered. For instance, if you were to change the text in Awake and query these data structures, they would reflect the result of the previous text. Not sure this is the case for you but it is certainly one of the possibility.
Are you changing the text in Awake or some update loop? Are you trying to access this information perhaps before that text has been rendered?
One way to get around this is as follows: For times where you need to access these data structure before the text is rendered, you can force a text update by using the TextComponent.ForceMeshUpdate() function. This will force an immediate update of the text where these data structures will be populated. There are several posts on the forum about ForceMeshUpdate().
Let me know if the above was the issue and if not, we’ll keep digging.
thank you very very much for the response.
I guessed that it creates arrays with the size of pow 2. I can see wordInfo.Length of 16, 32, 64… but It doesn’t work for characterInfo.Length it’s always 256.
I’ve tried tmp.ForceMeshUpdate() before getting data. but again. characterInfo.Length is 256 while the last word’s wordInfo.lastCharacterIndex is 383.
on click on textmeshpro.
text updates in every frame. but the content remains intact. so the text and the number of words and characters are equal to the previous frame’s.
yes the whole text displays and TMP_TextUtilities.FindIntersectingWord() and lastWordInfo.lastCharacterIndex return the right indexes.
Version 3.0.6
what I need: when player clicks on a sentence of the content which contains paragraphs. I want to get the bounding box of the clicked sentence.
so I need the TopLeft position of the first character, bottomRight of the last character, and the width of tmp itself.
I’ve managed to target the sentence. I know the index of the first word and the size of the sentence. hence I know the first and last character indexes of the sentence. but the problem is: when I want to get character info in order to get topLeft and bottomRight vectors it throws an error because the index is out of range. ( > 256)!
Yes even without changing the text the problem is still there.
the method runs after a click event. and at the beginning I’ve used tmp.ForceUpdateMesh();
I added another script attached to TMPro and tried to get data with calling a coroutine from start() and it gives the right data even if text changes in every frame.
but when I try to get it on click it won’t work.
it seems the problem is not the text change. it doesn’t work on the frame that player clicks on the text mesh pro.
Any chance you can provide me with a project / scene that would enable me to take a closer look?
You can provide me with the above by exporting a scene along with relevant script and provide this via PM or provide me with some private link in a PM or submit a bug report with the project and steps.