JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

【TextMeshPro】入力文字列をTMP_InputField経由でなくTextMeshProUGUIを直接参照して取得してしまったばかりにゼロ幅スペースで苦しんだ記録

些細な話ですけど、ハマる人いると思うんで、備忘録として置いておきます

結論

TextMeshPro用のInputFieldであるTMP_InputFieldを使うときは、子GameObjectのTextMeshProUGUIを参照して入力された文字を取得してきてはいけない!ゼロ幅スペースが入ったりする。

正しくは、TMP_InputFieldのtextプロパティからとってくる。これだとゼロ幅スペースは入っていない。


以下、詳しい話

いきさつ

ZZ3Dというアプリ( https://apps.apple.com/jp/app/zz3d/id1475406292)にVRoidHub連携機能を導入しようとSDKを組み込んでいました。

連携には、認可コードをアプリ側から入力するフローがあるんですが、正しいはずの値を入力してもリジェクトされてしまう状況でした。

ひとしきり問題がありそうなところはデバッグしましたが、問題が見当たらず困っていました。

そこで、SDKとセットでついてきたExampleシーンを動かしたところ、こちらではうまく動いてしまいました。 つまり、向こうの認可サーバの問題やSDKのバグではないということがわかります。

となると、やっぱりこちらのソースコードが間違っているのかな・・?と思うわけなんですが、SDKの利用部分ではサンプル実装と全然違いがないんですね。困りました( ;∀;)

と、いうことがありまして、最後に、「ログに流れる文字列を見る限りでは認可コードは正しいように見えるけど、バイナリレベルで違っているんじゃないか?」ということを疑いました。

(結果、それが正解だったみたいです)

実際に確認

InputFieldに入力した文字列を取得してきたものと、正しい認可コードの文字列をバイナリエディタで比較してきました。

(InputField経由)
f:id:sakata_harumi:20201205233251p:plain (ただしいもの)
f:id:sakata_harumi:20201205233249p:plain

はい。「E2 80 8B」これが余計にくっついています( ;∀;) (0D 0Aは改行コードですが、これは2つの文字列を上下に並べたため挿入されたものですので関係ありません)

このE2 80 8B、どうやら「ゼロ幅スペース」というやつらしいです。

ja.wikipedia.org

くううううううううう!どこから生えてきたんだ!( ;∀;)

起きてしまった理由

結論にも書いたのですが「TMP_InputField経由でなくTextMeshProUGUIを直接参照して入力文字列を取得」したせいでした。

TMP_InputFieldのPrefabは以下ような構成になっています。

f:id:sakata_harumi:20201205235618p:plain

ここの「TextArea/Text」に入力された文字が入っている・・ように見えたので、ここから文字列を参照していました。

しかし、実際はそうではなく、ここには視覚化のためのテキストが入ってる、、とのことで実際に入力されたものとは差があるらしいです。

例えば、パスワード形式のInputFieldにした場合、ここには「***」という文字列が入ってくるらしいです。

forum.unity.com

そこで、入力された値を正しく取得するためにはTMP_InputFieldのtextプロパティから取得しないといけない、ということでした。

みなさんも気を付けてください( ;∀;)