UnityにおけるタッチあるいはクリックのDragイベントは、EventTriggerを使う方法とIDragHandlerを継承する方法がありますが、そのイベントをそれを無効にする方法を検索してもスッと情報が出てこなかったので記事にしました。
開発環境
- Unity 2019.4.9f1 (2Dプロジェクト)
- VisualStudio 2019 16.7.3
やりたかったこと
Dragイベントの有効か無効かをScirpt中に判定してその後の処理を制御したい。
本当はuGUIのButtonを押した(PointerDown)時に別のオブジェクトを生成して、それのオブジェクトにドラッグイベントを発行して入力をすり替え、生成したオブジェクトをそのままドラッグできるのが理想でした。
が、調べたところその流れをそのままプログラムに反映するのは流石に無茶なので代替案として、Buttonの代わりにImageの上に不可視かつアクティブなオブジェクトを重ねて置いておき、不可視のオブジェクトをクリック・タッチした(PointerDown)時に見えるようにしてドラッグの有効無効を判定して、OnIntializePotentialDragで判定を基に有効無効処理を書く、というのが現実的かと思います。というか開発時にそうしました。他にもアプローチはあると思います。
試したこと……ほとんど忘れた。
OnInitializePotentialDragはPointerDownとほぼ同じタイミングで呼ばれます。ちょっとこの記事完成させるのに3か月スパンが空いてかなり忘れているのもあってどちらが先に呼ばれるか、先に呼ばれることを保証されるかは忘れました。
OnInitializePotentialDragの引数のPointerEventDataに対してnullを渡してみたりDebug.Log()中身を覗いてみたり、そこで上書きしたGameObjectとOnDragの引数を比較してみたりと色々試行錯誤した記憶はあるのですがやはり詳細は忘れました。3か月も経つとね……気が向いたら調べ直します。
結論
というわけで色々すっ飛ばして結論に入ります。
Dragイベントをスクリプトで無効にしたい場合は引数として渡されるPointerEventDataのpointerDragプロパティ(ドラッグするGameObjectが入っている)にnullを渡すとそれ以降OnDragが呼ばれなくなります。
pointerDragは{ get; set; }と定義されているプロパティなので、nullで上書きすることによるこの動作は想定されている……と思いたい。
……と、ここまで書いて思ったんですが、不可視なオブジェクトを用意しなくとも、オブジェクトプール的なものから直接pointerDragに渡せば出来るのでは? と考えたのですが、あれ? その操作も一度試して無効なんだったっけか……? うーん、調べたいけど、今Blazorやってるし……。あとで気が向いたら調べ直します。
こんなうろ覚えで大丈夫かよ……。いやこの操作で確かに出来てたんですよ。ドラッグ操作の有効無効はね。