UnityでUIアプリ:日本語入力の問題点

Unity で UI アプリを構築することのメリットを以前記載しました。その中で日本語入力に問題があると書きましたが、具体的にどう問題かをまとめたいと思います。ゲームだけでなくその他のアプリもUnityで開発すると各プラットフォーム対応が簡単にできるのでよいのですが、日本語での文章入力が必要なアプリの場合はまずよく考えた方がよいでしょう。その一助になればと思います。

まず前提としてUnityではUI開発において3つ方法があることを別エントリに記載しましたが、今回は Unity UI (uGui)で開発した場合を前提としています。また日本語入力は Input Field で行う場合を前提にしています。つまりこれらの問題点は Input Field の問題点でもあります。
動作させるプラットフォーム毎に問題点が異なるのでプラットフォーム別に記載します。

① Windowsの場合
 ゲームアプリではWindowsは動作対象外にすることが多いと思いますが、UIアプリ(特に業務アプリ)だと Windows対応も必要なことが多いのではと思います(そもそもそれがUnityのメリットです)。
 Windowsだと、入力済みの文章に対し文字を挿入するとおかしな動きになります。
 たとえば「本日は晴天なり。」と記載された文章の先頭にカーソルを持っていき、さらに「本日は晴天なり。」と入力すると下記のように表示されます。

 ほとんど致命的な感じで、なぜこうなるのか理解不能です。私の使っているUnityバージョンだけの問題かと思いましたがそうでもないようです。(2019.1.0f2 でも 2021.1.22f1 でも発生するようです。)

② Webの場合 (WebGLの場合)
1. そもそも標準では日本語が表示できません。これは日本語を含むフォントを使うことで対応できます。例えば私は Google が提供されている Noto Font を使っています。
2. 標準では日本語入力ができません。これはブラウザ上のWebGLアプリ内でIMEが起動できないためだそうです。これに対しては Unityさんが回避方法を提供されていますが、もっと使いやすいのが WebGLInput という杏仁 (kou_yeung)さん作成のプラグインです。これを使うとほぼ問題ないのですが、そもそも別プラグインが必要というのがおかしな話と思います。(WebGLInputは現状フルスクリーンモードにすると動作しないようです。)

③ Android や iOSの場合
この場合はほぼ問題ありません。ただInput Fieldに “Hide Mobile Input” というプロパティがあり、デフォルトはOffです。
1. デフォルトの場合(Hide Mobile Input が Off の場合)、日本語入力時に現れる仮想キーボード(ソフトウェアキーボード、フリック操作で文字入力するエリア)の上側にさらに入力フィールド(Mobile Inputフィールドと呼ぶことにします)が表示されここへ文字列を入力し”OK” を押すと実際のフィールドへ反映されます。ちょっとみっともないのですが実はこれは割と便利です。
 当然ですがスマホでは文字入力時に仮想キーボードが画面に表示されるので、入力エリアが仮想キーボードで隠れないように入力フィールドの位置を必要に応じて動かす必要があります。そうしないと入力している文字が見えなくなってしまい何を入力しているかわからなくなるためです。ところがこのMobile Inputフィールドがあると入力文字列が常に見えるため入力フィールドの移動は必須ではなくなります。
このためMobile Inputフィールドは便利なのですが、複数行の入力欄だと入力行数分 Mobile Inputフィールドが縦に広がってしまい、いずれにしてもみっともない感じがします。あと入力完了時に Mobile Inputフィールドの”OK”を押す必要があるため操作手順が増えてしまいます。
2. Hide Mobile Input を On にする場合、前述の通り入力フィールドの位置を仮想キーボードに重ならないよう移動する必要があります。これはスマホアプリを開発する場合は避けられない問題なのでやむなしでしょう。
(ちなみに入力フィールドを移動するには仮想キーボードの大きさを取得する必要があります。 TouchScreenKeyboard.area という Static な値が用意されていますが Android では正しい値が返りませんので別途対応が必要です。対応方法はググってください。)

④ プラットフォームにかかわらず
1. 禁則処理が日本語対応していません。
例えば改行後の行頭に “。” が表示されたりします。
これ自体はやむなし・こういうものです、と言い切ることもできるかと思います。
しかし問題なのは英語の禁則処理が対応されていることです。英語は単語の途中では改行しないのが通常のようで適当にブランク(半角スペース)で改行されます。日本語の場合も半角スペースで改行されます。
日本語の文章は半角スペースを入れることはほとんどないので問題ないように思えます。しかしこの文章にも頻繁にあるように英単語が現れるとどうしても半角スペースを使ってしまいます。その場合そこで改行されてしまいます。
業務アプリの場合、正直みっともないので何らかの対応が必要でしょう。自前で禁則処理を実装されている方もいるようなので検索してみてください。
2. 最大文字数は 16000字くらい
Input Fieldに限りませんがTextコンポーネントに表示可能な文字数は最大で 16,250字 とのこと。もちろん入力可能文字数もそれと同じになります。
最初はまさかと思いましたがUnityでは常識らしいです。とはいえこれが問題になるケースは少ないかもですが。


以上、現状私が考えるUnityでの日本語入力の問題まとめでした。

(補足)
最初に記載の通りここでは、
・ Unity UI (uGui)について
・ Input Field について
のみの話です。
UI Toolkit (UIElements)では試してないのでよくわかりません。少し見たところではUI Toolkit も日本語入力という点ではまだまだという気がしました。
Input Field TMP (Text Mesh Pro版の Input Field)も試してません。Text Mesh Proはそもそも標準では日本語対応さえ出来てないということなので試すのに時間が必要そうです。時間があれば試してみたいと思います。