teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3603閲覧

TextMeshProのテキストについて

usamino

総合スコア59

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/01/27 13:44

編集2020/01/27 13:45

0

0

Unity初心者です

下記のスクリプトについて何か大きな勘違いをしていると思うのですが何かアドバイスを頂けませんでしょうか?
私の予測では比較は「true」となるのですが実際は「false」を示します。
宜しくお願い致します。

今回は普通のTEXTとinputField(TMP)を使用して比較しております。

using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI; public class Tes_SC : MonoBehaviour { public Text text;              //abc@comと入力 string テキストstr; public TextMeshProUGUI textMesh;       //abc@comと入力 string メッシュstr; public Text ta; //表示用 public Text tb; //表示用 void Start() { //textのUIよりstring取得 テキストstr = text.text; Debug.Log("テキストstr [" + テキストstr + "]");       //abc@com //TextMeshProのinputfield内のTEXTよりstring取得 メッシュstr = textMesh.text; Debug.Log(" テキストst [" + メッシュstr + "]"); //abc@com //両方を比較 Debug.Log(テキストstr == メッシュstr);        //false ta.text = テキストstr;  //表示用 tb.text = メッシュstr; //表示用 } }

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Startで下記のようにしてみると、どのように表示されるでしょうか?

C#

1 void Start() 2 { 3 //textのUIよりstring取得 4 テキストstr = text.text; 5 Debug.Log("テキストstr [" + テキストstr + "]"); //abc@com 6 Debug.Log("Characters:"); 7 foreach (var c in テキストstr) 8 { 9 Debug.Log($"\t{c}[{(int)c:X}]"); 10 } 11 12 //TextMeshProのinputfield内のTEXTよりstring取得 13 メッシュstr = textMesh.text; 14 Debug.Log("メッシュstr [" + メッシュstr + "]"); //abc@com 15 Debug.Log("Characters:"); 16 foreach (var c in メッシュstr) 17 { 18 Debug.Log($"\t{c}[{(int)c:X}]"); 19 } 20 21 //両方を比較 22 Debug.Log(テキストstr == メッシュstr); //false 23 24 ta.text = テキストstr; //表示用 25 tb.text = メッシュstr; //表示用 26 }

私の試したところですと下図のようになりました。一見同じ文字列に見えても、textMesh.textの方には末尾に見えない文字が仕込まれているようでした。

図

TMP_InputFieldのコードには下記のような部分があり、どうやら表示用テキストの末尾にゼロ幅スペースを追加しているようです。コメントによると入力カーソルが正しく追従するように...とのことだそうですね。
以前見かけましたご質問に「UNITY 右寄せのText(TMP)に書いた、行の末尾のスペースが反映されない。」というものがありました。詳細は未調査ですが、もしかしたらこの辺とも関係のある現象なのかもしれません。

C#

1 /// <summary> 2 /// Update the visual text Text. 3 /// </summary> 4 5 protected void UpdateLabel() 6 { 7 if (m_TextComponent != null && m_TextComponent.font != null && m_PreventCallback == false) 8 { 9 // Prevent callback from the text component as we assign new text. This is to prevent a recursive call. 10 m_PreventCallback = true; 11 12 string fullText; 13 if (compositionString.Length > 0) 14 { 15 fullText = text.Substring(0, m_StringPosition) + compositionString + text.Substring(m_StringPosition); 16 17 // Should adjust caret position 18 //Debug.Log("Handling IME Input... [" + compositionString + "] of length [" + compositionString.Length + "] at StringPosition [" + m_StringPosition + "]"); 19 //for (int i = 0; i < compositionString.Length; i++) 20 // Debug.Log((uint)compositionString[i]); 21 } 22 else 23 { 24 fullText = text; 25 //Debug.Log("Handling Input... [" + text + "]"); 26 } 27 28 string processed; 29 if (inputType == InputType.Password) 30 processed = new string(asteriskChar, fullText.Length); 31 else 32 processed = fullText; 33 34 bool isEmpty = string.IsNullOrEmpty(fullText); 35 36 if (m_Placeholder != null) 37 m_Placeholder.enabled = isEmpty; 38 39 if (!isEmpty) 40 { 41 SetCaretVisible(); 42 } 43 44 m_TextComponent.text = processed + "\u200B"; // Extra space is added for Caret tracking. 45 46 // Special handling to limit the number of lines of text in the Input Field. 47 if (m_LineLimit > 0) 48 { 49 m_TextComponent.ForceMeshUpdate(); 50 51 // Check if text exceeds maximum number of lines. 52 if (m_TextComponent.textInfo.lineCount > m_LineLimit) 53 { 54 int lastValidCharacterIndex = m_TextComponent.textInfo.lineInfo[m_LineLimit - 1].lastCharacterIndex; 55 int characterStringIndex = m_TextComponent.textInfo.characterInfo[lastValidCharacterIndex].index + m_TextComponent.textInfo.characterInfo[lastValidCharacterIndex].stringLength; 56 text = processed.Remove(characterStringIndex, processed.Length - characterStringIndex); 57 m_TextComponent.text = text + "\u200B"; 58 } 59 } 60 61 if (m_IsTextComponentUpdateRequired) 62 { 63 m_IsTextComponentUpdateRequired = false; 64 m_TextComponent.ForceMeshUpdate(); 65 } 66 67 MarkGeometryAsDirty(); 68 69 // Scrollbar should be updated. 70 m_IsScrollbarUpdateRequired = true; 71 72 m_PreventCallback = false; 73 } 74 }

対処方法としてはpublic TextMeshProUGUI textMesh;public TMP_InputField textMesh;に変えて、インスペクター上でもインプットフィールド内の表示用テキストオブジェクトではなく、インプットフィールド自体をセットしてやるとどうでしょう。
これなら表示用に加工された文字列ではなく、インプットフィールドが持つ本来の文字列が得られるんじゃないかと思います。

投稿2020/01/27 22:15

Bongo

総合スコア10816

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usamino

2020/01/28 00:54

見事に解決いたしました。 stringに対する認識と検証方法などたくさんの事を学ぶ事が出来ました。 本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問