Unityで簡単なドラッグ&ドロップを実装してみます。「マウスでオブジェクトを選択」、「好きな場所に移動」と言う感じですね。
はじめに
Unityのバージョンは2021.3.14f1です。OnMouseDragを利用して簡単に実装してみます。
実装開始
出来るだけ簡単な感じで実装してみます。
オブジェクトの作成
まずは動かすオブジェクトを作成、「2D Object」→「Sprites」→「Square」を追加します。

「Add Component」から「Box Collider 2D」を追加します。

スクリプトを作成
「Create」→「C# Script」を選択、スクリプト名はDaDとしておきます。

スクリプトの中身を下記に変更します。
using UnityEngine;
public class DaD : MonoBehaviour
{
[SerializeField] Camera _cam;
private void OnMouseDrag()
{
transform.position = (Vector2)_cam.ScreenToWorldPoint(Input.mousePosition);
}
}
オブジェクトをマウスの位置に合わせて移動する感じですね。ものすごく簡単です。ちなみに座標位置はVector2に変換しないとZ座標がデフォルトの-10になり、オブジェクトが無くなったように見えてしまいます。
スクリプトをアタッチして、パラメータにカメラをセット。

下記のような感じでドラッグ&ドロップでオブジェクトを動かすことが出来ます。

座標ズレの修正スクリプト
上記のスクリプトの場合、オブジェクトの端を選択すると、マウスの中心位置にオブジェクトが移動します。それをしたくない場合、選択した時のマウス位置を取得して補正を加えて移動させます。下記のような感じですね。
using UnityEngine;
public class DaD : MonoBehaviour
{
[SerializeField] Camera _cam;
private Vector3 offset;
private void OnMouseDown()
{
offset = gameObject.transform.position - GetMousePos();
}
private void OnMouseDrag()
{
transform.position = GetMousePos + offset;
}
private Vector3 GetMousePos()
{
return _cam.ScreenToWorldPoint(Input.mousePosition);
}
}
簡単な方法の一例と言う感じ。uGUIを利用しているときは、IDragHandlerを利用ですね。