(検証環境: Unity 2019.1.0f2/Android 9)
tl;dr
概要
Input.multiTouchEnabled
を false
にすれば Unity 全体で無効にできるのですが uGUI でだけその機能を使いたくないときに非常に不便なので uGUI でのみ無効にする方法を考えてみました。
やりかた
- 複数のタッチ入力を無効にしたいコンポーネントを派生したクラスを作る。例えば
public class MyButton : UnitySystem.UI.Button
のようにする。 - 1 で作ったクラスから
UnityEngine.EventSystems.PointerEventData
を受け取るメソッドをoverride
してeventData.pointerId
が 0 以外であればその場で return させる。 0 であれば親の処理を呼び出す。例えばbase.OnPointerDown(eventData);
のように。 - Button の代わりに 2 で作ったスクリプトを使う。すでに Button を貼り付けている場合は インスペクタを Normal から Debug に切り替えることにより Script を直接差し替えることができるので、それで変更すると、すでに設定してあるプロパティを消すことなく移行できる。
実装例
他に考えたこと
おそらく EventSystem そのものに手を加えていけば uGUI のコンポーネントを改造することなくシングルタッチ環境を構成できると思うのですが、そこまで書き換えることが現実的でないと思ったので、コンポーネントに手を加える戦略を採用しました。