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を利用ですね。