##完成イメージ
このような感じで、単純にオブジェクトをドラッグ操作で動かしたかったので色々調べて実装してみました。
が、私はまだUnityに浅いので完璧なものではない旨をご了承ください。内容的には初心者向けのものとなっています。
私の需要は満たせているので、とりあえず公開します。
##実際のスクリプト
このスクリプトを、動かしたいオブジェクトに付加すればとりあえず動かせると思います。
注意:対象のオブジェクトにはBox Collider 2DとRigidbody 2Dの各コンポーネントを付加していて、Rigidbody 2DのBody TypeをDynamicからKinematicに変更していることを前提とします。
using System.Collections;
using UnityEngine;
public class ObjectDragTransform : MonoBehaviour
{
//オブジェクトをクリックしてドラッグ状態にある間呼び出される関数(Unityのマウスイベント)
void OnMouseDrag()
{
//マウスカーソル及びオブジェクトのスクリーン座標を取得
Vector3 objectScreenPoint =
new Vector3(Input.mousePosition.x,Input.mousePosition.y,10);
//スクリーン座標をワールド座標に変換
Vector3 objectWorldPoint = Camera.main.ScreenToWorldPoint(objectScreenPoint);
//オブジェクトの座標を変更する
transform.position = objectWorldPoint;
}
}
####スクリプトの解説
スクリプトの流れを言葉で簡単に説明すると、「オブジェクトをクリックしている間マウスカーソルのxy座標をオブジェクトの座標にします」という感じでしょうか。
途中でスクリーン座標だのワールド座標だの変換だのと難しそうなところがあります。
私も完全に理解したわけではないのですが、要するに、オブジェクトのワールド座標を保持するtransform.positionに対してマウスカーソルのxy座標と適当なz座標(スクリーン座標)をワールド座標として格納すれば、上記のgifのようにドラッグ操作しているように見えるという仕組みです。
マウスカーソルのxy座標と適当なz座標はスクリーン座標と呼ばれる座標なので、これをワールド座標を示すtransform.positionに直接格納することができない、そのために変換を行っています。
間違っていたらご指摘いただけると幸いです。
#####蛇足ですが
複数のオブジェクトに本スクリプトを付加することで、複数オブジェクトのドラッグ操作も可能です。
####懸念点
オブジェクトのz座標を定数で固定化するのはあまりよろしくないと思われます。2D視点だと基本的にオブジェクトのz座標がマイナスになったら画面から消えてしまうので、そういった不具合の原因になりかねません。私が実現したいアプリケーションにおいては問題ないので定数として適当に10と入力しています。
参考サイト欄にtransform.positionからオブジェクトのz座標を取得する方法を採用されている方のページを記していますので、心配な方はそちらをチェックしていただきたく思います。
##参考サイト
【Unity C#】マウスをドラッグしてオブジェクトを動かす
Unityでオブジェクトをドラッグ&ドロップにあわせて動かす(2D)