【Unity】UIやオブジェクトのドラッグ操作を検知する

UIなどがドラッグされたときに何か動きをつけたいけど、上手くいかないみたいなの…😥

EventSystemを使えば楽に実現できるわ。

UIや3Dオブジェクトなどのドラッグ操作をスクリプトから検知する方法の紹介です。

結論を言うと、EventSystemIDragHandlerインタフェースを実装したスクリプトを適切に用いれば実現可能です。ドラッグ開始・終了を検知するIBeginDragHandlerIEndDragHandlerなども存在します。

本記事では、次のようにドラッグ操作したらスクリプトがこれを検知してログ出力するところを目標とします。

動作環境
  • Unity2021.2.3f1
  • Unity UI 1.0.0

UIのドラッグ検知

検知したい対象となるUIオブジェクトにIDragHandlerインタフェースを実装したスクリプトをアタッチすれば良いです。

参考:Interface IDragHandler | Unity UI | 1.0.0

本記事では、以下のようにEventSystemとUIが配置されているものとして解説を進めます。

ドラッグを検知するスクリプト

ドラッグ中にログ出力するサンプルスクリプトです。

DragHandlerExample.cs
using UnityEngine;
using UnityEngine.EventSystems;

public class DragHandlerExample : MonoBehaviour, IDragHandler
{
    // ドラッグ中に実行されるメソッド
    public void OnDrag(PointerEventData eventData)
    {
        print($"OnDrag : {eventData}");
    }
}

上記スクリプトを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
using UnityEngine;
using UnityEngine.EventSystems;

public class DragBeginEndExample : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
    // ドラッグ中に実行されるメソッド
    public void OnDrag(PointerEventData eventData)
    {
    }

    // ドラッグ開始時に実行されるメソッド
    public void OnBeginDrag(PointerEventData eventData)
    {
        print($"OnBeginDrag : {eventData}");
    }

    // ドラッグ終了時に実行されるメソッド
    public void OnEndDrag(PointerEventData eventData)
    {
        print($"OnEndDrag : {eventData}");
    }
}

上記スクリプトをDragBeginEndExample.csとしてUnityプロジェクトに保存し、検知したいオブジェクトにアタッチすればOKです。

実行結果

さいごに

UIや3Dオブジェクトのドラッグ操作は、IDragHandlerインタフェース経由でスクリプトから検知することができます。

ドラッグ開始終了もIBeginDragHandlerやIEndDragHandlerインタフェースを実装することで検知できますが、IDragHandlerインタフェースを実装する必要があります。

3Dオブジェクトの場合はカメラにPhysicsRaycasterがアタッチされ、適切なレイヤマスク設定が行われていないと検知できませんのでご注意ください。

関連記事

【Unity】オブジェクトのクリックを検知する
オブジェクトがクリックされたことを検知する方法の紹介です。 やり方は一通りではありませんが、本記事ではEventSystemを用いた方法を紹介します。 実装の流れは以下のようになります。 以上の流れでクリック検知を実現す ...

参考サイト