概要
Unity 2Dで、タッチパネルを使ったマルチディスプレイ対応アプリを作ることになったのですが、
実機で動かした際にハマってしまったので、記録しておきます。
環境
- Windows 10
- Unity 2019.2.19f1
- Visual Studio 2019
発生した現象(1) どちらの画面をタッチしても同じ座標になってしまう
課題
今回はディスプレイを左右に2台並べて、左をメインディスプレイにしていたのですが、
右の画面をタッチしても左の画面と同じ座標になってしまいました。
(マウスクリックの場合は正常な座標が取得できました。)
解決策:WindowsでタブレットPCの設定を行う
コントロールパネル > タブレットPCの設定にて、「セットアップ」を行うことにより解決しました。
発生した現象(2) 2画面の同時タッチができない / サブ画面の同時タッチができない
課題
メイン画面タッチ操作中にサブ画面をタッチしても反応がありませんでした。
また、サブ画面タッチ操作中にメイン画面をタッチするとサブ画面のタッチがキャンセルされているようでした。
さらに、サブ画面で複数の指の同時タッチができませんでした。(メイン画面で複数の指の同時タッチはOK)
原因
サブ画面はそもそもタッチイベントが取得できていませんでした。
タッチ非対応PCでの動作確認用にマウスイベントも拾うようにしていたのですが、
サブ画面にタッチするとタッチイベントは発生せず、マウスイベントが発生していました。
※ ちなみにタッチイベントが発生した際はマウスイベントも発生します。
解決策:Windows API(Win32 API)の利用
Unity側でなんとかしようとするも全く解決策が見当たらず、結局 Win32 APIを使って
Windowsメッセージからタッチイベントを取得するようにしました。
処理の流れとしては、ざっくりですが以下のようになります。
- FindWindowで、対象のウインドウを取得
- RegisterTouchWindowで、取得したウインドウをタッチイベント取得対象として登録
- SetWindowLongPtrで、ウインドウプロシージャを書き換え
- 3で設定したプロシージャ内で、Windowsメッセージからタッチイベントを取得して処理する
このあたりの処理については、また別途記事を書きたいと思います。。。(気が向いたら)
まとめ
Windowsアプリは、Win32 APIを利用するといろいろできる。(語彙力)
Windowsアプリ初めてだったので、勉強になりました。
割と実装が進んだ段階で初めて実機で動かしてみてこのような状況になったので、
めちゃくちゃ焦りました。
ニッチな情報だと思いますがどなたかの参考になれば幸いです。