技術と趣味の亜空間

主にゲームプログラミングとその周辺に関する記事を不定期で上げていきます

InputFieldを押した時の入力受付状態になるタイミングをコードレスで変更する

Unity Logo

概要

新Input Systemの話ではありません。
今回はUnityのInputFieldにて、入力欄を押してから入力状態にするタイミングをプログラミング無しで変更する方法を解説します。

InputFieldの挙動について

まず、InputFieldの入力受付状態は「押した」瞬間になります。(コード的に言うと OnPointerDown()時)
普通は気になりませんが、これをリスト内の各セルに埋め込むとなるとスマホの場合困ったことになります。
具体例としてセーブスロットを挙げてみます。

セーブスロット例
写真はRPGツクールweb - オートセーブ機能ページより引用
この画面上でセーブスロット名を押すと名前を直接変えられるようにします。
……すると、スクロールした時にセーブ名の部分を押してしまうと入力受付状態となりスクロールできない問題が発生します
スマホだと仮想キーボードが出現してしまうのでユーザー体験として非常に良くありません。
今回はコードをいじらずに「指を押して離した」瞬間になるように挙動を変更させる方法を紹介します。

解決方法

対処法は非常にシンプルで、InputFieldの上に透明なButtonコンポーネントを被せて間接的にキーボードの起動処理を発火させるという方法です。(下図参照)
f:id:Goropocha:20211213163047p:plain
その後、Buttonコンポーネントの Inspector -> OnClick() の指定欄で対象をInpurFieldにセットし、実行メソッドを Select() に指定する。(下図参照)
f:id:Goropocha:20211213163238p:plain
これで「指を押して、放した後」にキーボードを出すことができます。

注意点として、ButtonをInputFieldの子にしてしまうとスクロールができない現象が発生します。(下図GIFみたいな挙動)
f:id:Goropocha:20211213162645g:plain
InpurField上をタッチしても、ちゃんとスクロールさせたいならButtonをInpurFieldの親子関係にはしないように気をつけましょう。

おまけ

別の方法として、セーブするスロットを確定したあとに名前を変える方法にすればこの問題自体を回避できます。(個人的にはこれが一般的な方法だと思う)