UnityでWindowsデスクトップアプリの仮想キーボードを呼び出すdll
UnityでWindowsデスクトップアプリを作る際に、タブレットなどで必要になる仮想キーボードが表示されない問題がありました。そこでUnity上から仮想キーボードを呼び出すdllを作成しました。
ダウンロード
http://unubore.egoism.jp/techblog/distribution/WindowsTouchScreenKeyboard/UnityKeyboard.dll
使い方
Assets/Pluginsフォルダ以下にダウンロードしたdllをインポートします。
ちなみに複数のプラットフォームに対応する場合は、インスペクターかサブディレクトを用いて適用先を設定することも可能です。 docs.unity3d.com
あとはusingしてメソッドを呼び出せばokです。以下のスクリプトを参考にしてください。
このスクリプトをシーン上の適当なオブジェクトにアタッチすれば自動的にハンドリングされると思いますが、動作確認はしていません。 gist.github.com
作成までの話
背景
現在のWindows向けのアプリではUWP(Universal Windows Platform)の使用が推奨されており、これによってWSA(Windows Store App, スタート画面でタイル表示され、全画面で起動するようなアプリ)を作成することができます。
Windowsでは互換性のためUWP以前のアプリケーション(デスクトップアプリ)も動作するのですが、Windowsタブレットなど物理キーボードがない端末の場合には仮想キーボード(タッチキーボード)を表示する必要があります。これはUnityでいうWindows向けのStandaloneアプリに該当します。
ここで問題があり、デスクトップアプリの場合は仮想キーボードが想定されていないため、呼び出すためのAPIなどが用意されていません。WFPやWindowsフォームの場合は自動的にハンドリングしてくれる場合もあるのですが、UnityのInputFieldのような環境では手動で呼び出す必要がありました。
言葉の定義などはちょまどさんの記事が参考になるかと思います。 blogs.msdn.microsoft.com
ちなみにWSAに関してはUnityからの操作がサポートされています。 docs.unity3d.com
実装
以下のコードをVisualStudio上でdllとしてビルドしてやれば、記事の先頭にあるdllと同じものができるはずです。
こちらのページを参考にしています。 www.projectgroup.info
また、このメソッドをdll化してUnity上で使用できるようにする方法は、こちらのページを参考にしました。 qiita.com
余談
ちなみに以下のページを参考にしてプロセスをKill()する方法も検討しましたが、Unityでは使用できませんでした。
というのも、MonoではProcessを取得できない場合があり、キーボードに関連しているプロセスを特定することが困難でした。そのため今回はWin32APIのメソッドを使用しています。