【Unity】OnMouseDragとIDragHandlerの違い

Unityでドラッグ処理を実装していた時に2つの実装方法があることに気づき、

この2つに違いがあるのか気になって調べたのでこの記事で紹介していきます。

これらにはどのような違いがあるのでしょうか。

目次

3D、2D両方使えるのはOnMouseDrag、2D専用はIDragHandler

ドラッグ処理という点では両者同じですが、

3D、2D両方使えるのはOnMouseDrag

2D専用IDragHandler

となります。

それぞれの特徴と実装方法について説明していきたいと思います。

OnMouseDrag

基本構文

using UnityEngine;

public class DragTest1 : MonoBehaviour
{
    private void OnMouseDrag()
    {
        // ここからドラッグ処理を書く

    }
}

MonoBehaviourを継承しないと使えない

Unityでスクリプトを作成した時にデフォルトで継承されているアレですね。

こちらが継承されていないと使用できません。

関数の中に処理を書くだけでドラッグ処理を実装できる

OnMouseDragは関数なので、関数の中に処理を書くだけでドラッグ処理を実装できます。

操作したいオブジェクトにコライダーをアタッチしないと反応しない

3Dだったら〇〇Collider, 2Dだったら〇〇Collider2Dを付けないと反応しません。

【OnMouseDragを使った例】

CudeにDragTest1をアタッチしている状態です。

DragTest1.cs

using UnityEngine;

public class DragTest1 : MonoBehaviour
{
    private Vector3 offset;
    private float zCoord;

    void OnMouseDown()
    {
        // オブジェクトとマウスの位置差分を記録する
        zCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
        offset = gameObject.transform.position - GetMouseWorldPos();
    }

    void OnMouseDrag()
    {
        // マウスの位置にオブジェクトを移動させる
        transform.position = GetMouseWorldPos() + offset;
    }

    private Vector3 GetMouseWorldPos()
    {
        // マウスのスクリーン座標をワールド座標に変換
        Vector3 mousePoint = Input.mousePosition;
        mousePoint.z = zCoord;

        return Camera.main.ScreenToWorldPoint(mousePoint);
    }
}

void OnMouseDrag()の中に処理を書いて無事ドラッグ操作を実装できました。

IDragHandler

基本構文

using UnityEngine;
using UnityEngine.EventSystems;

public class DragTest2 : MonoBehaviour, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        // ここからドラッグ処理を書く

    }
}

using UnityEngine.EventSystemsを書かないと使えない

IDragHandlerはEventSystemなので、usingを書かないとエラーが出ます。

IDragHandlerを継承しないと使えない

IDragHandlerを継承しないと使えません。

IDragHandlerはインターフェースなので、OnDrag()を書かないとエラーが発生する

インターフェースを継承すると、インターフェースの中に書かれている関数を書かないと

エラーが発生します。

CanvasのGraphic RaycasterコンポーネントとEventSystemがないと使えない

【Graphic Raycaster

Canvasを作成した時にデフォルトでついているコンポーネントです。

【EventSystem】

UI要素やCanvasを作ったら自動的に生成されるオブジェクトです。

Graphic RaycasterとEventSystemが必要なため、

IDragHandlerは2D用と考えることができます。

【IDragHandlerを使った例

ImageオブジェクトにDragTest2をアタッチしている状態です。

DragTest2.cs

using UnityEngine;
using UnityEngine.EventSystems;

public class DragTest2 : MonoBehaviour, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        transform.position = eventData.position;
    }
}

IDragHandlerを使って無事ドラッグすることできました。

まとめ

特徴を簡易的にまとめると、以下のようになります。

OnMouseDragIDragHandler
3D or 2D3D、2D両方◎2D専用
継承するものMonoBehaviourMonoBehaviour, IDragHandler
必要なコンポーネントColliderGraphic RaycasterとEventSystem

<参考>

■サポートされているUnityイベント

■What’s the difference between MonoBehavior OnMouseDrag and IDragHandler OnDrag

https://discussions.unity.com/t/whats-the-difference-between-monobehavior-onmousedrag-and-idraghandler-ondrag/192222

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

電気制御設計→ITエンジニア
前職は電気系のエンジニアで物流倉庫などの設備を動かしていました。
現在はITエンジニアとして開発に従事。
業務では主にUnity、C#、.NETを利用。
現在、UnityとC#を用いて業務用スマホアプリを開発中。

コメント

コメントする

目次