InputFieldを押した時の入力受付状態になるタイミングをコードレスで変更する
概要
※新Input Systemの話ではありません。
今回はUnityのInputFieldにて、入力欄を押してから入力状態にするタイミングをプログラミング無しで変更する方法を解説します。
InputFieldの挙動について
まず、InputFieldの入力受付状態は「押した」瞬間になります。(コード的に言うと OnPointerDown()時)
普通は気になりませんが、これをリスト内の各セルに埋め込むとなるとスマホの場合困ったことになります。
具体例としてセーブスロットを挙げてみます。
この画面上でセーブスロット名を押すと名前を直接変えられるようにします。
……すると、スクロールした時にセーブ名の部分を押してしまうと入力受付状態となりスクロールできない問題が発生します。
スマホだと仮想キーボードが出現してしまうのでユーザー体験として非常に良くありません。
今回はコードをいじらずに「指を押して離した」瞬間になるように挙動を変更させる方法を紹介します。
解決方法
対処法は非常にシンプルで、InputFieldの上に透明なButtonコンポーネントを被せて間接的にキーボードの起動処理を発火させるという方法です。(下図参照)
その後、Buttonコンポーネントの Inspector -> OnClick() の指定欄で対象をInpurFieldにセットし、実行メソッドを Select() に指定する。(下図参照)
これで「指を押して、放した後」にキーボードを出すことができます。
注意点として、ButtonをInputFieldの子にしてしまうとスクロールができない現象が発生します。(下図GIFみたいな挙動)
InpurField上をタッチしても、ちゃんとスクロールさせたいならButtonをInpurFieldの親子関係にはしないように気をつけましょう。
おまけ
別の方法として、セーブするスロットを確定したあとに名前を変える方法にすればこの問題自体を回避できます。(個人的にはこれが一般的な方法だと思う)