UIなどがドラッグされたときに何か動きをつけたいけど、上手くいかないみたいなの…
EventSystemを使えば楽に実現できるわ。
UIや3Dオブジェクトなどのドラッグ操作をスクリプトから検知する方法の紹介です。
結論を言うと、EventSystemとIDragHandlerインタフェースを実装したスクリプトを適切に用いれば実現可能です。ドラッグ開始・終了を検知するIBeginDragHandlerやIEndDragHandlerなども存在します。
本記事では、次のようにドラッグ操作したらスクリプトがこれを検知してログ出力するところを目標とします。
- Unity2021.2.3f1
- Unity UI 1.0.0
目次 非表示
UIのドラッグ検知
検知したい対象となるUIオブジェクトにIDragHandlerインタフェースを実装したスクリプトをアタッチすれば良いです。
参考:Interface IDragHandler | Unity UI | 1.0.0
本記事では、以下のようにEventSystemとUIが配置されているものとして解説を進めます。
ドラッグを検知するスクリプト
ドラッグ中にログ出力するサンプルスクリプトです。
上記スクリプトをDragHandlerExample.csとしてUnityプロジェクトに保存し、ドラッグ検知したい対象のUIオブジェクトにアタッチします。
実行結果
3Dオブジェクトのドラッグ検知
3Dオブジェクトに対してイベント通知するためには、EventSystemが配置されるのに加えて、メインカメラにPhysicsRaycasterがアタッチされている必要があります。
また、ドラッグ検知されるオブジェクトにはコライダーがアタッチされている必要があります。
そして、このオブジェクトに先述のドラッグ検知スクリプトをアタッチすれば、ドラッグ検知可能になります。
実行結果
ドラッグ開始と終了を検知する
ドラッグ開始はIBeginDragHandlerインタフェース、ドラッグ終了はIEndDragHandlerインタフェースを実装することで検知できるようになります。
注意点として、これらの検知を有効にするためには、IDragHandlerインタフェースも実装する必要があります。IBeginDragHandlerやIEndDragHandlerのみ実装しただけではドラッグ開始終了の検知ができません。
参考:Interface IBeginDragHandler | Unity UI | 1.0.0
参考:Interface IEndDragHandler | Unity UI | 1.0.0
サンプルスクリプト
ドラッグ開始と終了を検知したときにログ出力するサンプルスクリプトです。
上記スクリプトをDragBeginEndExample.csとしてUnityプロジェクトに保存し、検知したいオブジェクトにアタッチすればOKです。
実行結果
さいごに
UIや3Dオブジェクトのドラッグ操作は、IDragHandlerインタフェース経由でスクリプトから検知することができます。
ドラッグ開始終了もIBeginDragHandlerやIEndDragHandlerインタフェースを実装することで検知できますが、IDragHandlerインタフェースを実装する必要があります。
3Dオブジェクトの場合はカメラにPhysicsRaycasterがアタッチされ、適切なレイヤマスク設定が行われていないと検知できませんのでご注意ください。