【Unity iPhone実機】ButtonのClickイベント挙動がおかしい現象に対する対策

検証条件と現象

検証条件
  • Unity 2019.4.28f1
  • iPhone X iOS 14.6
  • Unity Editorでは動作確認完了、実機デバックにて現象確認
現象概要

Unity Editorでは正常に動作するのに、iPhone実機ではButtonのClickイベントが反応しない。なお、Buttonを押したことによるOnClick()イベントでない反応はする。※1

※1 アセット”Doozy UI”のUI Button設定内でボタンアニメーションを付けた場合、Buttonを押すとアニメーション動作は正常に行われる

結論

UnityかXCodeどちらかのバグかも。

具体的現象と対処

こんにちは。今回は実機でのButtonのClickイベント挙動がおかしい問題に対する内容です。

色々検索キーワードを変えたりして探してみたのですが、意外とEditorでOKなのに実機でNGというケースは少ないのか、はたまたButtonの不動作は基本的項目の抜けが原因であることが多く、検索では初心者向け記事がヒットしやすい(=応用記事はヒットしにくい)という事情があるからなのか、よい対処を見つけるまで時間が掛かってしまいました。

その中で結論に近い回答が書かれていたサイトが以下。

ぱふの自由帳

はじめに Unityのデフォルト機能であるScrollViewを使っているときに下のような問題にぶち当たりました。 Bu…

「結論に近い」と書いた理由は単純で、そのままの対応でうまくいかなかったから。

今回実機デバック時動作しなかったボタンは2か所で、

  1. 自作ポップアップ中に設けたボタン
  2. アセットEnhancedScrollerでScroller中に動的生成したボタン

一つ目はEnhancedScroller内のスクロール位置を制御するボタン、二つ目はスクローラー内部で動的に生成しネストしてポップアップ表示を目論んだボタンです。

とりあえずDebug.Log()を使用しどこが動作していないか調べていくと、どうやらそもそもOnClick()が呼ばれていないご様子。Editorでは特に問題ないしシーンに配置しているほかのButtonは実機でも特に問題なく動く。うむむ・・・

何故OnClick()が実機だと反応しないのか。スクローラー内に限ると以下のようでした。

Qiita

#ことの発端Unityで作ったアプリをAndroidの実機で動かしてみたら、著しく反応が悪いボタンがあった。具体的にはボ…

要はボタンを押してるだけのつもりがスワイプと勘違いされてタッチ直後にクリック動作無効に判定されてしまうんですね。というわけで記事に書いてあるように対処・・・っと。

動かない

…というところまでは早かったのですが。

さて、解決策です。何故か以下コードをオブジェクトにアタッチしたら動いてしまいました。


public class OriginalListener : MonoBehaviour,<br />
    IPointerClickHandler, IPointerDownHandler<br />
{<br />
    public void OnPointerClick(PointerEventData eventData)<br />
    {<br />
        Debug.Log("クリックされたよ");<br />
        // ここにクリック後の処理を書く<br />
    }<br />

    public void OnPointerDown(PointerEventData eventData)<br />
    {<br />
        // 処理必要なし(ただし関数の記載は必要)<br />
    }<br />
}<br />

ポイントはOnPointerClick()だけでなく、OnPointerDownも実装すること。OnPointerClick()内にメインのクリック処理を書いてOKで、ワンクッションOnPointerDownを経由することで正常に動く。

…なんでだろう。ほんと不明です。時間があったら(ないと思うけど)そのうち明らかになるといいですね。

 

なお、調べていて他に試したことは以下。

  • Event Systemのスワイプ感度の変更 5⇒30
  • Unity 2019.4のバージョンアップ(当初は2019.4.22f1で開発していた)

効果はありませんでしたので念のため。

以上