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を使って無事ドラッグすることできました。
まとめ
特徴を簡易的にまとめると、以下のようになります。
OnMouseDrag | IDragHandler | |
3D or 2D | 3D、2D両方◎ | 2D専用 |
継承するもの | MonoBehaviour | MonoBehaviour, IDragHandler |
必要なコンポーネント | Collider | Graphic RaycasterとEventSystem |
<参考>
■サポートされているUnityイベント
■What’s the difference between MonoBehavior OnMouseDrag and IDragHandler OnDrag
コメント